사용자 당 총 CPU 시간을 모니터링하는 가장 좋은 방법은 무엇입니까?


25

다중 사용자 시스템에서 CPU 시간을 초 단위로 각 사용자의 CPU 사용량을 측정하고 싶습니다. 이 측정을 위해 PID가 사용자에게 속하는 경우이 사용자가 CPU 시간을 유발한다고 가정합니다. 즉, 데몬과 커널을 무시하고 있습니다.

현재 5 초 마다이 작업을 수행하고 있습니다.

  1. 각 사용자와 그들이 실행하고있는 PID를 얻습니다 ps aux
  2. 각 PID를 들어, 수 x의 합 utime와, cutime, STIME 및 cstime을에서/proc/[pid]/stat
  3. 계산 t = x / interval(부하가 높을 때 간격이 항상 정확히 5 초인 것은 아님)

이것을 실행하면 합리적인 가치를 얻을 수 있습니다. 예를 들어,이 시스템의 사용자는 파이썬 ( while True: pass) 으로 회전 하고 있으며 시스템은 초당 약 750 밀리 초의 CPU 시간을 표시합니다. 시스템이 잠시 정지했을 때 1 초의 1 초 동안 1600ms를보고했습니다. 어느 것이 옳은 것처럼 보이지만, 나는 실제로 가치를 이해 하지 못한다면 이러한 가치를 결정할 수 있다는 것을 이해 하지 못합니다 .

그래서 내 질문은 이것입니다 :

사용자별로 CPU로드를 측정하는 공정하고 올바른 방법은 무엇입니까?

방법은 다소 정확해야합니다. 이 시스템에는 수백 명의 사용자가있을 수 있으므로 백분율을 추출하는 ps aux것은 특히 정확하지 않을 것입니다. 특히 많은 소프트웨어 조각이 생성되는 단기 스레드에 대해서는 그렇습니다.

이것은 복잡 할 수 있지만 가능하다는 것을 절대적으로 알고 있습니다. 이것이 나의 출발점이었습니다.

커널은 프로세스 생성 시간과 수명 동안 소비 한 CPU 시간을 추적합니다. 각 클럭 틱마다 커널은 현재 프로세스가 시스템 및 사용자 모드에서 소비 한 시간을 지프 단위로 업데이트합니다. — ( Linux 문서 프로젝트에서 )

내가 따르는 값은 시스템로드 또는 CPU 사용량의 백분율이 아닌 사용자가 CPU에 소비 한 초 (또는 지프)입니다.

프로세스가 계속 실행되는 동안 CPU 시간을 측정하는 것이 중요합니다. 일부 프로세스는 0.5 초 동안 만 지속되고 일부 프로세스는 몇 개월 동안 지속될 수 있으며, 두 가지 유형을 모두 잡아야 세밀하게 사용자의 CPU 시간을 처리 할 수 ​​있습니다.


1
500 명예 :
초보자를

: A는 내 리그의 밖으로 비트,하지만 매우 흥미로운 질문 나는 조금 파고 I 희망 당신이 해결하는 데 도움이 적어도 유용하다는 것을 발견 그래서 stackoverflow.com/a/1424556/905573
kingmilo

1
top배치 모드 를 수행 할 수 있다는 것을 알고 있습니까? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'그 순간 {user}의로드를 표시해야합니다.
Rinzwind

답변:


11

프로세스 회계가 필요한 것 같습니다.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

우분투에서 프로세스 회계 도구는 acct패키지에 있습니다. acct 설치

사용자 별 보고서를 얻으려면 다음을 실행하십시오.

sa -m

불행히도, "sa"는 오래 실행되는 프로세스를 계산하지 않으므로 나에게는 효과가 없습니다. 내가 필요로하는 것은 시작 및 종료되는 프로세스를 감지하고 프로세스가 종료되는 동안뿐만 아니라 실행중인 동안 CPU 시간을 기록하는 방법입니다.
Stefano Palazzo

@StefanoPalazzo 나는 이것이 당신이 얻을 수있는 최선이라고 생각합니다. 에서 프로세스를 실행하는 시간을 늘리십시오 /proc/[pid]/stat.
ændrük

결과적으로 대부분의 모든 프로세스 sa(.ps.gz)에 의해 올바르게 설명됩니다 . 또한 장기적으로 실행되는 프로세스를 "추정"할 수있는 좋은 방법이 있습니다. 우리는 결국 그것을 사용할 것이며, 나는 당신의 답변에 현상금을 수여하게되어 기쁩니다. 무리 감사!
Stefano Palazzo

3

그러면 각 사용자에게 사용자 이름과 총 CPU 시간을 보여주는 줄이 나타납니다.

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

더 확실한 답변 중 하나는 현재하고있는 작업을 확장하는 것입니다.

나는 bash 스크립팅과 mysql을 사용하여 사용자의 CPU 시간을 추적하기 위해이 모니터 프로세스를 보았지만 이야기했던 것보다 훨씬 더 큰 시간 범위에 걸쳐있었습니다.

바라건대 이것은 당신이 향하고있는 방향에 대한 더 많은 아이디어를 줄 수 있기를 바랍니다.

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm


0

며칠 동안 실행 된 프로세스도 처리합니다. 주 / 월 / 년 동안 확장하는 방법을 잘 모르겠습니다.

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.