У нас есть веб-сервер, на котором запущено приложение PHP для обслуживания клиентов.
Поскольку нагрузка на наших клиентов увеличилась, у нас возникли проблемы с памятью сервера. Рано или поздно нам нужно перезапустить службу HTTP, чтобы освободить память (возможно, 5 раз в день).
Мы можем сказать из верхняя что большинство процессов HTTP в порядке, только с использованием небольшой памяти, но есть около 3-4 процессов HTTP, которые занимают 80% памяти и почти нулевое использование ЦП. Похоже на мертвые процессы, но они не освобождают память, пока мы не перезапустим службу HTTP.
Мы подозреваем, что какая-то часть нашего PHP-кода работает некорректно и приводит к огромному использованию памяти, а затем зависает. Есть ли где-нибудь параметр PHP, который мы можем установить, чтобы завершить процесс и освободить память после, скажем, 5 минут простоя? Это краткосрочное решение, нам нужно будет выяснить, какой код это делает, хотя найти его сложно.
Apache имеет MaxRequestsPerChild директива, которая может быть указана на повторное использование рабочих (процессов, которые встраивают mod_php) после обработки определенного количества запросов.
В Linux «кэшированная» память - это свободная память, используемая для кэширования файлов. Linux использует как можно больше памяти для ускорения io с блочными устройствами. Если программам требуется реальная память, Linux освободит страницы кеша перед заменой.
Например, теперь на моем ноутбуке у меня используется 90% памяти, но 0% подкачки. Это потому, что реально используемая память составляет всего 20%.
Вверху вы узнаете, сколько памяти будет размещено в буферах. Если это число велико, это означает, что используемая память предназначена только для кеш-памяти, а не реально используемой памяти. В течение дня вы можете проверить, сколько памяти собираетесь поменять местами (ваша настоящая проблема).
если вы используете команду 'free', у вас будет строка с «- / + buffers / cache» с вашей реальной используемой памятью.
Вы можете прочитать о / proc / sys / vm / swappiness, чтобы контролировать, сколько памяти будет идти для подкачки или кеширования файлов.
В вашем php.ini
файл, который актуален. Один из них - memory_limit, который определяет, сколько оперативной памяти разрешено использовать любому данному php-скрипту, другой - max_execution_time, который определяет, сколько процессорного времени он получает до того, как он будет отключен. Имейте в виду, что это последнее время основано на времени процессора, а не на часах, поэтому, если он не использует какой-либо процессор, он может никогда не сложиться.
Также, как вы отметили, это временные хаки для смягчения некорректного поведения приложения, а не реальное исправление. Вы можете найти strace
полезно, чтобы точно выяснить, чем заняты процессы, занимающие много памяти.