Как уменьшить использование памяти на веб-сервере Unix

36

В настоящее время я использую Joyent Accelerator для размещения своих веб-приложений, и он работает нормально, однако мне нужно сократить расходы, поэтому я понижаю свой текущий план, и это накладывает некоторые новые ограничения памяти (256M rss, 512M swap). Вчера я не был слишком далеко над ними, но после перезапуска Apache несколько раз сегодня у меня теперь 411M rss, 721M swap (prstat -Z -s cpu).

Поиск в Server Fault только дает мне много способов и специальных инструментов для мониторинга сервера, но не дает советов о том, как уменьшить / оптимизировать его использование памяти. Я также видел этот вопрос , но я не думаю, что это хорошо для этой конкретной (или я могу сказать, что общая) ситуация.

Сервер работает под управлением ОС Solaris, и я использую стек Apache + MySQL + PHP.

Мне интересно знать шаги, которые можно предпринять, чтобы устранить эту проблему и решить проблемы. Тем не менее, у меня также не хватает времени, чтобы уменьшить след памяти и понизить план до того, как закончится текущий, так что все, что может творить чудеса и спасать день, также приветствуется :)

Лима
источник
1
Я просто хотел прокомментировать, что, хотя я узнал об этих настройках сам из поиска в Google, оказалось, что я менял настройки в одном файле, но другой файл конфигурации, который загружался позже, фактически переопределял мои настройки! Однажды я обнаружил, что настройка параметров MPM prefork и некоторые другие вещи творит чудеса, чтобы контролировать количество процессов и использование памяти, сводя к минимуму. Надеюсь, эта информация поможет другим, особенно тем, кто использует Gentoo на своих серверах.
Pistos

Ответы:

23

Спасибо всем за ваши ответы! Следуя вашим предложениям, я смог сократить использование памяти до 195M SWAP и 108M RSS, не затрагивая мой код (я определенно оптимизирую его в ближайшее время, но это должно было быть решением, чтобы быстро избавить меня от проблем).

Вот список вещей, которые я сделал:

Избавился от подстановочного знака, используемого в записях VirtualHost. Вместо *: 80 и *: 443 я использовал реальный IP моего сервера.

Изменен prefork MPM в Apache. Это значения, которые я использовал в итоге:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Это ни в коем случае не магические числа. Я провел некоторое время, пробуя разные значения и комбинации, а затем проверяя их на предмет реального использования моего сервера, и каждый должен делать то же самое в своей среде. Для справки, мой сервер получает около 2 млн. Пвс / месяц, обслуживая как динамические страницы, так и ресурсы с регулярной скоростью - без эффекта digg. Намерение, опять же, было уменьшить объем памяти, а не улучшить производительность или HA.

Ссылка:

Отключил KeepAlive Apache. Установив KeepAliveTimeoutболее низкое значение (в моем случае 2), я могу ожидать меньше серверных процессов, просто ожидающих соединения с незанятыми клиентами, которые могут не запрашивать больше контента.

Ссылка: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Удален неиспользуемый модуль MySQL. Я добавил skip-innodbв MySQL my.cnf. Массовое сокращение потребления памяти.


Есть также несколько замечательных хороших предложений, которые я не мог сделать лично:

  • Удалите PHP модули, которые вам не нужны. PHP на моем сервере имеет большинство уже скомпилированных модов, я, вероятно, попробую свой собственный минимальный PHP на других VPS.
  • Переключитесь на nginx с помощью php-fastcgi. Это еще один хороший совет, который я скоро попробую, но сейчас я не могу рисковать временем простоя.
Лима
источник
Я использую nginx и php-fastcgi (LEMP) и сталкиваюсь с похожими проблемами с памятью ... на 256-мегабайтном сервере я обнаружил, что php-fastcgi хорошо работает с PHP_FCGI_CHILDREN = 5 и PHP_FCGI_MAX_REQUESTS = 333 ... эти значения являются хорошим началом точка!
Farinspace
Got rid of the wildcard used in VirtualHost entriesэто действительно помогает каким-либо значимым образом? У меня сложилось впечатление, что это ничего не изменит.
Mahn
@Mahn - это не помогает с памятью, но улучшает загрузку процессора, что хорошо в среде с низким объемом памяти
jsnfwlr
«Переключитесь на nginx с помощью php-fastcgi» --- Менее радикальный, но эффективный вариант, если вы хотите сохранить Apache2: Apache2 + mod_proxy_fcgi + mod_mpm_event. ФИЛЬМЫ ПОХОЖИЕ НА nginx Используйте это для подключения к php-fpm. См. Dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
Джеймс Джонстон
6

Я нашел эту статью о конфигурации нехватки памяти для Apache и MySQL

Быть очень полезным при планировании изменений конфигурации, необходимых для конфигураций с низким объемом памяти. Я настроил их для моей собственной ситуации, но они должны дать вам инструменты, необходимые для наилучшего соответствия вашей среде

Кевин Куфал
источник
ссылка мертва
user2682863
4

Вам нужно будет ограничить количество запущенных процессов на сервере Apache, и, будучи настолько близким к этому пределу, как вы, вы не сможете справиться с очень пиковым трафиком. Наличие веб-сервера, который максимально загружен при обычном использовании, обычно является плохой идеей (tm), так как веб-трафик в большинстве случаев приятен и низок до тех пор, пока вас не коснут, не выкопают, не выкрутят, или что-то другое.

