pidstat에서 보고한 이상한 CPU 사용량 값

pidstat에서 보고한 이상한 CPU 사용량 값

pidstat에서 값을 읽는 특정 프로그램의 CPU 사용량을 보고하는 스크립트가 있습니다. 스크립트는 다음과 같이 시작됩니다.

pidstat -C ^frontend$ -h -l -p ALL 1 1

이런 식으로 보고된 값은 때때로 CPU 사용량 100%를 초과할 수 있는데, 이는 프로세스가 단일 헤드이기 때문에 불가능합니다.

이 동작의 원인이 무엇인지 알아내기 위해 반복적으로 시도한 후 pidstat가 정보를 수집하는 데 걸리는 시간을 늘려 보았고 놀랍게도 값이 더 합리적인 경향이 있음을 발견했습니다.

pidstat -C ^frontend$ -h -l -p ALL 1 10
Linux 3.13.0-32-generic (eu-123)    09/22/2014  _x86_64_    (8 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396853     15884   28.43   29.41    0.00   57.84     1  /srv/propulsor/frontend-01/frontend 
 1411396853     15911   33.33   32.35    0.00   65.69     2  /srv/propulsor/frontend-02/frontend 
 1411396853     15968   58.82    0.00    0.00   58.82     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396854     15884  141.00    4.00    0.00  145.00     1  /srv/propulsor/frontend-01/frontend 
 1411396854     15911  143.00    5.00    0.00  148.00     2  /srv/propulsor/frontend-02/frontend 
 1411396854     15968   32.00   13.00    0.00   45.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396855     15884    0.00    0.00    0.00    0.00     1  /srv/propulsor/frontend-01/frontend 
 1411396855     15911    0.00    0.00    0.00    0.00     2  /srv/propulsor/frontend-02/frontend 
 1411396855     15968   32.00   32.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396856     15884   61.00    0.00    0.00   61.00     1  /srv/propulsor/frontend-01/frontend 
 1411396856     15911   69.00    0.00    0.00   69.00     2  /srv/propulsor/frontend-02/frontend 
 1411396856     15968   33.00   31.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396857     15884   30.00    7.00    0.00   37.00     1  /srv/propulsor/frontend-01/frontend 
 1411396857     15911   34.00   20.00    0.00   54.00     2  /srv/propulsor/frontend-02/frontend 
 1411396857     15968   32.00   32.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396858     15884   31.00   32.00    0.00   63.00     1  /srv/propulsor/frontend-01/frontend 
 1411396858     15911   34.00   33.00    0.00   67.00     2  /srv/propulsor/frontend-02/frontend 
 1411396858     15968  141.00    7.00    0.00  148.00     3  /srv/propulsor/frontend-03/frontend 

[snip]

비교:

root@eu-123 ~ # pidstat -C ^frontend$ -h -l -p ALL 3 10
Linux 3.13.0-32-generic (eu-123)    09/22/2014  _x86_64_    (8 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397159     15884   37.09   10.60    0.00   47.68     1  /srv/propulsor/frontend-01/frontend 
 1411397159     15911   30.46   29.80    0.00   60.26     2  /srv/propulsor/frontend-02/frontend 
 1411397159     15968   60.60   13.25    0.00   73.84     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397162     15884   29.33   29.33    0.00   58.67     1  /srv/propulsor/frontend-01/frontend 
 1411397162     15911   66.00    2.00    0.00   68.00     2  /srv/propulsor/frontend-02/frontend 
 1411397162     15968   41.00   15.00    0.00   56.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397165     15884   66.33    0.00    0.00   66.33     1  /srv/propulsor/frontend-01/frontend 
 1411397165     15911   30.00   19.67    0.00   49.67     2  /srv/propulsor/frontend-02/frontend 
 1411397165     15968   61.00   13.33    0.00   74.33     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397168     15884   30.00   23.33    0.00   53.33     1  /srv/propulsor/frontend-01/frontend 
 1411397168     15911   66.00   21.33    0.00   87.33     2  /srv/propulsor/frontend-02/frontend 
 1411397168     15968   42.00   15.67    0.00   57.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397171     15884   59.00   12.33    0.00   71.33     1  /srv/propulsor/frontend-01/frontend 
 1411397171     15911   30.00    0.67    0.00   30.67     2  /srv/propulsor/frontend-02/frontend 
 1411397171     15968   70.00   24.67    0.00   94.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397174     15884   37.67   11.00    0.00   48.67     1  /srv/propulsor/frontend-01/frontend 
 1411397174     15911   30.00   29.67    0.00   59.67     2  /srv/propulsor/frontend-02/frontend 
 1411397174     15968   33.00    4.67    0.00   37.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397177     15884   65.33   21.67    0.00   87.00     1  /srv/propulsor/frontend-01/frontend 
 1411397177     15911   65.67    2.33    0.00   68.00     2  /srv/propulsor/frontend-02/frontend 
 1411397177     15968   32.33   32.00    0.00   64.33     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397180     15884   29.00    0.00    0.00   29.00     1  /srv/propulsor/frontend-01/frontend 
 1411397180     15911   30.00   19.33    0.00   49.33     2  /srv/propulsor/frontend-02/frontend 
 1411397180     15968   70.00    2.33    0.00   72.33     3  /srv/propulsor/frontend-03/frontend 

[snip]

좋아, 이제는 더 합리적으로 보이지만 내 질문은 남아 있습니다. 무엇이 그러한 차이를 만드는가? pidstat 1 1 반환 값이 어떻게 100%를 초과할 수 있습니까?

보너스 질문: 프로세스의 CPU 사용량을 추적하려면 다른 도구를 사용해야 합니까?

미리 감사드립니다

편집: 저는 이 문제를 조사해 왔습니다. 잠시 후(즉, 약 2주 정도) 프로세스가 이와 같은 이상한 일을 시작하는 것 같습니다. 동시에 프로세스에서 처리하는 연결 수가 증가하는 것을 확인했습니다.

관찰된 동작은 CPU 사용량이 일관되게 0%인 상태에서 여러 pidstat 실행을 얻은 다음 예상 CPU 사용량 값 내에서 유지하기 위해 평균 10분의 1 정도의 스파이크가 발생하는 것입니다.

나는 응용 프로그램이 연결 풀을 통해 일부 시스템 호출을 반복하고 있다고 생각하기 시작했습니다. 그리고 잠시 후 연결 풀이 충분히 커져 통계를 쓰지 않아 /proc/pidstat가 사용량이 0%라고 믿게 됩니다. 따라서 0에서 몇 라운드 후에 사용량이 >100%에 도달했습니다.

프로세스는 언제 /proc/데이터를 쓰나요? 내가 이해한 바에 따르면 pidstat는 해당 정보를 사용하여 CPU 사용량을 계산합니다. 아니면 제가 틀렸습니까?

누군가가 이 문제에 대해 밝힐 수 있기를 바랍니다.

관련 정보