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

<p>в настоящее время я использую joyent accelerator для размещения своих веб-приложений, и он работает нормально, однако мне нужно сократить расходы, поэтому я понижаю свой текущий план, и это накладывает некоторые новые ограничения памяти (256m rss, 512m swap). вчера я не был слишком далеко над ними, но после перезапуска apache несколько раз сегодня у меня теперь 411m rss, 721m swap (prstat -z -s cpu).</p><p>поиск в server fault только дает мне много способов и специальных инструментов для мониторинга сервера, но не дает советов о том, как уменьшить/оптимизировать его использование памяти. я также видел <a href="https://serverfault.com/questions/11467/how-do-i-reduce-ram-usage-on-my-server">этот вопрос</a> , но я не думаю, что это хорошо для этой конкретной (или я могу сказать универсальной?) ситуации.</p><p>сервер работает под управлением ос solaris, и я использую apache + mysql + php стек).</p><p>мне интересно знать шаги, которые можно предпринять, чтобы устранить эту проблему и решить проблемы. тем не менее, у меня также не хватает времени, чтобы уменьшить след памяти и понизить план до того, как закончится текущий, так что все, что может творить чудеса и спасать день, также приветствуется :)</p>

<p><em> спасибо всем за ваши ответы !</em> следуя вашим предложениям, я смог сократить использование памяти до 195m swap и 108m rss, не касаясь своего кода (я определенно оптимизирую его в ближайшее время, но это должен был помочь мне быстро избавиться от неприятностей).</p><p>вот список вещей, которые я сделал:</p><p><strong> избавился от подстановочного знака, используемого в записях virtualhost. </strong> вместо *: 80 и *: 443 я использовал реальный ip-адрес своего сервера.</p><p><strong> изменен предварительный форпок apache mpm. </strong> это значения, которые я использовал в итоге:</p><pre> startservers 1 minspareservers 1 maxspareservers 5 serverlimit 16 maxclients 16 maxrequestsperchild 0 listenbacklog 100 </pre><p>это ни в коем случае не магические числа. я провел некоторое время, пробуя разные значения и комбинации, а затем проверяя их на предмет реального использования моего сервера, и каждый должен делать то же самое в своей среде. для справки, мой сервер получает около 2 млн. пвс/месяц, обслуживая как динамические страницы, так и ресурсы с регулярной скоростью - без эффекта digg. намерение, опять же, было уменьшить объем памяти, а не улучшить производительность или ha.</p><p>ссылка:</p><ul> <li> <a href="http://httpd.apache.org/docs/2.0/misc/perf-tuning.html">http://httpd.apache.org/docs/2.0/misc/perf-tuning.html</a> </li> <li> <a href="http://httpd.apache.org/docs/2.2/mod/mpm\_common.html">http://httpd.apache.org/docs/2.2/mod/mpm\_common.html</a> </li> </ul><p><strong> отключил keepalive apache. </strong> установив для <code>keepalivetimeout</code> более низкое значение (в моем случае 2), можно ожидать, что меньше серверных процессов просто ожидает соединения с незанятыми клиентами, которые могут не запрашивать больше контента.</p><p>ссылка: <a href="http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout">http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout</a> </p><p><strong> удален неиспользуемый модуль mysql. </strong> я добавил <code>skip-innodb</code> в mysql my.cnf. массовое сокращение потребления памяти.</p><p><br> есть также несколько замечательных хороших предложений, которые я не мог сделать лично:</p><ul> <li><strong> удалить php модулей, которые вам не нужны. </strong> php на моем сервере есть большинство модов уже скомпилировано, я, наверное, попробую свой собственный минимальный php на других vps.</li> <li><strong> переключитесь на nginx с помощью php-fastcgi. </strong> это еще один хороший совет, который я попробую в ближайшее время, но сейчас я не могу рисковать временем простоя.</li> </ul>

<p>я нашел <a href="http://wiki.vpslink.com/low\_memory\_mysql\_/\_apache\_configurations">эта статья о конфигурации нехватки памяти для apache и mysql</a> </p><p>быть очень полезным при планировании изменений конфигурации, необходимых для конфигураций с низким объемом памяти. я настроил их для моей собственной ситуации, но они должны дать вам инструменты, необходимые для наилучшего соответствия вашей среде</p>

