프로세스가 오랫동안 실행된 후의 실행 시간 및 리소스

프로세스가 오랫동안 실행된 후의 실행 시간 및 리소스

어쩌면 기본적인 질문일지도 모르지만 답을 찾는 데 어려움을 겪고 있습니다. RHEL6을 사용하고 있습니다. CPU 시간이 많이 걸리는 프로세스를 실행한 후에는 런타임 및 IO 사용량을 자동으로 알려주는 라인이 표시됩니다. 다음과 같이 읽습니다:

77410.101u 124.968s 1:42:43.49 657.9%    0+0k 0+1353384io 0pf+0w

다음과 같은 질문이 있습니다.

  1. 이 메시지의 각 필드를 어떻게 해석합니까? 타이밍, IO 사용량, CPU 사용량 등을 추측할 수 있지만 확실하지 않습니다.
  2. 실제로 이 줄을 인쇄하는 것은 무엇입니까? 껍질인가요? 터미널 에뮬레이터인가요? 이를 처리하기 위해 실행되는 데몬이 있습니까? 그 기능/서비스/그것이 무엇이든.
  3. 이 메시지를 제어할 수 있나요? 예를 들어, 인쇄를 위한 CPU 사용량 임계값을 설정하시겠습니까?
  4. 추가 정보를 추가할 수 있나요? 예를 들어 프로세스의 절대 경로, 최대 메모리 사용량, 최대 디스크 사용량 등...

답변1

현재 상황 디버깅을 위한 팁

Bash를 사용하고 있다고 가정하고 셸의 디버깅 도구를 켜는 것이 좋습니다.

$ set -x

이 출력은 이 출력을 생성한 명령을 실행할 때 뒤에서 일어나는 일을 보여줍니다.

산출

/usr/bin/time이 출력은 실행하는 각 명령에 대한 prefix time 명령 에서 나옵니다 . 이 출력을 얻으려면 C-shell(csh) 또는 Turbo C-shell(tcsh)을 사용하고 있는 것 같습니다.

$ tcsh
$ time sleep 2
0.000u 0.000s 0:02.00 0.0%  0+0k 0+0io 0pf+0w

이것이 쉘이라고 의심되는 이유 tcsh는 Bash 쉘에서 명령을 실행할 때 /usr/bin/time출력이 다음과 같기 때문입니다.

$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.02elapsed 0%CPU (0avgtext+0avgdata 580maxresident)k
0inputs+0outputs (0major+180minor)pagefaults 0swaps

-f또는 스위치를 사용하여 출력을 제어할 수 있으므로 --format표시되는 출력은 Bash에서도 얻을 수 있지만 의도적으로 수행해야 합니다.

출력 의미

/usr/bin/time상세 모드( )에서 명령을 실행하면 -v다음과 같이 각 필드에 대한 모든 세부 정보를 얻을 수 있습니다.

$ /usr/bin/time -v sleep 2
    Command being timed: "sleep 2"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 584
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 184
    Voluntary context switches: 2
    Involuntary context switches: 4
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

원본 출력을 정렬하는 경우:

77410.101u 124.968s 1:42:43.49 657.9%    0+0k 0+1353384io 0pf+0w
^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^ ^^^^^^    ^^^^ ^^^^^^^^^^^ ^^^^^^
     1        2         3       4         5        6        7
  1. 사용자 시간(초)
  2. 시스템 시간(초)
  3. 경과(벽시계) 시간(h:mm:ss 또는 m:ss)
  4. 이 작업이 차지하는 CPU 비율
  5. 평균 공유 텍스트 크기(킬로바이트) + 평균 비공유 데이터 크기(킬로바이트)
  6. 프로세스의 파일 시스템 입력 수 + 프로세스의 파일 시스템 출력 수
  7. 프로세스가 실행되는 동안 발생한 주요 페이지 오류 수입니다. 디스크에서 페이지를 읽어야 하는 오류 + 프로세스가 주 메모리에서 스왑 아웃된 횟수입니다.

다음과 같이 동일한 형식을 수동으로 수행할 수 있습니다.

$ /usr/bin/time -f '%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww' sleep 2
0.00u 0.00s 0:02.00 0% 0+0k 0+0io 0pf+0w

사용자 정의 출력

/usr/bin/time호출이 이루어진 위치를 결정할 수 있게 되면 매뉴얼 페이지에서 피크를 가져와서 출력을 사용자 정의할 수 있습니다 time. 이 출력에는 많은 옵션이 포함될 수 있습니다.

$ man time

발췌

   Time
   %E     Elapsed real time (in [hours:]minutes:seconds).
   %e     (Not in tcsh.) Elapsed real time (in seconds).
   %S     Total number of CPU-seconds that the process spent in kernel mode.
   %U     Total number of CPU-seconds that the process spent in user mode.
   %P     Percentage of the CPU that this job got, computed as (%U + %S) / %E.

   Memory
   %M     Maximum resident set size of the process during its lifetime, in Kbytes.
   %t     (Not in tcsh.) Average resident set size of the process, in Kbytes.
   %K     Average total (data+stack+text) memory use of the process, in Kbytes.
   %D     Average size of the process's unshared data area, in Kbytes.
   %p     (Not in tcsh.) Average size of the process's unshared stack space, in Kbytes.
   %X     Average size of the process's shared text space, in Kbytes.
   %Z     (Not in tcsh.) System's page size, in bytes.  This is a per-system constant, but varies between systems.
   %F     Number  of major page faults that occurred while the process was running.  These are faults where the page has to be read
          in from disk.
   %R     Number of minor, or recoverable, page faults.  These are faults for pages that are not valid but which have not yet  been
          claimed by other virtual pages.  Thus the data in the page is still valid but the system tables must be updated.
   %W     Number of times the process was swapped out of main memory.
   %c     Number of times the process was context-switched involuntarily (because the time slice expired).
   %w     Number of waits: times that the program was context-switched voluntarily, for instance while waiting for an I/O operation
          to complete.

   I/O
   %I     Number of file system inputs by the process.
   %O     Number of file system outputs by the process.
   %r     Number of socket messages received by the process.
   %s     Number of socket messages sent by the process.
   %k     Number of signals delivered to the process.
   %C     (Not in tcsh.) Name and command-line arguments of the command being timed.
   %x     (Not in tcsh.) Exit status of the command.

자세한 내용은 매뉴얼 페이지를 참조하십시오.

편집 #1: 귀하의 질문

자동으로 출력을 표시하는 문제는 csh/tcsh의 이 환경 변수 설정으로 인해 발생하는 것으로 나타났습니다.

tcsh 매뉴얼 페이지에서

   The time shell variable can be set to execute the time builtin command 
     after the completion of any process that takes more  than a given number 
     of CPU seconds.

시간을 5초로 설정합니다.

$ set time=5

확인하다:

$ set|grep time
time    5

테스트를 받아보세요:

$ bash -c "while [ 1 ];do echo hi; done"
hi
hi
...
...waited ~5 seconds, then Ctrl-C to stop it

5.650u 1.471s 0:09.68 73.5% 0+0k 0+0io 0pf+0w

실행 중인 작업이 변수에 설정된 시간(초)보다 더 많은 CPU 시간을 소비하는 경우에만 출력이 나타납니다 $time.

인용하다

관련 정보