2017-12-04 13 views
0

내에 epoll_wait를 소비, 간단한 strace를가 있음을 보여줍니다)에 epoll_wait()가 너무 많은 CPU를 소모) (너무 많은 CPU를

strace -c -f -p 3655 
    Process 3655 attached with 5 threads 
    ^CProcess 3655 detached 
    Process 3656 detached 
    Process 3657 detached 
    Process 3658 detached 
    Process 3659 detached 
    % time  seconds usecs/call  calls errors syscall 
    ------ ----------- ----------- --------- --------- ---------------- 
    64.43 32.228205  596819  54   epoll_wait 
    35.31 17.661939   17 1063312 195547 futex 
     0.26 0.131803   0 448140   gettimeofday 
     0.00 0.000090   3  27   write 
     0.00 0.000050   1  54   epoll_ctl 
     0.00 0.000000   0  54  27 read 
     0.00 0.000000   0   9   sendmsg 
     0.00 0.000000   0  90  54 recvmsg 
    ------ ----------- ----------- --------- --------- ---------------- 
    100.00 50.022087    1511740 195628 total 

가 (단지 54에 epoll_wait가 호출하지만 usecs /에 epoll_wait의 호출() 왜 596819입니까?

답변

1

이 경우 strace에 의해보고 된 시간은 약간 오도하는 것입니다. ,

-c 카운트 시간을 호출하고, 각 시스템 호출에 대한 오류 및 프로그램 종료에 요약보고 :

strace(1)은 우리에게 알려줍니다. 리눅스에서는 시스템 시간을 (커널에서 실행되는 CPU 시간)과 벽시계 시간과 무관하게 표시하려고 시도합니다.

는하지만 무엇을 실제로 세고 것은 그냥을 반환 할 때까지 epoll_wait가 호출 될 때까지의 시간이다 생각한다. 그렇다고 커널에서 프로세스가 "running" 인 것은 아닙니다. 자고있는 확률이 훨씬 높습니다. 이는 epoll_wait의 경우 자연스러운 현상입니다.

+0

strace가 CPU 시간을 계산하는 방법에 대해서는 잘 모르겠지만 실제로 프로세스는 2 코어 머신에서 CPU의 130 %를 사용했습니다. –

+0

@ Wenlin.Wu 흥미 롭습니다. 최소한의 프로그램을 가지고 있습니까? 'epoll_wait'는 프로세스를 대기 큐에 넣어야합니다. 상당한 CPU 시간을 버는 것은 버그처럼 들립니다. – cnicutar

+0

참으로 내 Bind DNS 서비스이고 Bind의 알려진 버그입니다. https://bugzilla.redhat.com/show_bug.cgi?id=709205를 참조하십시오. 어떻게 이런 일이 발생하는지 모릅니다. –