Получить процент использования процессора в php
Я хочу показать процент использования процессора в PHP. Не важно, если получить значения cron в shell > output to file > parse в PHP или непосредственно получить значение в php. Я пробую много решений, найденных в интернете, но ничего не было полезно. При средней нагрузке я не могу отображать графическую панель 0-100%, а функции, которые я нашел для процентного вывода, дают мне плохие значения или только значение для первого ядра. Было бы неплохо получить количество процентного использования для каждого ядра. Есть ли решение для это?
изменить:
Я принять временное решение, оно работает хорошо, но это не лучший способ.
задание cron каждую минуту запускает PHP-скрипт, который выполняет команду для grep cpu info из " top " и сохраняет ее в файл, на конце сценария подождите 3 секунды и цикл 20 раз (способ получить обновление каждые 3 секунды) скрипт на PHP:
<?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 - это только временное решение и не лучший способ. Деймон будет намного лучше.
5 ответов
после поиска на форумах и попытки многих методов, Наиболее точным является следующее:
$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);
?>
предоставленный код был ответом от Черти Ребенок для аналогичного вопроса: 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" для получения процента процессора. эта команда выполняется только один раз, потом дает выход. я думаю, что вы можете сделать часть разбора самостоятельно.
ответ Диизмом, а также предложение о http://php.net/manual/en/function.sys-getloadavg.php похоже, не работал на CentOS 6.5 VPS. Мы должны были измениться physical id
to 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;
?>
Так если загрузка avg [0] была 0.50 на 2-ядерном компьютере, это отобразило бы загрузку процессора 25%