Я хочу показать процентное использование процессора в PHP. Не важно, если получить значения cron в shell> output to file> parse в PHP или напрямую получить значение в php. Я пытаюсь найти множество решений в Интернете, но ничего не было полезно. При средней нагрузке я не могу отображать графическую панель 0-100% и функции, которые я нашел для процентного вывода, дают мне плохие значения или только значение для первого ядра. Было бы неплохо получить количество процентных значений для каждого ядра. Есть ли решение для этого?
РЕДАКТИРОВАТЬ:
Я делаю временное решение, он работает хорошо, но это не лучший способ.
cron job каждую минуту запускает php-скрипт, который выполняет команду для grep cpu info с «top» и сохраняет его в файл, на конце скрипт ждет 3 секунды и цикл 20 раз (способ получить обновление каждые 3 секунды) php script:
<?php for($i=0; $i<=20; $i++) { //cpu load exec("top -b -n 1 | grep 'Cpu(s):' > /some/file.cpu"); //ram usage exec("top -b -n 1 | grep 'Mem:' > /some/file.ram"); //wait 3sec sleep(3); } ?>
и теперь из этих файлов я могу разобрать информацию.
Новый вопрос заключается в том, как заставить скрипт демона запускать эти команды каждые 3 секунды. Я думаю, что решение с php-скриптом и cron является лишь временным решением и не лучшим образом. демон будет намного лучше.
после поиска на форумах и много методов, лучше всего это:
$stat1 = file('/proc/stat'); sleep(1); $stat2 = file('/proc/stat'); $info1 = explode(" ", preg_replace("!cpu +!", "", $stat1[0])); $info2 = explode(" ", preg_replace("!cpu +!", "", $stat2[0])); $dif = array(); $dif['user'] = $info2[0] - $info1[0]; $dif['nice'] = $info2[1] - $info1[1]; $dif['sys'] = $info2[2] - $info1[2]; $dif['idle'] = $info2[3] - $info1[3]; $total = array_sum($dif); $cpu = array(); foreach($dif as $x=>$y) $cpu[$x] = round($y / $total * 100, 1);
теперь статистика находится в $ cpu ['user'], $ cpu ['nice'], $ cpu ['sys'], $ cpu ['idle']
Я не уверен на 100%, что вы просите, но если я прав, этот ответ может вам помочь:
<?php exec('ps -aux', $processes); foreach($processes as $process) { $cols = split(' ', ereg_replace(' +', ' ', $process)); if (strpos($cols[2], '.') > -1) { $cpuUsage += floatval($cols[2]); } } print($cpuUsage); ?>
Предоставленный код был ответом от Devils Child по аналогичному вопросу: https://stackoverflow.com/a/9846219/904242
Использовать это:
<?php $loads=sys_getloadavg(); $core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l")); $load=$loads[0]/$core_nums; echo $load; ?>
вы можете использовать «top -n 1» для получения процента процессора. эта команда запускает вершину только один раз, а затем выводит результат. Я думаю, что вы можете сделать парсинг самостоятельно.
Ответ Diyism, а также предложение по http://php.net/manual/en/function.sys-getloadavg.php , похоже, не работали на CentOS 6.5 VPS. Нам пришлось изменить physical id
на processor
. Затем он возвращает одно ядро как ID 0, поэтому для вычисления нужны +1 ядра. Кроме того, вам нужно умножить на 100, чтобы получить процентиль. Наконец, это нужно округлить для приятных процентов. Итак, вот альтернативная мысль, которая может работать, если вы столкнетесь с этим:
<?php $loads = sys_getloadavg(); $core_nums = trim(shell_exec("grep -P '^processor' /proc/cpuinfo|wc -l")); $load = round($loads[0]/($core_nums + 1)*100, 2); echo $load; ?>
Поэтому, если load avg [0] равен 0,50 на двухъядерном компьютере, это отображает нагрузку процессора 25%