Memory_get_peak_usage() с "реальным использованием"

Если аргумент real_usage установлен в true, PHP DOCS заявляет, что он получит реальный размер памяти, выделенной из системы. Если он false, он получит память, сообщенную emalloc()

Какой из этих двух параметров возвращает max. памяти, выделенной относительно предельного значения памяти в php.ini?

Я хочу знать, насколько близок script к этому пределу.

Ответ 1

Хорошо, проверим это, используя простой script:

ini_set('memory_limit', '1M');
$x = '';
while(true) {
  echo "not real: ".(memory_get_peak_usage(false)/1024/1024)." MiB\n";
  echo "real: ".(memory_get_peak_usage(true)/1024/1024)." MiB\n\n";
  $x .= str_repeat(' ', 1024*25); //store 25kb more to string
}

Вывод:

not real: 0.73469543457031 MiB
real: 0.75 MiB

not real: 0.75910949707031 MiB
real: 1 MiB

...

not real: 0.95442199707031 MiB
real: 1 MiB

not real: 0.97883605957031 MiB
real: 1 MiB

PHP Fatal error:  Allowed memory size of 1048576 bytes exhausted (tried to allocate 793601 bytes) in /home/niko/test.php on line 7

Похоже, что реальное использование - это память, выделенная из системы, которая, по-видимому, распределяется в больших ведрах, чем требуется в script. (Я думаю, по соображениям производительности). Это также память, которую использует процесс php.

Использование $real_usage = false - это использование памяти, которое вы фактически использовали в script, а не фактический объем памяти, выделяемый менеджером памяти Zend.

Прочтите этот вопрос для получения дополнительной информации.

Вкратце: чтобы узнать, насколько вы близки к пределу памяти, используйте $real_usage = true

Ответ 2

Вступление

Вы должны использовать memory_get_usage(false) потому что вы хотите, чтобы использовалась память, а не выделенная память.

Какая разница

Ваша Google Mail могла бы выделить для вас 25MB памяти, но это не значит, что вы использовали ее в данный момент.

Это именно то, что говорил PHP-док

Установите значение TRUE, чтобы получить реальный размер памяти, выделенной из системы. Если не установлено или FALSE, то сообщается только о памяти, используемой emalloc().

Оба аргумента будут возвращать память, выделенную относительно предела памяти, но главное отличие:

memory_get_usage(false) дает память, используемую emalloc() тогда как memory_get_usage(true) возвращает веху, которая может быть продемонстрирована здесь Memory Mile Store

Я хочу знать, насколько близко был сценарий для достижения этого предела.

Это займет немного математики и может работать только в циклах или конкретных случаях использования. Почему я так сказал?

Представить

ini_set('memory_limit', '1M');
$data = str_repeat(' ', 1024 * 1024);

The above script would fail before you even get the chance to start start checking memory.

Насколько я знаю, единственный способ проверить память, используемую для переменной или определенного раздела PHP:

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

См. Пояснение, но если вы находитесь в цикле или рекурсивной функции, вы можете использовать максимальное использование памяти для безопасной оценки того, когда будет достигнут просмотр памяти.

пример

ini_set('memory_limit', '1M');

$memoryAvailable = filter_var(ini_get("memory_limit"), FILTER_SANITIZE_NUMBER_INT);
$memoryAvailable = $memoryAvailable * 1024 * 1024;

$peekPoint = 90; // 90%

$memoryStart = memory_get_peak_usage(false);
$memoryDiff = 0;

// Some stats
$stat = array(
        "HIGHEST_MEMORY" => 0,
        "HIGHEST_DIFF" => 0,
        "PERCENTAGE_BREAK" => 0,
        "AVERAGE" => array(),
        "LOOPS" => 0
);

$data = "";
$i = 0;
while ( true ) {
    $i ++;

    // Get used memory
    $memoryUsed = memory_get_peak_usage(false);

    // Get Diffrence
    $memoryDiff = $memoryUsed - $memoryStart;

    // Start memory Usage again
    $memoryStart = memory_get_peak_usage(false);

    // Gather some stats
    $stat['HIGHEST_MEMORY'] = $memoryUsed > $stat['HIGHEST_MEMORY'] ? $memoryUsed : $stat['HIGHEST_MEMORY'];
    $stat['HIGHEST_DIFF'] = $memoryDiff > $stat['HIGHEST_DIFF'] ? $memoryDiff : $stat['HIGHEST_DIFF'];
    $stat['AVERAGE'][] = $memoryDiff;
    $stat['LOOPS'] ++;
    $percentage = (($memoryUsed + $stat['HIGHEST_DIFF']) / $memoryAvailable) * 100;

    // var_dump($percentage, $memoryDiff);

    // Stop your scipt
    if ($percentage > $peekPoint) {

        print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
        $stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
        $stat = array_map(function ($v) {
            return sprintf("%0.2f", $v / (1024 * 1024));
        }, $stat);
        $stat['LOOPS'] = $i;
        $stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
        echo json_encode($stat, 128);
        break;
    }

    $data .= str_repeat(' ', 1024 * 25); // 1kb every time
}

Выход

Stoped at: 95.86%
{
    "HIGHEST_MEMORY": "0.71",
    "HIGHEST_DIFF": "0.24",
    "PERCENTAGE_BREAK": "95.86%",
    "AVERAGE": "0.04",
    "LOOPS": 11
}

Live Demo

Это может все еще потерпеть неудачу

Это может произойти сбой, потому что после того, как if ($percentage > $peekPoint) { это все еще добавить, чтобы сделать дополнительную задачу с также потребляет память

        print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
        $stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
        $stat = array_map(function ($v) {
            return sprintf("%0.2f", $v / (1024 * 1024));
        }, $stat);
        $stat['LOOPS'] = $i;
        $stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
        echo json_encode($stat, 128);
        break;

If the memory to process this request is grater than the memory available the script would fail.

Заключение

Его не идеальное решение, но проверить память на интервал, и если его превысить заглядывать (например, 90%) exit мгновенно и оставить модные вещи

Ответ 3

real_usage false сообщает об использовании вашего script. Это будет более точное из двух.

real_usage true сообщает память, выделенную для вашего script. Это будет больше из двух.

Я бы использовал true, если бы я пытался сравнивать, так как ваш script никогда не будет выделяться больше, чем ограничение памяти, и будет продолжать работать до тех пор, пока он (плюс все остальные скрипты) не будет превышают это использование.

Ответ 4

в соответствии с PHP memory_get_usage

real_usage

Установите для этого значение ИСТИНА, чтобы получить общую память, выделенную из системы, включая неиспользуемые страницы. Если не установлено или FALSE, сообщается только используемая память.

поэтому для получения памяти, используемой вашим script, вы должны использовать memory_get_usage(), поскольку по умолчанию real_usage является ложным.

если вы хотите получить память, выделенную системой, но все равно, сколько было использовано, используйте memory_get_usage (true);

Ответ 5

<!-- Print CPU memory and load -->
<?php
$output = shell_exec('free');
$data = substr($output,111,19);
echo $data;
echo file_get_contents('/proc/loadavg');
$load = sys_getloadavg();
$res = implode("",$load);
echo $res;
?>