2016-10-12 13 views
1

Я управляю своим большим, общедоступным веб-приложением. Это базовый сервер HTTP-сервера python, который отвечает на тысячи HTTP-запросов в минуту. Он написан с Flask & SQLAlchemy. Приложение работает на EC2 в AWS. Тип экземпляра - c3.2xlarge (он имеет 8 процессоров).Почему не распределяется работа между рабочими артиллеристами равномерно?

Я использую Gunicorn в качестве своего веб-сервера. Гуникорн имеет 17 рабочих процессов и 1 мастер-процесс. Ниже вы можете увидеть рабочий 17 gunicorn:

$ sudo ps -aefF | grep gunicorn | grep worker | wc -l 
17 

$ sudo ps -aefF --sort -rss | grep gunicorn | grep worker 
UID  PID PPID C  SZ  RSS PSR STIME TTY  TIME       CMD 
my-user 15708 26468 6 1000306 3648504 1 Oct06 ? 08:46:19 gunicorn: worker [my-service] 
my-user 23004 26468 1 320150 927524 0 Oct07 ? 02:07:55 gunicorn: worker [my-service] 
my-user 26564 26468 0 273339 740200 3 Oct04 ? 01:43:20 gunicorn: worker [my-service] 
my-user 26562 26468 0 135113 260468 4 Oct04 ? 00:29:40 gunicorn: worker [my-service] 
my-user 26558 26468 0 109946 159696 7 Oct04 ? 00:15:14 gunicorn: worker [my-service] 
my-user 26556 26468 0 125294 148180 6 Oct04 ? 00:13:07 gunicorn: worker [my-service] 
my-user 26554 26468 0 120434 128016 5 Oct04 ? 00:10:13 gunicorn: worker [my-service] 
my-user 26552 26468 0 99233 116832 5 Oct04 ? 00:08:24 gunicorn: worker [my-service] 
my-user 26550 26468 0 94334 96784 0 Oct04 ? 00:05:28 gunicorn: worker [my-service] 
my-user 26548 26468 0 92865 90512 2 Oct04 ? 00:04:47 gunicorn: worker [my-service] 
my-user 27887 26468 1 91945 86564 0 17:44 ? 00:02:57 gunicorn: worker [my-service] 
my-user 26546 26468 0 127841 84464 5 Oct04 ? 00:03:39 gunicorn: worker [my-service] 
my-user 26544 26468 0 90290 80736 2 Oct04 ? 00:03:12 gunicorn: worker [my-service] 
my-user 26540 26468 0 107669 78176 5 Oct04 ? 00:02:33 gunicorn: worker [my-service] 
my-user 26542 26468 0 89446 76616 5 Oct04 ? 00:02:49 gunicorn: worker [my-service] 
my-user 26538 26468 0 88056 72028 5 Oct04 ? 00:02:02 gunicorn: worker [my-service] 
my-user 26510 26468 0 106046 70836 2 Oct04 ? 00:01:49 gunicorn: worker [my-service] 

Я изучает журналы всех запросов HTTP, которые пришли в течение последних 7 дней. Я сгруппировал и суммировал запросы по идентификатору процесса, который вы можете увидеть во мне, ps. Ниже вы можете увидеть полученный граф.

Как вы можете видеть, 5 рабочих-пулеметчиков выполняют почти 100% работы. Остальные 12 в основном бездействуют. И из этих 5 один работник (PID # 15708) делает большую часть работы.

Почему это происходит? Я хотел бы понять алгоритм, который использует gunicorn для распространения работы среди своих работников. Это определенно не круто? Где я могу увидеть используемую им стратегию и как ее настроить? Что может объяснить рост и падение этого графика? (Например, PID # 332 выполнял большую работу до 7 октября, когда он начал снижаться и был настигнут ростом PID # 15708)

Было бы полезно пояснить пояснения и/или ссылки на соответствующую документацию.

enter image description here

+0

Какое среднее время отклика? Если я не ошибаюсь в 8 октября, он работает с 11,5 злотых, если они достаточно короткие запросы, тогда нагрузка может быть взята несколькими рабочими. Кроме того, в соответствии с вопросом ниже, это только синхронные работники? Если нет, это изменит работу каждого работника. –

+0

Что такое rps? Это запросы в секунду? Я рассчитываю 14,1 запросов в секунду 8 октября: (628929 + 150725 + 7317 + 7949 + 11581 + 13532 + 13972 + 84253 + 285848 + 14405)/(60 * 60 * 24). В течение продолжительности показанного графика среднее время отклика составляло 0,041 секунды. Класс рабочих - 'gevent_pywsgi'. –

+0

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

ответ

2

Согласно документации:

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

И:

Gunicorn зависит от операционной системы, чтобы обеспечить все балансировки нагрузки при обработке запросов.

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

Возможно, вы можете безопасно снизить число работников ((2 x num cores) + 1 - это только стартовая рекомендация). Это уменьшит возможность извлечения ресурсов и может улучшить производительность вашего приложения.

+0

Класс рабочих - 'gevent_pywsgi' - не синхронные рабочие по умолчанию. Когда они говорят «связанный с ресурсами», что именно это означает? Я также не понимаю, что значит сказать: «ОС обеспечивает всю балансировку нагрузки». Означает ли это, когда работа ждет, рабочий, который ее принимает, определяется ОС полностью независимым от кода и конфигурации пушки? –