私は大規模な公開Webアプリケーションを実行しています。 1分間に何千ものHTTPリクエストに応答するPython HTTPバックエンドサーバーです。 Flask & SQLAlchemyで書かれています。 AWSのEC2で実行されているアプリケーション。インスタンスのタイプはc3.2xlarge(8 CPU)です。仕事がガンコルンの労働者に均等に分配されないのはなぜですか?
私はWebサーバーとしてGunicornを使用しています。 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]
私は、過去7日間に渡って来たすべてのHTTP要求のログを調べています。私は上記のps
コマンドで私が見ることができるプロセスIDによって要求をグループ化し、合計しました。下に結果グラフが表示されます。
ご覧のとおり、5人のガンコーンの労働者がほぼ100%の作業をしています。残りの12は基本的にアイドルです。これらの5人のうち、1人の作業者(PID#15708)が最も多くの作業を行っています。
どうしてですか?ガンコーンがその作業者の間で作業を配布するために使用するアルゴリズムを理解したいと思います。それは間違いなくラウンドロビンではないのですか?どの戦略が使用されているのか、どのように調整することができますか?このグラフの上昇と下降については何が説明できますか? (例えば、PID#332は、10月7日まで減少傾向にあり、PID#15708の上昇によって追い越された10月7日までに最も多くの仕事をしていました)
明確な説明は参考になるかもしれません。
平均応答時間はどのくらいですか? 10月8日に間違っていなければ、合理的に短命の要求であれば平均11.5 rpsで動作し、2人の作業者によって負荷がかかる可能性があります。また、以下の質問によると、これらは単に同期の作業者ですか?もしそうでなければ、それは各労働者が取り扱っているものに変わります。 –
rpsとは何ですか?それは1秒あたりのリクエストですか? 10月8日に、毎秒14.1件のリクエストを計算しています。(628929 + 150725 + 7317 + 7949 + 11581 + 13532 + 13972 + 84253 + 285848 + 14405)/(60 * 60 * 24)示されたグラフの期間にわたって、平均応答時間は0.041秒であった。労働者のクラスは 'gevent_pywsgi'です。 –
申し訳ありません。しかし、それはまさにそれが毎秒要求するものです。数人の労働者が、私たちが見ている時間スケールに基づいて容易に対応することができました。要求の破裂はおそらく他のものを使用させている原因です。 –