Сведения об использовании CPU
Для этого мы будем пользоваться функцией getrusage(). Помните о том, что она недоступна на платформе Windows.
01.print_r(getrusage());02./* prints03.Array04.(05.[ru_oublock] => 006.[ru_inblock] => 007.[ru_msgsnd] => 208.[ru_msgrcv] => 309.[ru_maxrss] => 1269210.[ru_ixrss] => 76411.[ru_idrss] => 386412.[ru_minflt] => 9413.[ru_majflt] => 014.[ru_nsignals] => 115.[ru_nvcsw] => 6716.[ru_nivcsw] => 417.[ru_nswap] => 018.[ru_utime.tv_usec] => 019.[ru_utime.tv_sec] => 020.[ru_stime.tv_usec] => 626921.[ru_stime.tv_sec] => 022.)23.24.*/Может выглядеть таинственно, пока у вас не будет навыков в администрировании системы. Вот объяснение каждого значения (учить это наизусть не нужно):
ru_oublock: количество операций блочной записи
ru_inblock: количество операций блочного чтения
ru_msgsnd: количество отправленных сообщений
ru_msgrcv: количество принятых сообщений
ru_maxrss: максимальный размер невыгружаемого набора
ru_ixrss: общий объем разделяемой памяти
ru_idrss: общий объем неразделяемых данных
ru_minflt: количество используемых страниц памяти
ru_majflt: количество ошибок отсутствия страниц
ru_nsignals: количество принятых сигналов
ru_nvcsw: количество переключений контекста процессом
ru_nivcsw: количество принудительных переключений контекста
ru_nswap: количество обращений к диску при подкачке страниц
ru_utime.tv_usec: время работы в пользовательском режиме (микросекунды)
ru_utime.tv_sec: время работы в пользовательском режиме (секунды)
ru_stime.tv_usec: время работы в привилегированном режиме (микросекунды)
ru_stime.tv_sec: время работы в привилегированном режиме (секунды)
Чтобы узнать, какие ресурсы CPU потребляет скрипт, нам нужно посмотреть на значения ‘user time’ (время работы в пользовательском режиме) и ‘system time’ (время работы в привилегированном режиме). По умолчанию величины секунд и миллисекунд представляются раздельно. Таким образом, вы можете разделить значение микросекунд на 1 миллион и добавить к значению секунд, чтобы вычислить общее количество секунд как десятичное число.
Рассмотрим пример:
01.// sleep for 3 seconds (non-busy)02.sleep(3);03.04.$data = getrusage();05.echo "User time: ".06.($data['ru_utime.tv_sec'] +07.$data['ru_utime.tv_usec'] / 1000000);08.echo "System time: ".09.($data['ru_stime.tv_sec'] +10.$data['ru_stime.tv_usec'] / 1000000);11.12./* prints13.User time: 0.01155214.System time: 015.*/Хотя выполнение скрипта заняло примерно 3 секунды, использование CPU было очень-очень низким. Это происходит потому, что во время ожидания (sleep) скрипт фактически не потребляет ресурсов CPU. Существует множество других задач, которые могут занять реальное время, но при этом не использовать время CPU, например ожидание дисковой операции. Так что, как вы видите, использование CPU и действительная длительность времени исполнения – не всегда одно и то же.
Вот другой пример:
01.// loop 10 million times (busy)02.for($i=0;$i<10000000;$i++) {03.04.}05.06.$data = getrusage();07.echo "User time: ".08.($data['ru_utime.tv_sec'] +09.$data['ru_utime.tv_usec'] / 1000000);10.echo "System time: ".11.($data['ru_stime.tv_sec'] +12.$data['ru_stime.tv_usec'] / 1000000);13.14./* prints15.User time: 1.42459216.System time: 0.00420417.*/Этот скрипт использовал примерно 1,4 секунды времени CPU, и почти все время в пользовательском режиме, так как системных вызовов не было.
Время работы в привилегированном режиме (System Time) – это количество времени, которое CPU тратит на выполнение системных запросов к ядру от имени программы. Вот пример этого:
01.$start = microtime(true);02.// keep calling microtime for about 3 seconds03.while(microtime(true) - $start < 3) {04.05.}06.07.$data = getrusage();08.echo "User time: ".09.($data['ru_utime.tv_sec'] +10.$data['ru_utime.tv_usec'] / 1000000);11.echo "System time: ".12.($data['ru_stime.tv_sec'] +13.$data['ru_stime.tv_usec'] / 1000000);14.15./* prints16.User time: 1.08817117.System time: 1.67531518.*/Теперь у нас используется довольно много времени привилегированного режима. Это происходит по тому, что скрипт много раз вызывает функцию microtime(), которая, чтобы получить данные о времени, выполняет запросы к ядру операционной системы.
Еще вы можете заметить, что цифры соответствуют 3 секундам неточно. Это потому что на сервере также, возможно, выполнялись и другие процессы, так что скрипт не использовал 100% CPU в течение всех 3 секунд.