Подтвердить что ты не робот

Получить процентное значение процента процессора в php

Я хочу показать процентное использование процессора в PHP. Не важно, если получить значения cron в shell > output to file > parse в PHP или напрямую получить значение в php. Я пытаюсь найти множество решений в Интернете, но ничего не было полезно. При средней нагрузке я не могу отображать графическую панель 0-100% и функции, которые я нашел для процентного вывода, дают мне плохие значения или только значение для первого ядра. Было бы неплохо получить количество процентных значений для каждого ядра. Есть ли решение для этого?

EDIT:

Я делаю временное решение, он работает хорошо, но это не лучший способ.

Задача cron каждые одну минуту запустить PHP скрипт, какая команда exec для grep cpu info из "top" и сохранить ее в файл, в конец script ждать 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);
}
?>

и теперь из этих файлов я могу анализировать информацию.

Новый вопрос - как сделать daemon script для запуска этих команд каждые 3 секунды. Я думаю, что решение с PHP скрипт и cron - это только временное решение, и это не лучший способ. демон будет намного лучше.

4b9b3361

Ответ 1

после поиска на форумах и много методов, лучше всего это:

$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']

Ответ 2

Я не уверен на 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 для аналогичного вопроса: fooobar.com/questions/441165/...

Ответ 3

Используйте это:

<?php
$loads=sys_getloadavg();
$core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l"));
$load=$loads[0]/$core_nums;
echo $load;
?>

Ответ 4

вы можете использовать "top -n 1" для получения процентного отношения к процессору. эта команда запускает вершину только один раз, а затем выводит результат. Я думаю, что вы можете сделать парсинг самостоятельно.

Ответ 5

Ответ на 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%