Оптимизация Apache для больших одновременных запросов и статических файлов
Хорошо, я знаю, что задаю вопрос, который задавался несколько раз раньше (например, здесь - обслуживать миллионы одновременных подключений и статических файлов?), Но конкретных решений, похоже, нет, поэтому я хотел бы спросить еще раз; пожалуйста, будьте терпеливы со мной.
Мы могли бы использовать для этого nginx, но мы используем Apache по многим причинам (например, знакомство с Apache, поддержание согласованности стека, форматирование журналов и т. Д.).
Мы пытаемся обслуживать большое количество одновременных запросов статических файлов с использованием Apache. Это должно быть просто и понятно, тем более что статические файлы представляют собой небольшие изображения, но Apache, похоже, не справляется с этим хорошо.
Точнее говоря, Apache, кажется, падает на блок Amazon EC2 m1.medium (4 ГБ ОЗУ + 1 ядро с 2 гиперпотоками), когда Apache видит около 100 одновременных (одновременных) запросов / сек. (Сама коробка, кажется, обрабатывает больше соединений в это время - netstat -n | grep: 80 | grep SYN | wc -l показывает более 250 соединений.)
Самая большая проблема заключается в том, что запросы на статический контент иногда выполняются в течение 5-10 секунд, что создает неудобства для наших конечных пользователей.
Мы не ограничены в ОЗУ / памяти - запуск free -m показывает следующее:
total used free shared buffers cached
Mem: 3754 1374 2380 0 139 332
-/+ buffers/cache: 902 2851
Swap: 0 0 0
Можем ли мы дополнительно оптимизировать Apache, чтобы он мог обрабатывать больше одновременных соединений и быстрее обслуживать статический контент? Будет ли иметь больше оперативной памяти или ЦП (даже если они используются недостаточно).
Или, может быть, есть какая-то другая проблема, которую мы упускаем?
1 ответ
Мы наконец-то смогли решить эту проблему и сократить время отклика с нескольких секунд до нескольких миллисекунд, используя сам Apache.
Проблема была не в Apache; это был параметр MaxClients по умолчанию, который вызывал проблему. Мы увеличили настройку MaxClients/ServerLimit, и Apache смог красиво обрабатывать множество одновременных запросов и доставлять статические файлы с небольшим увеличением использования памяти. (Нам потребовалось некоторое время, чтобы обнаружить это, так как мы использовали ApacheBench для стресс-тестирования, которое не дало нам точного представления о том, что происходит.)
Мы все еще используем prefork MPM, но в будущем мы могли бы также рассмотреть MPM для рабочих и событий. Но сейчас мы довольны производительностью prefork MPM.
Это хорошая справочная статья: MaxClients в Apache. Как узнать размер моего процесса?