У меня есть 2 сервера для моего сайта:
- Один сервер 256ГБ ОЗУ 20c/40t для MySQL
- Один сервер 256ГБ ОЗУ 20c/40t для Apache
MySQL-сервер всегда в порядке (используется 30-50% ЦП).
Но сервер Apache становится СУПЕРМЕДЛЕННЫМ, когда мой сайт начинает получать 10 000 одновременных подключенных посетителей (5 000 страниц загружаются в минуту). Странно, что этот сервер еще не достигает своего предела, потому что загрузка памяти процессора составляет около 20-30%.
Вот что top
возвращает сервер Apache (когда сайт работает очень медленно и на нем 10 000 посетителей).
top - 22:04:17 up 22:34, 1 user, load average: 12.61, 13.59, 13.47
Tasks: 2139 total, 20 running, 2119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 28.2 us, 7.2 sy, 0.0 ni, 63.0 id, 0.0 wa, 0.0 hi, 1.6 si, 0.0 st
KiB Mem : 26410644+total, 17146396+free, 8632064 used, 84010416 buff/cache
KiB Swap: 1047548 total, 1047548 free, 0 used. 25449820+avail Mem
Как будто есть ограничение на загрузку ЦП этого сервера.
А это конфигурация сервера Apache:
keepalive: Off
keepalivetimeout: 2
maxclients: 3000
maxkeepaliverequests: 1000
maxrequestsperchild: 15000
maxspareservers: 300
minspareservers: 150
serverlimit: 3000
startservers: 1000
timeout: 300
И я должен уточнить, что вчера у меня было 128 GO RAM для сервера Apache, и веб-сайт мог поддерживать 13 000 одновременных подключенных посетителей, прежде чем он начал становиться супермедленным. Поэтому я решил перейти на 256 GO RAM, но результат оказался хуже...
Есть идеи?
Я использую WHM.
(Извините за мой английский)
решение1
«Директива MaxClients устанавливает ограничение на количество одновременных запросов, которые будут обслуживаться. Любые попытки соединения, превышающие ограничение MaxClients, обычно ставятся в очередь, вплоть до числа, определяемого директивой ListenBacklog. После освобождения дочернего процесса в конце другого запроса соединение будет обслуживаться» (Ref.http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients).
Если вы посмотрите глубже в соответствующие документы, вы найдете, как управлять также «serverlimit» и «maxrequestsperchild» в соответствии спрефорк/рабочийMPM, чтобы избежать ситуации, описанной Майклом Хэмптоном (очень наглядно!).
Кроме того, проверив журналы, вы наверняка найдете какие-то доказательства по этому поводу.