Основными проблемами является количество процессов Apache, которые выполняются в любой момент - при условии, что здесь есть предварительная ветка, поскольку я только развернул PHP-приложения, а PHP не является потокобезопасным. У меня нет опыта в измерении рабочего MPM. Некоторые элементы находятся в общей памяти, а некоторые - в памяти каждого процесса.

Вы можете уменьшить общий объем памяти, не используя общие модули, которые вам не нужны. По сути, Apache настроен на большинство хостов, чтобы делать практически все под солнцем. Если вы не используете mod_userdir, то закомментируйте его в конфигурации apache. Просто будьте осторожны, сколько вы удалите, потому что некоторые вещи, которые вам могут понадобиться, или их зависимости не интуитивно понятны! Все модули должны быть документированы на веб-сайте apache.org. След от процесса труднее получить меньше; большинство конфигураций apache в наши дни поставляются только с четырьмя необходимыми модулями. Помимо этих четырех модулей, большая часть использования памяти поступает либо из утечек, либо из ОЗУ приложения, которое не является сборщиком мусора, поэтому вам может потребоваться установить количество запросов. обрабатывается каждым процессом на низком уровне.

Вы действительно хотите сохранить использование памяти в самой ОЗУ и не переходить в режим подкачки. Обмен означает I / O. Ввод / вывод медленный, и он будет загружать ваш процессор через крышу, поскольку процессы блокируются, ожидая, пока что-то не получится из свопинга.

Карл Кацке
источник
1
Спасибо за совет, Карл! Есть ли способ запретить серверу использовать своп? Потому что после уменьшения использования памяти у меня больше нет оперативной памяти, но она все еще показывает, что память SWAP была использована.
Лима
@fandelost Неважно, что используется своп, это когда что-то выгружается из свопинга, что плохо. Ваша операционная система может обмениваться инструкциями или данными с процессами, которые запускаются не очень часто, когда есть время для этого, потому что она думает (и часто правильно), что эти инструкции и данные лучше там.
Патрик Джеймс Макдугл
2

Для apache удалите модули, которые вы не используете, поскольку они просто используют дополнительную память. Для MySQL удалите innodb / bbdb, если вы их не используете, и удалите ненужные модули PHP.

Затем вы должны настроить Apache MaxClients, основываясь на размере одного процесса и объеме памяти, который вы хотите предоставить apache. То же самое касается максимальных соединений на MySQL (я рекомендую отличный сценарий учебника по настройке MySQL .

Если у вас есть контроль над вашим приложением PHP, убедитесь, что оно не использует слишком много памяти (например, в переменных, особенно в статических).

Если вы хотите пойти дальше, вы можете заменить apache + mod_php на установку nginx + fcgi, что, вероятно, приведет к дальнейшему сокращению памяти.

И последнее: вы действительно не хотите менять веб-сервер. Немного, чтобы удалить ненужные вещи, но регулярная перестановка на веб-сервере приведет к не отвечающему веб-сайту.

yhager
источник
Спасибо за ваш совет, я пытаюсь настроить tuning-primer.sh, но получаю следующую ошибку: «синтаксическая ошибка в строке 94:` cnf_socket = $ 'непредвиденный ». Любые идеи?
Лима
Может быть связано с оболочкой. Поскольку этот скрипт, вероятно, связан с Linux, попробуйте изменить первую строку, указав на bash, вместо / bin / sh. Я надеюсь, что вы можете установить bash на Solaris, но я ничего не могу с этим
поделать
2

Поскольку вы уже достигли своей цели, вот несколько дополнительных:

Так как вы удалили все ненужные модули php, вы можете сделать то же самое для apache. По умолчанию (в зависимости от установки) Apache загружает довольно много дополнительных модулей, и большинство из них на самом деле не требуется для повседневного использования. Например, есть множество модулей аутентификации, которые всегда загружаются. deflate обычно не требуется, если вы не пытаетесь ограничить использование полосы пропускания. Автоиндекс и статусы также сомнительны.

И еще одно, что вы можете ограничить объем памяти, доступной для php в php.ini: memory_limit = xxxM

rasjani
источник
0

Конечно, вы можете ограничить число процессов, которые может разворачивать Apache, однако это будет работать только как ограничение sudo-hard на использование вашей памяти. С точки зрения более низкого уровня вы можете использовать plimit для ограничения ресурсов, доступных процессу. Я считаю, что это применимо к родительским и дочерним процессам.

Однако с точки зрения конфигурации веб-сервера все сводится к тому, как на самом деле работает ваш код! Но имейте в виду, что такие мелочи, как использование файлов .htaccess, требуют больше ресурсов, чем использование файлов конфигурации центрального apache (поскольку они читаются каждый раз, когда поступает запрос, что приводит к большим накладным расходам), что имеет значение на больших веб-сайтах.

Coops
источник
0

Одна вещь, которая может помочь росту памяти с течением времени, - установить меньшую активность активности httpd, но я бы тщательно это проверил на случай, если вашему приложению нужны более длительные процессы.

DF
источник
0

Сервер работает под управлением ОС Solaris, и я использую стек Apache + MySQL + PHP.

У меня нет опыта работы с Solaris, но лучшее, что вы можете сделать, это не использовать Apache / mod_php.

  • Переключитесь на nginx с помощью php-fastcgi.
  • Перекомпилируйте php, чтобы использовать минимальное количество плагинов.
  • Избавьтесь от ненужных процессов, таких как ntpd (используйте ntpdate), ftp (используйте scp) и т.д ...
неизвестный
источник