在同一个套接字上侦听时,多个进程之间的CPU时差很大

时间:2017-12-24 08:12:16

标签: python linux sockets tornado httpserver

我在8核ec2实例(ubuntu 14.04,内核= 3.13)上运行龙卷风http服务器,预先执行了16个进程。在前端,有一个nginx代理请求龙卷风服务器。

每秒有120个传入请求。

ps aux | grep python表示某些进程的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

虽然不同类型的请求具有不同的cpu成本,但它远远超出我的预期。

此外,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()

造成这种巨大差异的原因是什么?

1 个答案:

答案 0 :(得分:0)

跨多个进程的侦听套接字的默认共享并不能很好地实现负载平衡,尽管在负载很重要时它会趋于均匀(正如您在ab分发时所看到的那样)所有流程的请求)。

使用SO_REUSEPORT并在之后绑定套接字可以帮助平衡负载。使用单独的负载均衡器(例如haproxynginx)是确保均衡负载的最佳方法。