Как я могу предотвратить падение Apache?


8

У меня есть пара серверов, на которых размещается один сайт электронной коммерции Magento с умеренным трафиком (60 000 просмотров страниц в день по данным Google Analytics, я думаю, около 80 000 запросов на самом сервере). Сервер базы данных работает плавно и быстро, за исключением редких случайных сбоев, но сервер apache время от времени падает.

Я настроил magento для использования рекомендованного PHP-кэширования (APC), а также для хранения своих собственных файлов кэша в 1,5-гигабайтных tmpfs (эти tmpfs регулярно переполняются, и у меня запущен скрипт для очистки файлов кэша, когда tmpfs заполнено более 80%). Я обслуживаю большинство изображений с облачного фронта амазонки. Недавно я настроил nginx в качестве обратного прокси для apache (nginx также обслуживает статические файлы). Я настроил apache в меру своих возможностей - keepalives и hostnamelookup отключены, а prefork настроен следующим образом:

<IfModule prefork.c>
    StartServers      50
    MinSpareServers   50
    MaxSpareServers  100
    ServerLimit  512
    MaxClients   256
    MaxRequestsPerChild 400
</IfModule>

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

Сервер apache - это VPS с 6 гигабайтами оперативной памяти. На момент написания отчета сервер сообщал load average: 17.77, 18.27, 49.76, но свободной оперативной памяти около 2 гигабайт. Когда все идет плохо, нагрузка возрастает до 120+ и остается там - перезапуск apache возвращает сайт обратно, а нагрузка снова падает.

vmstat(в то время как сервер сообщает о загрузке выше), я думаю, показывает значение простоя процессора, колеблющееся между 0 и 70 или около того. iostatпоказывает значение Айоваит от 0 до 0,2%.

Я немного застрял. То, что я мало знаю, говорит мне, что проблема в том, что процессор перегружен из-за комбинации выполняемого кода и количества пользователей. Но я не достаточно опытен, чтобы быть уверенным, что это проблема. Если это проблема, я думаю, что решения должны либо улучшить код, либо разделить сайт, размещенный на двух VPS, с помощью балансировщика нагрузки.

Итак, я думаю, мои вопросы:

  1. Что еще я могу сделать, чтобы найти проблемы или узкие места на сервере?
  2. Есть ли какие-либо очевидные изменения, которые я могу внести в конфигурацию сервера, чтобы улучшить это?
  3. Это хорошая идея, чтобы настроить автоматическую систему для перезапуска Apache, когда нагрузка превышает определенный уровень?
  4. Исходя из вышесказанного, насколько вероятно, что сайт перерос сервер?

Редактировать:

Я нашел что-то странное - / var / spool / mail / root был большим ... 38 гиг. Это звучит ... нездорово. Может ли это быть проблема?


2
38ГБ почты? Узнайте, что там происходит. И затем исправьте это.
Алистер Булман

2
« Как я могу предотвратить падение apache » - дайте ему деревянную ногу и держите его подальше от доски.
Shaz

Почтовый файл, скорее всего, из-за ошибки root или crontab. Если у вас есть болтливая работа, они заполняют этот файл.
Кайл Смит

1
У него 6 ГБ оперативной памяти, но это 64-битная ОС? Вы действительно можете использовать больше, чем 4 ГБ, которые вы используете в настоящее время? Если это критически важный блок, то я бы определенно запустил Linux-HA и разделил его на два блока только для целей отработки отказа. Я бы подумал, что ваш босс не был бы так раздражен, если бы вы не влияли на результат с каждым крахом.
Ori

Ответы:


3

Как вы заметили, Magento и Zend Framework довольно загружены процессором. Лучший способ избежать нагрузки на процессор - просто рендерить любой контент только один раз, пока он не изменится. Большинство частей вашего каталога не меняются так часто, и часто только динамические блоки на вашей странице или блок «Самые популярные элементы».

Я бы предложил поместить кеш Varnish перед Apache. Это дает вам высокопроизводительное кэширование страниц, которое может серьезно разгрузить ваш стек LAMP. Мы недавно пережили очень публичный запуск веб-сайта благодаря Varnish, и я был очень впечатлен скоростью и низкой загрузкой процессора. Лак является бесплатным и достаточно гибким, чтобы кэшировать целые страницы или кэшировать только относительно статичные части и динамически включать корзину.

Тем не менее, Varnish не будет кэшировать много при установке Magento по умолчанию, так как есть много динамического контента для каждого пользователя, файлов cookie и т. Д. Модуль Magento, такой как « PageCache powered by Varnish », модифицирует Magento для хорошей работы с Varnish. Он также предоставляет файл конфигурации Varnish, соответствующий настройке Magento. Эти два вместе делают для очень эффективной установки. Это коммерческий модуль, но гораздо более доступный, чем более мощный сервер.

Части, которые вы загружаете в CDN или Nginx, не являются вашей реальной проблемой, хотя и помогают. Даже Apache может обрабатывать довольно много статических запросов. Вам необходимо кэшировать материал, который требует усилий для генерации снова и снова, то есть ваши динамические части.


Я взглянул на Varnish, и это похоже на хорошее решение для снижения нагрузки на процессор, по крайней мере, до тех пор, пока я не смогу перейти на хост с лучшей настройкой процессора. Спасибо.
Дейв Чайлд

