#php #linux #сервер #веб_сервер #memory
Проблема собственно вот в чем: мои скрипты php после отработки засоряют оперативную память сервера,но не все конечно. Системный администратор после изучения этой темы говорит что память засоряется после моих скриптов и они являются активными процессами( как я понял спящими по букве S) Я прекрасно понимаю, что вы не волшебники и не можете проинтуичить без выкладки кода, но может кто то сталкивался с подобными проблемами. Хотелось бы понять алгоритм нахождения ответа. Может он заключается в том чтобы прозвонить код на количество резервируемой под него памяти, найти самый прожорливый участок и оптимизировать его. Даже если это будет выполнено, памяти будет жрать меньше, но причина похоже не в этом. Может необходимо найти конфигурационный файл сервера и обратить внимание на конкретные строки параметров? В зависимости от ситуации я добавлю сюда необходимую информацию Или может добавлять какуюто строку кода в php скрипт чтобы сервер убивал соединение? Да кстати в циклах использую break; Также использовал ini_set('memory_limit', '1024M'); Но после закоменчивания этой строки изменений не было. Или может жестко поступить - найти все переменные и сделать unset($some_param); Откуда начинать копать? Статьи по оптимизации кода читал, применяю их на практике, но как известно в этом направлении можно далеко уйти и писать на Ассемблере Добавлено минутой позже: Также использую в коде exit(); в том случае если код не имеет смысла дальше выполнять - или вместо него необходимо использовать die(); Добавлено 5 минутами позже: Это веб сервер. Пользователь загружает фаил эксель для парсинга и получается вышеописанное NGINX 1.6.2 PHP5-FPM без APACHE 5.6 PHP версия Добавлено через 9 часов: на форуме говорится о команде strace -pкоторая показывает что хочет выполнить процесс в нашем случае PID 10354. Это конечно не ответ на вопрос, но может поспособствовать его решению. На ресурсе сказано что данный режим может быть вызван недостатком мощностей процессора(но по сути какой бы мощный процессор не был, нагрузить его на 100% можно), также сказано что такое поведение наблюдается когда в коде php есть команда sleep($count_of_seconds); Да - данная команда ввергает процесс в состояние Sleep, но здесь нет зависимости от количества потребляемой памяти. Как мне объяснил системный администратор - сколько пользователей на сайте, столько будет спящих www-data, следовательно состояние sleep вполне нормально, ненормально количество удерживаемой для этого процесса памяти. Добавлено 22,02,2017 Вот что происходит когда остаются 3 спящих процесса
Ответы
Ответ 1
Моя история похожа. Конфигурация: nginx+php-fpm Тяжелый запрос на бекенде и при заходе на него 3-5 раз подряд, память забивалась и вылетала ошибка: 502 bad gateway При этом память сама не отчищалась. Мой конфиг до проблемы: pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 25 pm.max_requests = 500 Конфиг после: pm = dynamic pm.max_children = 10 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 5 pm.max_requests = 500 Попробуйте так.Ответ 2
Считаю 374 мегабайта RES совершенно нормальным значением для php-fpm. То есть, на мой взгляд, у вас проблема совершенно не в вашем коде, а либо в использовании PHP как такового, либо просто в неадекватной задачам конфигурации сервера (мало RAM для запущенного набора процессов).Ответ 3
Тут оказывается не только дело в скриптах но и в настройках php-fpm а именно надо поиграться с настройками /etc/php5/fpm/pool.d/www.conf а именно pm.max_requests request_terminate_timeout request_terminate_timeout устанавливает максимальное время выполнения дочернего процесса, прежде чем он будет уничтожен. Это позволяет избегать долгих запросов, если по какой-либо причине было изменено значение max_execution_time в настройках интерпретатора. Значение стоит установить исходя из логики обрабатываемых приложений, скажем 60s (1 минута).
Комментариев нет:
Отправить комментарий