• Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    roxblnfk, Спасибо большое за ответ! Я для себя принял решение использовать связку nginx + Apache MPM-prefork))). При аналогичных тестах prefork роста памяти у меня почти нет (это при большом кол-ве заданных MinSpareServers (аналог pm.max_children в static режиме)). Может быть и более медленное решение, но для меня оно оказалось более стабильным)
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Vitsliputsli, На текущем тестовом сервере 4Gb оперативки. Тестирую исключительно эту проблему)

    Кстати, нас счёт общего использования памяти процессами php-fpm.

    Как уже было отмечено в комментариях( nokimaro ), на постоянное потребление памяти каждого процесса будут влиять и подключенные модули.

    Я бы особо отметил функцию get_browser();

    Для её работы, необходимо в php.ini указать файл (текстовую базу)
    browscap = extra/ (browscap.ini)

    Стандартный размер файла - 17 Мб, full - 108 Мб, lite 1Мб)

    Даже если вы не используете эту функцию, то к каждому процессу будет добавляться к примеру + 108Мб оперативки (при full)), или 17 при стандарте.

    Естественно, это не является утечкой. И опять же, это будет проблемой только при n- кол-ве процессов (как в Apache, так и в php-fmp).

    Если говорить про другие модули, прям про утечки, по моему в статьях встречал модули memcached, opcache (советуют отключить и попробовать без них).

    И конечно, особо выделяется анализ самого кода и алгоритмов (спасибо Дмитрий )...
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Vitsliputsli, Спасибо за предположение, но общего суммарного лимита на php-fpm нет, это точно (в php-fpm надо рассчитывать и указывать кол-во процессов, но общих лимитов памяти на процессы нет). Это можно увидеть на скриншоте. Продублирую. 6430796d69e31805128384.png
    Суммарно по процессам видно что там более 1Гб, скрипт естественно отработан. (Вот все эти процессы ни куда не уйдут, они так и повиснут)
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Спасибо за ответ.

    В комментариях уже была разобрана ситуацию когда сервер становится недоступным из-за нехватки памяти. Я указываю 1 Гб как пиковое значение, и не вижу в этом проблемы, и проблемы нет когда у Вас 1 процесс. А вот если их будет 500 и каждый начнет вот так "резервировать по 18%", то уже будет не важно 1 гб или 128 мб.... памяти стоит в лимите.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Спасибо за комментарии!

    ps aux | grep fpm

    [root@centos-standard-2-4-10gb ~]# ps aux | grep fpm                                                                                                  
    root      2708  0.0  0.2 208348  8732 ?        Ss   10:44   0:00 php-fpm: master process (/opt/php73/etc/php-fpm.conf)
    www-root  2709  0.6  4.8 390620 188216 ?       S    10:44   0:00 php-fpm: pool 213.219.212.93
    www-root  2710  0.6  4.8 390620 188216 ?       S    10:44   0:00 php-fpm: pool 213.219.212.93
    www-root  2711  0.6  4.8 390620 188216 ?       S    10:44   0:00 php-fpm: pool 213.219.212.93
    www-root  2712  0.6  4.8 390620 188220 ?       S    10:44   0:00 php-fpm: pool 213.219.212.93
    www-root  2713  0.6  4.8 390620 188220 ?       S    10:44   0:00 php-fpm: pool 213.219.212.93
    root      2766  0.0  0.0 112808   972 pts/1    S+   10:44   0:00 grep --color=auto fpm


    php -m

    [root@centos-standard-2-4-10gb ~]# /opt/php73/bin/php-cgi -m                                                                                          
    [PHP Modules]                                                                                                                                         
    bz2                                                                                                                                                   
    calendar                                                                                                                                              
    cgi-fcgi                                                                                                                                              
    Core                                                                                                                                                  
    ctype                                                                                                                                                 
    date                                                                                                                                                  
    exif                                                                                                                                                  
    fileinfo                                                                                                                                              
    filter                                                                                                                                                
    ftp                                                                                                                                                   
    gettext                                                                                                                                               
    gmp                                                                                                                                                   
    hash                                                                                                                                                  
    iconv                                                                                                                                                 
    libxml                                                                                                                                                
    openssl                                                                                                                                               
    pcntl                                                                                                                                                 
    pcre                                                                                                                                                  
    Phar                                                                                                                                                  
    readline                                                                                                                                              
    Reflection                                                                                                                                            
    session                                                                                                                                               
    shmop                                                                                                                                                 
    SimpleXML                                                                                                                                             
    sockets                                                                                                                                               
    SPL                                                                                                                                                   
    sqlite3                                                                                                                                               
    standard                                                                                                                                              
    tokenizer                                                                                                                                             
    xml                                                                                                                                                   
    zlib


    Чуть выше Дмитрий, предложил выполнить код прям из консоли. По результату утечки нет. Дело наверное именно в php-fpm.

    По поводу pm.max_requests, да, если выставить значение 1 утечка пропадает вообще), и проблема как бы решается перезапуском) Но она заново создает процесс, что тоже за зря теряются ресурсы и время ожидания. Тут хотелось бы понять сам корень проблемы.. Вроде вот обычный массив.

    Проблема когда на сервере будет не 5, а 100/500 php-fpm готовых к принятию запросов (рассчитанных именно на пиковые нагрузки). Даже не в пик они будут потреблять больше памяти чем им нужно. Часто в системах формируются отчеты, статистика, формирование файлов, которые как таковой нагрузки на систему особо и не дают (может быть на очень очень короткое время). Но при этом, много память зависнет в каком нибудь n - php-fpm процессе.. до его следующего использования. В чем предполагаемая фишка, к примеру, одновременно зашло 500 человек, эта пиковая нагрузка будет распределена сразу между 500 php-fpm без очередей или создания дополнительных процессов. По идее они должны отработать и все за собой подчистить... и быть готовы к следующему наплыву.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Я честно говоря пока не совсем понял как через консоль запустить именно php-fpm. Проверил также php-cgi, также через консоль утечки там тоже нет. И в апаче, через мод.пхп тоже утечки нет.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Я попробовал сделать поменьше цикл, с ~20 мб за минуту выросло до ~70 мб по каждому PID процессу, просто через f5.. Ну и да, когда сервер простаивает, памятью он не пользуется, но занимает, всё так.

    Прям снижение идёт, если после начинаю запускать легкие скрипты, которые вообще почти не используют память. Но и то постепенно, не за одну итерацию.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, если я правильно все сделал, то
    запускаю пхп
    /opt/php73/bin/php -a

    ну и побежало

    php > while(true){    $data = array(); for($i = 0; $i<2000000; $i++) {     $data[] = array(         'id' => $i         ); }    var_dump(memory_get_usa
    ge(true));    unset($data);    var_dump(memory_get_usage(true)); }
    nt(822087680)                                                                                                                                        
    int(754974720)                                                                                                                                        
    int(822087680)                                                                                                                                        
    int(754974720)                                                                                                                                        
    int(822087680)                                                                                                                                        
    int(754974720)                                                                                                                                        
    int(822087680)                                                                                                                                        
    int(754974720)                                                                                                                                        
    int(822087680)                                                                                                                                        
    int(754974720)                                                                                                                                        
    int(824184832)                                                                                                                                        
    int(757071872)                                                                                                                                        
    int(824184832)


    по процессу память не растет, держится стабильно
    642dc492037f1133790060.png
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Я попробовал сделать поменьше цикл, с ~20 мб за минуту выросло до ~70 мб по каждому PID процессу, просто через f5, может и не упадет конечно, но память кушает...
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Готово, вот это выдало:
    int(2097152) int(822087680) int(754974720) , но в процессах ничего не поменялось, также сразу же и забиваются
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, поправил)
    $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
    
    unset($data);
    
    gc_collect_cycles();

    К сожалению, результат такой же...
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий,

    $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
    gc_collect_cycles();

    Так тоже самое
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Да, провел тест, единственное надо увеличить кол-во разрешенных процессов через pm.max_children, ну и буквально пару секунд f5 (забиваются все процессы) и все легло)642db0b2d0ff0593666303.png
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Да, но разве после выполнения скрипта у php не должно запускаться что-то волшебное и все подчищать?))) В рамках этого примера, я поставил unset($data); - не помогает) = Apache + php-fmp попробую, напишу позже по результату. Спасибо.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Спасибо большое за ответ. В дискуссии говорилось именно вот про совсем свежие версии 8.1 и 8.2, тестировал и указанную 8.0 версию (на которой было все стабильно). К сожалению, там результат у меня был такой же (опять же именно с этим тестовым скриптом, как оказывается не в каждом алгоритме есть утечки). Проблемы не наблюдалось только в 5х версиях, во всех..
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Отвалится, если кол-во процессов не отрегулировано и разрешено к примеру создание 15 процессов в любом из режимов) Оперативки уже не будет хватать и все. В режиме - static это прям будет печаль. процессы вообще не завершаться и сайт будет лежать.

    Это будет быстро, на 15ый рефреш страницы) Опять же, в рамках этого тестового скрипта и этого тестового сервера.
  • Почему возникает утечка памяти в php-fmp?

    @ligaliga Автор вопроса
    Дмитрий, Спасибо за комментарий. Без die результат тестового скрипта получается таким же. Но Вы правы что разные алгоритмы могут не влиять на эту утечку, к примеру вызов range(0, 30000000); утечки не вызывает (хотя потребляет огого), а вот вывод в браузер большого куска текста(генерируемого пхп), уже результат такой же. На стандартных настройках fpm и с этим примером, происходит тоже самое. Я в целом и старался сохранить стандартные настройки... Почему Вы сразу обратили внимание что пример не удачный?
  • Как отследить изменение текста поля ввода?

    @ligaliga
    Нашел статью: danielfriesen.name/blog/2010/02/16/html5-browser-m..., от 2010 года!) Где уже обсуждали это событие) Ослик догнал лишь в 9 версии...

    Firefox 2 through 3.5 has support for oninput, Only test method C works to detect support.
    Chrome supports oninput. Test method A works to detect support.
    Opera 10 supports oninput and additionally onforminput, however it violates spec by firing an additional oninput when the onchange event is fired when the value is the same as the last user input (ie: if you type asdf you get events for "a", "as", "asd", "adsf", and an unwanted extra event for "asdf" when you blur the input). Test method A works to detect support.
    IE7 and IE8 don't support oninput. It's unknown if IE9 does. (Update 2011-05-11: Going by comments on Zoltan Hawryluk's post linked to in the comments IE9 does support oninput)