【问题标题】:Huge CPU time difference between multiple processes when listening on the same socket在同一个套接字上侦听时,多个进程之间的巨大 CPU 时间差异
【发布时间】:2017-12-24 08:12:16
【问题描述】:

我在 8 核 ec2 实例(ubuntu 14.04,kernel=3.13)上运行一个 tornado http 服务器,预分叉 16 个进程。在前端,有一个 nginx 代理请求到 tornado 服务器。

每秒有 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()

造成如此巨大差异的原因是什么?

【问题讨论】:

  • 在您的示例日志记录中,%cpu1 是最低使用率。所有其他看起来都得到了很好的利用。您确定系统的其他地方没有发生拥塞吗?人们可以在这里使用很多代码。最好将此 Q 发布到 tornado 特定用户组论坛。祝你好运。
  • 实际上,我在运行不同应用程序的几台龙卷风服务器中看到了这种情况。我认为可能与 SO_REUSEPORT 有关,但启用它并没有任何区别,而且你是对的。我应该发布到龙卷风用户组。谢谢。
  • 响应延迟如何?我猜请求率不够高,无法充分利用一个核心/进程。

标签: python linux sockets tornado httpserver


【解决方案1】:

在多个进程之间默认共享一个侦听套接字并不能很好地平衡负载,尽管当它在重负载下很重要时趋于平衡(正如你看到 ab 将其请求分配给所有进程时)。

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

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多