Я управляю своим большим, общедоступным веб-приложением. Это базовый сервер 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)
Было бы полезно пояснить пояснения и/или ссылки на соответствующую документацию.
Какое среднее время отклика? Если я не ошибаюсь в 8 октября, он работает с 11,5 злотых, если они достаточно короткие запросы, тогда нагрузка может быть взята несколькими рабочими. Кроме того, в соответствии с вопросом ниже, это только синхронные работники? Если нет, это изменит работу каждого работника. –
Что такое rps? Это запросы в секунду? Я рассчитываю 14,1 запросов в секунду 8 октября: (628929 + 150725 + 7317 + 7949 + 11581 + 13532 + 13972 + 84253 + 285848 + 14405)/(60 * 60 * 24). В течение продолжительности показанного графика среднее время отклика составляло 0,041 секунды. Класс рабочих - 'gevent_pywsgi'. –
Я, должно быть, пропустил номер при добавлении их извинения. Но да, это то, что это запросы в секунду.Несколько рабочих могли легко справиться с учетом масштаба времени, на который мы смотрим. Вспышки в запросах, вероятно, являются причиной того, что другие используются. –