3

Обычно я устанавливаю MaxRequestsPerChild тысячами - обычно около 10 000.

Вы говорите, что у вас есть «рекомендуемое кэширование PHP» - но у вас установлен APC? Наконец, сколько пользователей вы видите, одновременно попадающих на сайт. Если у вас есть расширенная статистика Apache, вы сможете увидеть, сколько процессов Apache фактически находятся в состоянии Running за один раз.

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


Во-первых, спасибо! Нагрузка все еще довольно высокая, поэтому я могу попробовать некоторые из этих вещей сразу, что полезно :). Я увеличил MaxRequestsPerChild до 4000 - нагрузка сразу же подскочила и осталась очень высокой. Я уменьшил его до 1000, и нагрузка несколько снизилась, хотя все еще слишком высока. APC установлен. SHM - 256. Переопределение include_once включено.
Дейв Чайлд

если APC уже установлен, что сообщает apc.php? - Скачать с svn.php.net/viewvc/pecl/apc/trunk/apc.php?view=markup
Алистер

Вот вывод (я бы предпочел не связываться напрямую с сайтом / сервером): dl.dropbox.com/u/16366/apc.htm
Дейв Чайлд

Извините, не понял, что вы отредактировали свой ответ. Да, это двухъядерный VPS (Xeon 2,4 ГГц). Я бы подумал, что этот сервер сможет справиться с текущей нагрузкой, поэтому я беспокоюсь, что что-то пропустил в конфигурации или не смог где-то найти узкое место.
Дейв

2

Ваша средняя нагрузка слишком высока для двухъядерного VPS. 8 должно быть макс.

У меня был хороший успех с использованием mod_pagespeed и события MPM для Magento. Я бы рекомендовал перейти на использование события MPM и установить mod_pagespeed.

Дополнительная информация о Event MPM: документация по Apache event MPM

И mod_pagespeed: Google Code: mod_pagespeed

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


2

Как подсказывает Алистер, значение MaxRequestsPerChild, равное 400, абсурдно мало.

Средняя загрузка очень высока - но 60 000 просмотров страниц в день - это не много трафика.

сколько процессов вы обычно обслуживаете?

Я не знаком с Magento, но похоже, что с этой настройкой что-то не так. Я ожидаю, что вы сможете получить значительно большую пропускную способность при более низком уровне нагрузки.

Иди, возьми копию книги Стива Соудерса и прочитай ее. Включите сжатие для всего исходящего содержимого HTML (статического и динамического). И убедитесь, что у вас есть хороший конфиг кеширования. Начните регистрировать% D в файле access_log и создайте несколько инструментов для анализа данных / выделения медлительности. Похоже на MySQL.

Попробуйте mysqltuner.pl и посмотрите, не обнаружит ли он каких-либо проблем.


Обычно примерно 10-20 процессов активно обслуживают запросы в любой момент. Когда нагрузка чрезвычайно высока, значит, намного больше. Magento - это что-то вроде монстра для запуска, поэтому, хотя я ожидаю, что другие системы будут в порядке с этим трафиком и настройкой, я могу поверить, что это может быть просто перерастание Magento. Спасибо за рекомендацию книги.
Дэйв Чайлд

mod_pagespeed очень помогает Magento. Попробуй это.
laebshade

2

Я запускаю аналогичную настройку, но с nginx / php-fpm / apc (opcode и fast_backend / memcached (slow_backend). Я считаю, что php самая большая проблема с ресурсами, вероятно, потому, что magento либо безумно большой, либо просто плохо закодированный. посмотрите, что именно ест ресурсы, может ли это быть php как в моем случае?

В дополнение к тому, что пишет Martijn Heemels, есть модуль лака с открытым исходным кодом, который вы можете попробовать. Проверьте http://moprea.ro/2011/may/6/magento-performance-optimization-varnish-cache-3/ и https://github.com/madalinoprea/magneto-varnish .
Я тестировал его только в тестовой среде, и пока все хорошо.


Сохраняете ли вы сессии в базе данных или на диске (и если да, то на tmpfs)?


Они сохранены в tmpfs.
Дейв Чайлд,

1

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

Из-за общего процессора ваши приложения не могут работать вовремя и продолжают получать в очередь, создавая более высокие запросы для обработки, а также накладные расходы, которые идут с ним. В конце концов, возникает условие, при котором Apache, php или mysql максимально допустили свои ограничения, и это вызывает проблемы.

Итог есть. VPS является в основном общим процессором. Ваш хост может размещать слишком много учетных записей VPS на одном процессоре.

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

Вы также можете полностью выбрать Amazon и не беспокоиться о nginx, используя их балансировщик нагрузки, который можно настроить несколькими серверами в своем облаке за несколько кликов.

папка /var/mail.../root hue означает, что она собирает много писем, которые обычно приходят из ваших приложений. Например, глючный php-скрипт пытается отправить электронное письмо, или все задания cron настроены так, чтобы отправлять вам по электронной почте информацию о состоянии запуска cron и выводе. Вы можете заглянуть в почту и посмотреть, что файл имеет. Я угадываю сообщения об ошибках, чтобы вы могли найти, откуда он.

Я добавлю больше, если вам нужна дополнительная информация и, возможно, мне тоже понадобится некоторая информация

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.