Хорошо, я знаю, что задаю вопрос, который задавали несколько раз раньше (например, здесь - Обслуживать миллионы одновременных подключений и статических файлов?) но, похоже, нет конкретных решений, поэтому я хотел бы спросить еще раз; пожалуйста, проявите ко мне терпение.
Мы мог используйте для этого 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 секунд, что ухудшает работу наших конечных пользователей.
Мы не ОЗУ / память ограничена - работает бесплатно -m показывает следующее:
total used free shared buffers cached
Mem: 3754 1374 2380 0 139 332
-/+ buffers/cache: 902 2851
Swap: 0 0 0
Можем ли мы оптимизировать Apache дальше, чтобы он мог обрабатывать больше одновременных подключений и быстрее обслуживать статический контент? Было бы больше оперативной памяти или поддержки ЦП (даже если они, кажется, используются недостаточно).
Или может быть какая-то другая проблема, которую нам не хватает?
Наконец-то мы смогли решить эту проблему и снизить время отклика с нескольких секунд до нескольких миллисекунд, используя сам Apache.
Проблема была не в Apache; это была настройка MaxClients по умолчанию, которая вызывала проблему. Мы увеличили параметр MaxClients / ServerLimit, и Apache смог эффективно обрабатывать множество одновременных запросов и доставлять статические файлы с небольшим увеличением использования памяти. (Нам потребовалось время, чтобы обнаружить это, поскольку мы использовали ApacheBench для стресс-тестирования, которое не давало нам точного представления о том, что происходит.)
Мы по-прежнему используем MPM prefork, но, возможно, в будущем мы также рассмотрим MPM worker и event. Но пока мы вполне довольны производительностью MPM до форка.
Это хорошая справочная статья: MaxClients в apache. Как узнать размер моего процесса?