2016-10-12 6 views
1

私は大規模な公開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日までに最も多くの仕事をしていました)

明確な説明は参考になるかもしれません。

enter image description here

+0

平均応答時間はどのくらいですか? 10月8日に間違っていなければ、合理的に短命の要求であれば平均11.5 rpsで動作し、2人の作業者によって負荷がかかる可能性があります。また、以下の質問によると、これらは単に同期の作業者ですか?もしそうでなければ、それは各労働者が取り扱っているものに変わります。 –

+0

rpsとは何ですか?それは1秒あたりのリクエストですか? 10月8日に、毎秒14.1件のリクエストを計算しています。(628929 + 150725 + 7317 + 7949 + 11581 + 13532 + 13972 + 84253 + 285848 + 14405)/(60 * 60 * 24)示されたグラフの期間にわたって、平均応答時間は0.041秒であった。労働者のクラスは 'gevent_pywsgi'です。 –

+0

申し訳ありません。しかし、それはまさにそれが毎秒要求するものです。数人の労働者が、私たちが見ている時間スケールに基づいて容易に対応することができました。要求の破裂はおそらく他のものを使用させている原因です。 –

答えて

2

ドキュメントによると:

デフォルト同期の労働者は、アプリケーションがCPUとネットワーク帯域幅の面でリソース結合型で​​あることを前提としています。

そして:

Gunicornは、リクエストを処理する際に、負荷分散のすべてを提供するために、オペレーティングシステムに依存しています。

これらの2つのステートメントに基づいて、大多数の作業を行っている1人の作業者はほとんどリソースに束縛されていないと言います。リソースに束縛されると、他の4人のワーカーは、他の人を呼び出す必要なしに追加の負荷を処理するのに十分です。

労働者の数を安全に減らすことができます((2 x num cores) + 1は最初の推奨事項です)。これにより、リソースのスラッシングの可能性が減り、アプリケーションのパフォーマンスが向上する可能性があります。

+0

労働者のクラスはデフォルトの同期労働者ではなく、 'gevent_pywsgi'です。彼らが「資源に縛られている」と言うとき、それはどういう意味ですか? 「OSがすべてのロードバランシングを提供している」とはどういう意味かはっきりしていません。それは、仕事が待っているとき、それを取る労働者は、OSによって完全にガンコンのコードと構成とは無関係に決定されますか? –

関連する問題