2017-12-24 13 views
0

私は8コアec2インスタンス(ubuntu 14.04、kernel = 3.13)でトルネードhttpサーバーを実行しており、16プロセスをプリフォークしています。フロントエンドでは、竜巻サーバへのnginxプロキシ要求があります。同じソケットでリッスンするときの複数のプロセス間のCPU時間の差が大きい

1秒あたり120回の着信要求があります。

ps aux | grep python

は、いくつかのプロセスのCPU時間が他よりも道が高いことを示している:要求の異なるタイプが異なるCPUコストを持って

root 5097 0.0 0.2 186224 33740 ? SNs Dec21 0:00 python src/app/server.py 
root 5157 0.0 0.2 497556 37212 ? SNl Dec21 1:58 python src/app/server.py 
root 5158 0.0 0.2 497808 37364 ? SNl Dec21 1:51 python src/app/server.py 
root 5159 0.5 0.2 501312 41152 ? SNl Dec21 22:17 python src/app/server.py 
root 5160 0.1 0.2 498876 38716 ? SNl Dec21 5:03 python src/app/server.py 
root 5161 0.0 0.2 497688 37232 ? SNl Dec21 2:14 python src/app/server.py 
root 5162 0.0 0.2 499104 38808 ? SNl Dec21 2:49 python src/app/server.py 
root 5163 0.0 0.2 498328 38004 ? SNl Dec21 3:36 python src/app/server.py 
root 5164 11.6 0.3 512692 52432 ? SNl Dec21 471:59 python src/app/server.py 
root 5165 0.1 0.2 498224 37996 ? SNl Dec21 4:11 python src/app/server.py 
root 5166 0.2 0.2 499700 39440 ? SNl Dec21 9:45 python src/app/server.py 
root 5167 0.1 0.2 498936 38780 ? SNl Dec21 6:36 python src/app/server.py 
root 5168 0.0 0.2 498364 38052 ? SNl Dec21 3:09 python src/app/server.py 
root 5169 1.5 0.2 504196 44048 ? SNl Dec21 64:47 python src/app/server.py 
root 5170 0.3 0.2 500492 40156 ? SNl Dec21 13:53 python src/app/server.py 
root 5171 0.0 0.2 498600 38264 ? SNl Dec21 2:30 python src/app/server.py 
root 5172 5.4 0.3 508692 48388 ? SNl Dec21 222:58 python src/app/server.py 

が、それは私が予想よりもはるかです。

また、CPU1は、他のコアよりも常に忙しいのようだ:

%Cpu0 : 0.0 us, 0.0 sy, 0.7 ni, 99.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
%Cpu1 : 0.3 us, 1.3 sy, 8.3 ni, 89.4 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st 
%Cpu2 : 0.0 us, 0.0 sy, 3.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 
%Cpu3 : 0.0 us, 0.0 sy, 4.0 ni, 95.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st 
%Cpu4 : 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st 
%Cpu5 : 0.0 us, 0.0 sy, 0.3 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 
%Cpu6 : 0.0 us, 0.0 sy, 1.3 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 
%Cpu7 : 0.0 us, 0.0 sy, 0.3 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 

しかしabを使用して、圧力テストを実行するときに、ログが要求は基本的に同じようにそれらのプロセスに配信されていることを示しています。

コード:

app = tornado.web.Application(routers) 
server = tornado.httpserver.HTTPServer(app) 
socks = tornado.netutil.bind_sockets(8000, '0.0.0.0') 
tornado.process.fork_processes(16) 
server.add_sockets(socks) 
io_loop = tornado.ioloop.IOLoop.current() 
io_loop.start() 

ような巨大な違いの原因である可能性がありますか?

+0

サンプルロギングでは、 '%cpu1'が最も低い値です。他のすべての人は十分に活用されているように見える。システムのどこかで輻輳が発生していないことは確かですか?ここで働く人々のための多くのコードがあります。このQはおそらく、 'tornado'特有のユーザーグループフォーラムに投稿される方が良いでしょう。がんばろう。 – shellter

+0

実際、私はこれが、異なるアプリケーションを実行しているいくつかの竜巻サーバーで起こっているのを見ています。 SO_REUSEPORTと何か関係があるかもしれないと思っていましたが、それを有効にしても差は出ませんでした。私は竜巻のユーザーグループに投稿する必要があります。ありがとう。 – Shaung

+0

応答待ち時間はどうですか?私は要求率が1つのコア/プロセスを十分に活用するのに十分高いとは思わない。 – georgexsh

答えて

0

リッスンソケットを複数のプロセス間で既定で共有すると、ロードバランシングがうまくいくわけではありませんが、負荷が重くなると問題が発生する場合があります(abがすべてのプロセスにわたって要求を配信するとわかります) 。

SO_REUSEPORTを使用して、の後にソケットをバインドすると、フォークは負荷を均等にすることができます。バランスのとれた負荷を確保するには、個別のロードバランサ(haproxyまたはnginxなど)を使用するのが最適です。

関連する問題