У меня есть VPS с запущенным apache, которому постоянно не хватает памяти на Dreamhost. Dreamhost говорит, что проблема в конфигурации wordpress, но я думаю, что это их стандартный ответ. Я посмотрел, и основной веб-хостинг исходит от mediawiki. Иногда у меня работает 20-30 http-процессов, и все они работают на php, а mediawiki поддерживает два моих самых популярных сайта.
Поэтому я ищу предложения о способах уменьшить объем памяти, занимаемой mediawiki. В настоящее время я использую версию 1.16.4, которая, как я вижу, значительно отстает от текущей версии. (Dreamhost должен был обновить его для меня, но, видимо, они этого не сделали.)
- Версия 17.2 занимает меньше места, чем 16.2?
- Есть ли какой-нибудь хитрый способ использовать кеширование для уменьшения объема памяти?
- Есть ли параметры конфигурации, которые уменьшают объем памяти?
- Почему у меня запущены и apache httpd, и php5.cgi?
- Есть ли простой способ узнать, какие части mediawiki используют больше всего оперативной памяти?
- Есть ли способ уменьшить количество извлекаемых файлов? Мои веб-журналы заполнены запросами на user.gif, bullet.gif, external.png, document.png --- почему темы mediawiki не используют спрайты?
Спасибо!
Мое первое предложение - убедиться, что вы исправляете правильную проблему.
- Отслеживайте использование памяти в течение разумного периода времени и посмотрите, насколько оно увеличилось (и можете ли вы соотнести это с чем-то вроде увеличения трафика).
- Если у вас уже есть мониторинг (например, Munin), вы сможете увидеть тенденции памяти.
- В противном случае используйте sar (например, если он у вас уже настроен, sar -r -f / var / log / sa / sa17 предоставит вам сегодняшнюю информацию о памяти).
Определите, какие процессы фактически используют вашу память.
- Ваша проблема может не иметь прямого отношения к MediaWiki. Хотя PHP может потреблять много памяти, MySQL и особенно Apache - хорошие кандидаты для значительного использования памяти.
- Используйте команду top (или htop) или ps aux --sort -rss, чтобы увидеть, какие процессы потребляют больше всего памяти.
- Если ваша проблема связана с PHP, вы можете добиться некоторого успеха, уменьшив memory_limit в php.ini.
Уменьшите использование памяти Apache
- От 20 до 30 процессов apache будут потреблять много памяти (вероятно, более 500 МБ)
- Если можете, переключитесь с Apache на легкий веб-сервер, такой как nginx или lighttpd. Они должны работать с большинством CMS, хотя некоторые конфигурации (например, с использованием файлов .htaccess) не поддерживаются.
- Удалите ненужные расширения apache - Apache будет загружать почти полную копию самого себя, включая все расширения и т. Д., В память для каждого обрабатываемого запроса.
- Уменьшите количество серверных процессов, запускаемых Apache. Процессы Apache обычно начинаются с 10 МБ каждый и со временем могут увеличиваться до 30+ МБ каждый.
- Если время простоя приемлемо, рассмотрите следующий подход (в противном случае просто оцените и сделайте математические вычисления):
- Через несколько часов использования посмотрите на средний объем памяти, используемый вашими процессами Apache.
- Остановите Apache и обратите внимание на используемую память - это должно сказать вам, сколько требуется вашей операционной системе и всем работающим службам (MySQL и т. Д.). Перезагрузите Apache
- Возьмите разницу между вашей общей памятью и памятью, используемой вашей базовой системой, вычтите немного (как минимум 10%) для безопасности и разделите на средний размер процесса apache.
- Установите низкие значения для StartServers, MinSpareServers, MaxSpareServers и MaxClients. Держите MaxClients ниже, чем число, которое вы рассчитали выше, а другие значения еще ниже.
- Установите MaxRequestsPerChild на ненулевое значение (100-300 должно быть хорошо)
- С меньшим количеством серверных процессов вы не хотите, чтобы они были связаны слишком долго - поэтому убедитесь, что ваш KeepAliveTimeout низкий (10 секунд должно быть достаточно, возможно меньше, не выше 15 секунд - значение зависит от того, как используется ваш сайт)
Есть дополнительные предложения по этот очень хорошее руководство по оптимизации Apache для работы с малой памятью.
Версия 17.2 занимает меньше места, чем 16.2?
- На самом деле между ними всего 6 версий (16.2-16.5, 17.0-17.2), более того, второстепенные версии обычно являются обновлениями безопасности, поэтому я не ожидал бы серьезных изменений, за исключением, возможно, версии 17.0 (и быстрого просмотра журнала изменений не предлагает каких-либо серьезных изменений в управлении памятью). Если вы действительно думаете, что это проблема, запустите виртуальную машину (например, с VirtualBox), установите две версии и запустите на них нагрузочный тест (ab, siege, httperf и т. Д.) - отслеживайте использование памяти и сравните результаты.
Есть ли какой-нибудь хитрый способ использовать кеширование для уменьшения объема памяти?
- Это зависит от источника вашей проблемы:
- Если это PHP, генерируйте статические копии ваших страниц при их изменении и обслуживайте их.
- Однако, если ваша проблема связана с Apache, для обслуживания статических ресурсов все равно потребуется много памяти (хотя кеширование всегда является хорошей идеей).
- Вы можете использовать CDN для уменьшения количества запросов к статическим ресурсам, что должно помочь с использованием памяти в Apache.
Вы можете рассмотреть несколько далеко не идеальных вариантов:
- Использование легковесного сервера в качестве обратного прокси-сервера - это поможет со статическими запросами, и если они составляют большую часть ваших запросов, должно помочь с использованием памяти (после правильной настройки Apache) - однако при запуске дополнительного сервера используются некоторые дополнительная память (и усложняет систему).
- Используйте слой кэширования, такой как Varnish - обычно он предназначен для запуска из памяти - с целью ускорения обслуживания страниц за счет использования большего объема памяти - однако вы можете настроить его для использования файла в качестве кеша. Подобно использованию обратного прокси, это снизит нагрузку на серверную часть, но само по себе потребует некоторой памяти - если вы готовы поэкспериментировать, вы можете увидеть, компенсирует ли выигрыш затраты.
- Убедитесь, что ваш кэш опкодов (например, APC) работает, и, возможно, используйте хранилище с файловой поддержкой вместо памяти для хранения кеша.
Почему у меня запущены и apache httpd, и php5.cgi?
- Вероятно, потому что вы используете FastCGI. Запросы для файлов PHP выполняются не Apache (как в случае с mod_php), а скорее интерфейсом CGI PHP. Вы можете обнаружить, что другой интерфейс CGI - PHP-FPM - предлагает лучшее управление ресурсами (его можно использовать с mod_fastcgi).
Есть ли простой способ узнать, какие части mediawiki используют больше всего оперативной памяти?
- Я бы предположил, что лучший способ добиться этого - отключить все, что вы можете (расширения / плагины и т. Д.), И запустить нагрузочный тест. У вас может быть небольшой успех с некоторыми профилировщиками (например, XDebug), но я не ожидаю, что с результатами будет так легко действовать (и обычно, как правило, больше в виде затраченного времени). Если выполнение ваших запросов занимает много времени, некоторые менеджеры процессов (например, PHP-FPM) предлагают функцию «slowlog».
Есть ли способ уменьшить количество извлекаемых файлов? Мои веб-журналы заполнены запросами на user.gif, bullet.gif, external.png, document.png --- почему темы mediawiki не используют спрайты?
- Вы можете посмотреть в Google mod_pagespeed - он поможет вам с минимизацией, оптимизацией изображений и т. Д. - хотя для правильной настройки требуются некоторые усилия. Кроме того, вы можете изменять темы по своему вкусу или использовать другую тему. Убедитесь, что изображения и т. Д. Кэшируются браузерами вашего пользователя. Возможно уменьшить ведение журнала для определенных типов активов (например, статических объектов)
Я бы посоветовал вам перейти от CGI / FastCGI в пользу PHP-FPM + nginx. PHP-FPM поддерживает создание пула интерпретаторов PHP и не порождает каждый отдельный интерпретатор для каждого запроса (что, я думаю, делает даже FastCGI).
Из моих собственных тестов я заметил, что потребление памяти упало минимум на 15% до 35% в сочетании с хорошо настроенным оптимизатором байт-кода (я использую APC с хорошими результатами). Настоящая сделка заключалась в том, чтобы уйти от Apache и FastCGI, поскольку пул рабочих apache порождал слишком много дочерних элементов, и каждый из них, в свою очередь, порождал интерпретаторы PHP, которые сразу после 4/5 дней приводили к нехватке памяти / подкачке с низкой производительностью.
Как было предложено выше, проанализируйте, что сейчас пожирает вашу память, Бьюсь об заклад, APC вызывает что согласно эта почта
Если возможно, переключитесь с Apache на lighttpd или nginx. Они могут служить вашему статическому контенту очень эффективно. Затем настройте что-то вроде FastCGI или fcgid для вашего динамического контента. Таким образом вы можете эффективно разделить статический и динамический контент и изолировать их друг от друга.
И да, я намеренно опустил веб-ссылки для каждого ключевого слова, которое я использовал; Погуглите их и решите, что вам подходит.
Я могу подтвердить, что MediaWiki использует большую память, но только в том, что касается скомпилированного байт-кода PHP. Средство просмотра кэша APC показывает, что размер скомпилированного байт-кода составляет примерно 20 МБ после нескольких обращений. Байт-код для всех «обычных» сайтов (не использующих WordPress, Drupal или Joomla) меньше 1 МБ.
Затем реальное использование памяти, о котором сообщает PHP: быстрый тест показал, что загрузка страницы MediaWiki потребляет всего около 5 МБ памяти, что примерно такое же, как у Joomla. Некоторые более легкие системы управления контентом используют значительно меньше: около 1,8–3 МБ на загрузку страницы (конечно, в зависимости от сложности структуры страницы).
Что касается плохого использования памяти, тем не менее, я видел, что стандартная установка WordPress и совершенно простая страница могут использовать до 20-30 МБ памяти, при более сложных структурах страниц гораздо больше и довольно много времени процессора. Итак, DreamHost действительно знает самую распространенную проблему.