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

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

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

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

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

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

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

Вот список того, что я сделал:

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

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

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

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

Ссылка:

Выключил 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. Это еще один хороший совет, который я скоро попробую, но сейчас я не могу рисковать простоями.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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