PHP сборщик мусора статистика - PullRequest
4 голосов
/ 23 февраля 2012

Я делаю некоторые тесты памяти PHP и хочу получить статические данные сборщика мусора.

Я следовал этому руководству в официальном документе: http://www.php.net/manual/en/features.gc.performance-considerations.php

Я воспроизвел точную процедуру, которая описана, перекомпилировав PHP с этой переменной среды CFLAGS:

export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make
make install

Я сделал это с PHP 5.3.9: http://fr.php.net/get/php-5.3.9.tar.bz2/from/a/mirror на Debian Squeeze 6.0.4 64bit.

Затем я попытался выполнить в командной строке пример сценария, который они предоставляют php gc.php:

<?php
class Foo
{
    public $var = '3.1415962654';
}

for ( $i = 0; $i <= 1000000; $i++ )
{
    $a = new Foo;
    $a->self = $a;
}

echo memory_get_peak_usage(), "\n";
?>

Как они сказали, это должно отобразить в конце скрипта дополнительные статистические данные gc, например:

GC Statistics
-------------
Runs:               110
Collected:          2072204
Root buffer length: 0
Root buffer peak:   10000

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL   7175487   1491291    1241690   3611871
ZOBJ  28506264   1527980     677581   1025731

На самом деле статистика gc не отображается. Похоже, что компиляция PHP с этим CFLAGS ничего не сделала.

Я что-то пропустил?

1 Ответ

3 голосов
/ 23 февраля 2012

Я собираюсь предположить, что я не подтвердил это, но, прочитав текст по предоставленной вами ссылке GC, у меня не сложилось впечатление, что memory_get_peak_usage() должен возвращать дополнительную информацию, основанную на компиляции PHP с флагом DGC_BENCH. В руководстве сказано, что оно возвращает int, поэтому я подозреваю, что оно всегда возвращает int.

Что он говорит , однако это:

Когда вы снова запустите приведенный выше пример кода с недавно построенным PHP двоичный, вы увидите следующее после завершения PHP выполнение:

Это не очень понятно, но у меня сложилось впечатление, что дополнительные детали GC будут напечатаны в stdout или stderr, а не возвращены в memory_get_peak_usage() или напечатаны как дополнительный вывод в ваш PHP-скрипт. .

Попробуйте вызвать только что созданный исполняемый файл PHP из командной строки и посмотреть, выводится ли информация GC на консоль после завершения сценария.

Вы можете попробовать назвать его так: /path/to/custom/php testfile.php

Я не уверен, что имеет смысл выводить эту информацию, если вы запускаете PHP как модуль Apache или обработчик FastCGI, поэтому я подозреваю, что вы сможете увидеть его только при вызове скрипта из консоли, но я мог бы совершенно неправильно там.

UPDATE:

Я проверил, что флаг компиляции GC_BENCH все еще активен, и это так.

Zend / zend.c


905 #if GC_BENCH
906     fprintf(stderr, "GC Statistics\n");
907     fprintf(stderr, "-------------\n");
908     fprintf(stderr, "Runs:               %d\n", GC_G(gc_runs));
909     fprintf(stderr, "Collected:          %d\n", GC_G(collected));
910     fprintf(stderr, "Root buffer length: %d\n", GC_G(root_buf_length));
911     fprintf(stderr, "Root buffer peak:   %d\n\n", GC_G(root_buf_peak));
912     fprintf(stderr, "      Possible            Remove from  Marked\n");
913     fprintf(stderr, "        Root    Buffered     buffer     grey\n");
914     fprintf(stderr, "      --------  --------  -----------  ------\n");
915     fprintf(stderr, "ZVAL  %8d  %8d  %9d  %8d\n", GC_G(zval_possible_root), GC_G(zval_buffered), GC_G(zval_remove_from_buffer), GC_G(zval_marked_grey));
916     fprintf(stderr, "ZOBJ  %8d  %8d  %9d  %8d\n", GC_G(zobj_possible_root), GC_G(zobj_buffered), GC_G(zobj_remove_from_buffer), GC_G(zobj_marked_grey));
917 #endif

Затем я скомпилировал PHP 5.3.9 для Apache2 и CLI. Прежде чем принять решение об установке тестовой версии, я запустил новое приложение PHP CLI из консоли:

./sapi/cli/php -v

PHP 5.3.9 (cli) (built: Feb 22 2012 19:03:02) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
GC Statistics
-------------
Runs:               0
Collected:          0
Root buffer length: 0
Root buffer peak:   7

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL        15         7          7         0
ZOBJ         0         0          0         0

Он имеет вывод GC, хотя я не вызывал PHP. Затем я grep'd libphp5.so и увидел, что в нем действительно есть бит статистики GC, поэтому я решил установить его вживую и сделать вызов из Apache. Нет вывода GC в браузере, error_log, access_log или любых других файлах журнала.

Теперь интересная часть , я создал файл test.php, который выводит строку и создает освобождает несколько переменных ...

root@vm:/php539# php test.php
This is a test

root@vm:/php539# php < test.php
This is a test
GC Statistics
-------------
Runs:               0
Collected:          0
Root buffer length: 0
Root buffer peak:   7

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL        16         7          7         0
ZOBJ         0         0          0         0

root@vm:php539# 

Вывод:

Когда PHP скомпилирован с параметром GC_BENCH, у вас не будет доступа к информации о тесте при вызове из браузера или при анализе файлов PHP с помощью параметра -f или при передаче имени файла для анализа. Вы действительно получите информацию о тестах, если вы вызываете php в интерактивном режиме, или выполняете скрипт через PHP, читая его из stdin.

...