Re: Fedora 19 не тянет
Maxim Dounin
mdounin at mdounin.ru
Thu Sep 19 10:58:43 UTC 2013
Hello!
On Wed, Sep 18, 2013 at 04:10:04PM -0700, Konstantin Svist wrote:
> Пытаюсь перейти с Fedora 14 (2.6.35.14-97.fc14.x86_64) на Fedora 19
> (3.10.11-200.fc19.x86_64)
>
> worker_processes 40;
> events {
> worker_connections 8000;
[...]
> Симптомы:
>
> * ab -n1000000 -c1000 'http://localhost/service_check_nginx'
> (параллельно 4 раза, т.е. 4000 одновременных соединений)
> говорит что некоторые запросы занимают >3сек
>
> * netstat -s:
> ...
> 1269313 times the listen queue of a socket overflowed
> 1282868 SYNs to LISTEN sockets dropped
> ...
>
> Растёт со скоростью примерно 2000/сек, иногда больше
Listen queue при этом какого размера?
> * CPU загрузка не одинакова по workers:
>
> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
> 27671 nobody 20 0 418.6m 149.2m 1.1m S 51.1 0.1 0:00.77 nginx: worker process
> 27685 nobody 20 0 418.6m 149.2m 1.1m S 39.7 0.1 0:01.76 nginx: worker process
> 27661 nobody 20 0 418.6m 149.2m 1.1m S 22.7 0.1 0:01.63 nginx: worker process
> 27688 nobody 20 0 418.6m 149.2m 1.2m S 22.7 0.1 0:01.90 nginx: worker process
> 27697 nobody 20 0 418.6m 149.2m 1.1m S 17.0 0.1 0:00.95 nginx: worker process
> 27666 nobody 20 0 422.0m 152.3m 1.1m R 7.6 0.1 0:01.50 nginx: worker process
> 27701 nobody 20 0 419.3m 149.7m 1.1m S 1.9 0.1 0:00.01 nginx: worker process
> 27650 nobody 20 0 418.6m 149.9m 1.8m S 0.0 0.1 0:03.52 nginx: worker process
> 27658 nobody 20 0 418.6m 149.2m 1.1m S 0.0 0.1 0:01.30 nginx: worker process
> 27664 nobody 20 0 419.0m 149.5m 1.1m S 0.0 0.1 0:01.86 nginx: worker process
> 27669 nobody 20 0 418.6m 149.2m 1.1m S 0.0 0.1 0:00.35 nginx: worker process
> 27672 nobody 20 0 418.6m 149.2m 1.1m S 0.0 0.1 0:00.23 nginx: worker process
>
>
> а на F14:
>
> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
> 30042 nobody 20 0 1224m 955m 17m R 41.2 0.4 523:24.45 nginx: worker process
> 30038 nobody 20 0 1224m 955m 17m S 39.4 0.4 522:24.30 nginx: worker process
> 30047 nobody 20 0 1224m 955m 17m R 39.4 0.4 520:35.36 nginx: worker process
> 30053 nobody 20 0 1224m 955m 17m R 39.4 0.4 520:42.77 nginx: worker process
> 30027 nobody 20 0 1224m 955m 17m S 37.6 0.4 520:55.20 nginx: worker process
> 30036 nobody 20 0 1224m 955m 18m R 37.6 0.4 525:26.07 nginx: worker process
> 30037 nobody 20 0 1224m 955m 17m S 37.6 0.4 523:59.09 nginx: worker process
> 30041 nobody 20 0 1224m 955m 17m R 37.6 0.4 529:31.88 nginx: worker process
> 30049 nobody 20 0 1224m 954m 17m R 37.6 0.4 519:58.73 nginx: worker process
На F14, судя по цифрам, рабочий nginx, а не синтетические тесты, а
там распределение нагрузки по рабочим процессам совсем другое.
При этом судя по цифрам F19, nginx - недогружен, так что listen
queue overflows - возможно, являются просто следствие неверно
выбранного для подобных тестов размера listen queue. Могут,
впрочем, быть и другие причины, но для начала имеет смысл
исключить тривиальные.
> Кстати, если ставлю worker_connections 800 (worker_processes 40)
> и запускаю "ab -c1000 ..." -- то ab отваливается с ошибкой (на
> F19).
>
> Где же дальше копать?
Копать в сторону лучшего понимания того, как используется accept()
в nginx'е, что такое accept_mutex и зачем он нужен, а также всяких
ручек про multi_accept и listen ... backlog=N в nginx'е и
соответствующих ручек в ядре и утилит для их контроля
(net.core.somaxconn и ss -nlt на линуксе).
Простейшая рекомендация для тестов с дешёвыми запросами -
accept_mutex off, и поставить размер listen queue таким, чтобы
туда помещалось столько запросов, сколько система должна
обслуживать в секунду. Но следует иметь ввиду, что это
рекомендация именно для тестов, особенно в части accept_mutex off.
--
Maxim Dounin
http://nginx.org/en/donation.html
Подробная информация о списке рассылки nginx-ru