Назад | Перейти на главную страницу

На веб-серверах заканчивается место подкачки, что делать?

У меня есть 2 веб-сервера LAMP, которым постоянно не хватает места для подкачки (см. Прикрепленный верхний снимок экрана).

Настройки Apache следующие:

<IfModule prefork.c>
StartServers       64
MinSpareServers    64
MaxSpareServers    128
ServerLimit        256
MaxClients         256
MaxRequestsPerChild  4096
</IfModule>

Ограничения ресурсов на PHP:

max_execution_time = 30
max_input_time = 30
memory_limit = 80M

Я новичок в подобных вещах администратора сервера (я разработчик); Что я могу настроить, чтобы предотвратить подкачку?

Вот скриншот сверху на одном из серверов при сбое:

У вас заканчивается своп, потому что вы используете всю свою оперативную память, а затем еще немного. У вас серьезная проблема, которую нужно исправить прямо сейчас.

У вас есть два варианта: игнорировать причину и просто добавить больше оперативной памяти или решить проблему, которая действительно жует вашу память.

Добавление оперативной памяти довольно дешево и довольно просто, если это ваш сервер, но это временное решение, а если это VPS или арендованный сервер, это не так дешево. Вместо этого давайте попробуем исправить корневую проблему. Что засасывает столько памяти? Вот несколько советов:

  • Отключите InnoDB (если он вам не нужен) в MySQL
  • Победите Apache (и MySQL) с помощью Палка конфигурации +5
  • Рассмотрим меньший httpd, такой как cherokee, lighttpd или nginx (они очень быстрые и почти не потребляют RAM). Главный недостаток - вы не можете использовать .htaccess файлы, но вы можете жестко запрограммировать их функциональность.
  • Вы используете кеш OP-кода для PHP? Попробуйте выключить его или переключиться на другой, более эффективный.

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

swapoff -a && swapon -a

Но не пытайтесь тогда, когда у вас меньше свободной памяти, чем у вас в свопинге. Это приведет к сбою вашего сервера.

Для быстрого изменения сделайте:

"MaxRequestsPerChild 4096" на что-то вроде: 700 поможет. Чем дольше живет процесс apache, тем больше резидентной памяти он будет потреблять из-за mod_php и т.п. Также включите поддержку активности и установите для него агрессивные настройки тайм-аута:

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

Это позволит каждому запросу клиентской страницы использовать один процесс apache для обработки всех своих запросов, тогда как в противном случае он использовал бы несколько процессов apache. Это сократит количество процессов apache, запущенных в любой момент времени.

Для оптимальной памяти и запросов в секунду:

Отойдите от mod_php и используйте вместо него fastcgi или другой сервер приложений. Процессы Apache потребляют незначительный объем памяти, когда php-страницы обслуживаются fastcgi. Не говоря уже о том, что fastcgi может, среди прочего, поддерживать постоянные соединения с вашим сервером dbase.

как насчет переноса обслуживания статического контента на лучше подходящий сервер?