<p>вам нужно будет ограничить количество запущенных процессов сервера apache, и, будучи настолько близким к этому пределу, как вы, вы не сможете обрабатывать очень пиковый трафик. наличие веб-сервера, который максимально загружен при обычном использовании, обычно является плохой идеей (tm), поскольку веб-трафик в большинстве случаев приятен и низок до тех пор, пока вас не коснут, не выкопают, не выкрутятся, или что-то подобное.</p><p>основными проблемами является количество процессов apache, которые выполняются в любой точке - при условии, что здесь уже есть prefork, поскольку я только развернул php приложения и php) не является потокобезопасным. у меня нет опыта измерения рабочего mpm. некоторые элементы находятся в общей памяти, а некоторые - в памяти каждого процесса.</p><p>вы можете уменьшить общий объем памяти, не используя общие модули, которые вам не нужны. по сути, apache настроен на большинство хостов, чтобы делать практически все под солнцем. если вы не используете mod\_userdir, то закомментируйте его в своей конфигурации apache. просто будьте осторожны, сколько вы удалите, потому что некоторые вещи, которые вам могут понадобиться, или их зависимости не интуитивно понятны! все модули должны быть документированы на веб-сайте apache.org. след от процесса труднее получить меньше; большинство конфигураций apache в наши дни поставляются только с четырьмя основными скомпилированными модулями. помимо этих четырех модулей, большая часть использования памяти происходит из-за утечек или приложений ram это не сборщик мусора, поэтому вы можете установить минимальное количество запросов, обрабатываемых каждым процессом.</p><p>вы <em>действительно</em> хотите сохранить использование памяти в ram) и не переходить в swap. swap означает i/o. i/o медленный и будет загружать ваш процессор через крышу, поскольку процессы блокируют, ожидая, что что-то будет вытащено из обмена.</p>

<p>поскольку вы уже достигли своей цели, вот несколько дополнительных:</p><p>так как вы удалили все ненужные модули php, вы можете сделать то же самое для apache. по умолчанию (в зависимости от установки) apache загружает довольно много дополнительных модулей, и большинство из них на самом деле не требуются для повседневного использования. например, есть множество модулей аутентификации, которые всегда загружаются. deflate обычно не требуется, если вы не пытаетесь ограничить использование полосы пропускания. автоиндекс и статусы тоже сомнительны.</p><p>и еще одно, что вы можете ограничить объем памяти, доступной для php в php.ini: memory\_limit = xxxm</p>

<p>для apache удалите модули, которые вы не используете, поскольку они просто используют дополнительную память. для mysql удалите innodb/bbdb, если вы их не используете, и удалите php модули, которые вам не нужны.</p><p>затем вы должны настроить apache maxclients в зависимости от размера одного процесса и объема памяти, который вы хотите предоставить apache. то же самое касается максимальных соединений на mysql (я рекомендую отличный <a href="http://www.day32.com/mysql/tuning-primer.sh">mysql tuning primer</a> script.</p><p>если у вас есть контроль над приложением php), убедитесь, что оно не использует слишком много памяти (например, в переменных, особенно в статических).</p><p>если вы хотите пойти дальше, вы можете заменить apache + mod\_php на установку nginx + fcgi, что, вероятно, приведет к дальнейшему сокращению памяти.</p><p>и последнее: вы действительно не хотите менять веб-сервер. немного, чтобы удалить ненужные вещи, но регулярная перестановка на веб-сервере приведет к не отвечающему веб-сайту.</p>

<blockquote> <p>сервер работает под управлением ос solaris, и я использую apache + mysql + php стек).</p> </blockquote><p>у меня нет опыта работы с solaris, но лучше всего не использовать apache/mod\_php.</p><ul> <li>переключитесь на nginx с помощью php-fastcgi.</li> <li>перекомпилируйте php, чтобы использовать минимальное количество плагинов.</li> <li>избавьтесь от ненужных процессов, таких как ntpd (используйте ntpdate), ftp (используйте scp) и т.д ...</li> </ul>

<p>конечно, вы можете ограничить число процессов, которые может разворачивать apache, однако это будет работать только как жесткое ограничение использования вашей памяти. с точки зрения более низкого уровня вы можете использовать <a href="http://manpages.unixforum.co.uk/man-pages/unix/solaris-10-11\_06/1/plimit-man-page.html">plimit</a> , чтобы ограничить ресурсы, доступные процессу. я считаю, что это применимо к родительским и дочерним процессам.</p><p>однако с точки зрения конфигурации веб-сервера все сводится к тому, как на самом деле работает ваш код! но имейте в виду, что такие мелочи, как использование файлов .htaccess, требуют больше ресурсов, чем использование центральных файлов конфигурации apache (поскольку они читаются каждый раз, когда поступает запрос, что приводит к большим накладным расходам), что имеет значение на больших веб-сайтах.</p>

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