我在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()
造成这种巨大差异的原因是什么?
答案 0 :(得分:0)
跨多个进程的侦听套接字的默认共享并不能很好地实现负载平衡,尽管在负载很重要时它会趋于均匀(正如您在ab
分发时所看到的那样)所有流程的请求)。
使用SO_REUSEPORT
并在之后绑定套接字可以帮助平衡负载。使用单独的负载均衡器(例如haproxy
或nginx
)是确保均衡负载的最佳方法。