【发布时间】: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