В настоящее время я использую Joyent Accelerator для размещения своих веб-приложений, и он работает нормально, однако мне нужно сократить расходы, поэтому я понижаю свой текущий план, и это накладывает некоторые новые ограничения памяти (256M rss, 512M swap). Вчера я не был слишком далеко над ними, но после перезапуска Apache несколько раз сегодня у меня теперь 411M rss, 721M swap (prstat -Z -s cpu).
Поиск в Server Fault только дает мне много способов и специальных инструментов для мониторинга сервера, но не дает советов о том, как уменьшить / оптимизировать его использование памяти. Я также видел этот вопрос , но я не думаю, что это хорошо для этой конкретной (или я могу сказать, что общая) ситуация.
Сервер работает под управлением ОС Solaris, и я использую стек Apache + MySQL + PHP.
Мне интересно знать шаги, которые можно предпринять, чтобы устранить эту проблему и решить проблемы. Тем не менее, у меня также не хватает времени, чтобы уменьшить след памяти и понизить план до того, как закончится текущий, так что все, что может творить чудеса и спасать день, также приветствуется :)
Ответы:
Спасибо всем за ваши ответы! Следуя вашим предложениям, я смог сократить использование памяти до 195M SWAP и 108M RSS, не затрагивая мой код (я определенно оптимизирую его в ближайшее время, но это должно было быть решением, чтобы быстро избавить меня от проблем).
Вот список вещей, которые я сделал:
Избавился от подстановочного знака, используемого в записях VirtualHost. Вместо *: 80 и *: 443 я использовал реальный IP моего сервера.
Изменен prefork MPM в Apache. Это значения, которые я использовал в итоге:
Это ни в коем случае не магические числа. Я провел некоторое время, пробуя разные значения и комбинации, а затем проверяя их на предмет реального использования моего сервера, и каждый должен делать то же самое в своей среде. Для справки, мой сервер получает около 2 млн. Пвс / месяц, обслуживая как динамические страницы, так и ресурсы с регулярной скоростью - без эффекта digg. Намерение, опять же, было уменьшить объем памяти, а не улучшить производительность или HA.
Ссылка:
Отключил KeepAlive Apache. Установив
KeepAliveTimeout
более низкое значение (в моем случае 2), я могу ожидать меньше серверных процессов, просто ожидающих соединения с незанятыми клиентами, которые могут не запрашивать больше контента.Ссылка: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout
Удален неиспользуемый модуль MySQL. Я добавил
skip-innodb
в MySQL my.cnf. Массовое сокращение потребления памяти.Есть также несколько замечательных хороших предложений, которые я не мог сделать лично:
источник
Got rid of the wildcard used in VirtualHost entries
это действительно помогает каким-либо значимым образом? У меня сложилось впечатление, что это ничего не изменит.Я нашел эту статью о конфигурации нехватки памяти для Apache и MySQL
Быть очень полезным при планировании изменений конфигурации, необходимых для конфигураций с низким объемом памяти. Я настроил их для моей собственной ситуации, но они должны дать вам инструменты, необходимые для наилучшего соответствия вашей среде
источник
Вам нужно будет ограничить количество запущенных процессов на сервере Apache, и, будучи настолько близким к этому пределу, как вы, вы не сможете справиться с очень пиковым трафиком. Наличие веб-сервера, который максимально загружен при обычном использовании, обычно является плохой идеей (tm), так как веб-трафик в большинстве случаев приятен и низок до тех пор, пока вас не коснут, не выкопают, не выкрутят, или что-то другое.
Основными проблемами является количество процессов Apache, которые выполняются в любой момент - при условии, что здесь есть предварительная ветка, поскольку я только развернул PHP-приложения, а PHP не является потокобезопасным. У меня нет опыта в измерении рабочего MPM. Некоторые элементы находятся в общей памяти, а некоторые - в памяти каждого процесса.
Вы можете уменьшить общий объем памяти, не используя общие модули, которые вам не нужны. По сути, Apache настроен на большинство хостов, чтобы делать практически все под солнцем. Если вы не используете mod_userdir, то закомментируйте его в конфигурации apache. Просто будьте осторожны, сколько вы удалите, потому что некоторые вещи, которые вам могут понадобиться, или их зависимости не интуитивно понятны! Все модули должны быть документированы на веб-сайте apache.org. След от процесса труднее получить меньше; большинство конфигураций apache в наши дни поставляются только с четырьмя необходимыми модулями. Помимо этих четырех модулей, большая часть использования памяти поступает либо из утечек, либо из ОЗУ приложения, которое не является сборщиком мусора, поэтому вам может потребоваться установить количество запросов. обрабатывается каждым процессом на низком уровне.
Вы действительно хотите сохранить использование памяти в самой ОЗУ и не переходить в режим подкачки. Обмен означает I / O. Ввод / вывод медленный, и он будет загружать ваш процессор через крышу, поскольку процессы блокируются, ожидая, пока что-то не получится из свопинга.
источник
Для apache удалите модули, которые вы не используете, поскольку они просто используют дополнительную память. Для MySQL удалите innodb / bbdb, если вы их не используете, и удалите ненужные модули PHP.
Затем вы должны настроить Apache MaxClients, основываясь на размере одного процесса и объеме памяти, который вы хотите предоставить apache. То же самое касается максимальных соединений на MySQL (я рекомендую отличный сценарий учебника по настройке MySQL .
Если у вас есть контроль над вашим приложением PHP, убедитесь, что оно не использует слишком много памяти (например, в переменных, особенно в статических).
Если вы хотите пойти дальше, вы можете заменить apache + mod_php на установку nginx + fcgi, что, вероятно, приведет к дальнейшему сокращению памяти.
И последнее: вы действительно не хотите менять веб-сервер. Немного, чтобы удалить ненужные вещи, но регулярная перестановка на веб-сервере приведет к не отвечающему веб-сайту.
источник
Поскольку вы уже достигли своей цели, вот несколько дополнительных:
Так как вы удалили все ненужные модули php, вы можете сделать то же самое для apache. По умолчанию (в зависимости от установки) Apache загружает довольно много дополнительных модулей, и большинство из них на самом деле не требуется для повседневного использования. Например, есть множество модулей аутентификации, которые всегда загружаются. deflate обычно не требуется, если вы не пытаетесь ограничить использование полосы пропускания. Автоиндекс и статусы также сомнительны.
И еще одно, что вы можете ограничить объем памяти, доступной для php в php.ini: memory_limit = xxxM
источник
Конечно, вы можете ограничить число процессов, которые может разворачивать Apache, однако это будет работать только как ограничение sudo-hard на использование вашей памяти. С точки зрения более низкого уровня вы можете использовать plimit для ограничения ресурсов, доступных процессу. Я считаю, что это применимо к родительским и дочерним процессам.
Однако с точки зрения конфигурации веб-сервера все сводится к тому, как на самом деле работает ваш код! Но имейте в виду, что такие мелочи, как использование файлов .htaccess, требуют больше ресурсов, чем использование файлов конфигурации центрального apache (поскольку они читаются каждый раз, когда поступает запрос, что приводит к большим накладным расходам), что имеет значение на больших веб-сайтах.
источник
Одна вещь, которая может помочь росту памяти с течением времени, - установить меньшую активность активности httpd, но я бы тщательно это проверил на случай, если вашему приложению нужны более длительные процессы.
источник
У меня нет опыта работы с Solaris, но лучшее, что вы можете сделать, это не использовать Apache / mod_php.
источник