2017-12-24 25 views
0

저는 8 코어 ec2 인스턴스 (우분투 14.04, 커널 = 3.13)에서 토네이도 http 서버를 실행 중이며 16 개의 프로세스를 사전 포킹합니다. 프론트 엔드에는 토네이도 서버에 대한 nginx 프록시 요청이 있습니다.동일한 소켓에서 수신 대기 할 때 여러 프로세스 간의 거대한 CPU 시간 차이

초당 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 

있지만, 그러나 그것은 내가 기대했던 것보다 훨씬 더.

%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를 사용하여 압력 테스트를 수행 할 때, 로그 요청은 기본적으로 동일하게 해당 프로세스에 분포되어 있음을 나타냅니다 :

또한, CPU1 다른 코어에 비해 항상 바쁜 것 같다.

코드 :

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는 아마도 '토네이도'특정 사용자 그룹 포럼에 게시하는 것이 좋습니다. 행운을 빕니다. – shellter

+0

사실 여러 응용 프로그램을 실행하는 여러 대의 토네이도 서버에서이 문제가 발생합니다. SO_REUSEPORT와 관련이 있을지도 모른다고 생각했지만, 활성화해도 아무런 차이가 없었습니다. 그리고 당신 말이 맞습니다. 토네이도 사용자 그룹에 게시해야합니다. 감사. – Shaung

+0

응답 대기 시간은 어떻게됩니까? 요청 비율이 하나의 핵심/프로세스를 완전히 활용할만큼 충분히 높지는 않습니다. – georgexsh

답변

0

여러 프로세스에서 수신 대기 소켓을 기본 공유하면 부하가 많은 상태에서 문제가 될 때 평평한 경향이 있지만 (이 경우 모든 프로세스에서 요청을 분배 할 때 표시되는 것처럼) .

SO_REUSEPORT을 사용하고 다음에 소켓 을 바인딩하면 포크가로드를 균일하게하는 데 도움이됩니다. 로드 밸런서를 별도로 사용하면 (예 : haproxy 또는 nginx) 균형있는로드를 보장하는 가장 좋은 방법입니다.