FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

time명령의 -f 옵션 활용하여 시스템 분석방법

게시판 Tech/Tip time명령의 -f 옵션 활용하여 시스템 분석방법

  • This topic has 1개 답변, 2명 참여, and was last updated 9 years 전에 by 딱털서어. This post has been viewed 14 times
  • 만든이
    게시글
  • #12191
    인베인
    참가자
    • 게시글141
    • 댓글379
    • 총합520
    • ★★
    @leemgs

    time명령의 -f 옵션 활용하여 시스템 분석방법
    ==============================================
               2011.12.16

    [목차]
    1. time이란?
    2. rea, user, sys의 출력결과 올바르게 이해하기
    3. -f명령을 통한 프로세스/쓰레드의 CPU & Memory 자원 사용내역 분석

    #### 1. time이란?
    특정 명령을 실행후 실행완료하기까지 소요되는 시간이 얼마나 되는지 알기 위해서
    time 명령을 사용합니다.
    time명령은 실행 결과로써 콘솔화면에 real, user, system 값을 출력합니다.

    #### 2. rea, user, sys의 출력결과 올바르게 이해하기
    실제로 대다수의 개발자들이 real, user, system 출력값의 해석에 대해 정확하게 이해하지
    못하고 있는 경우가 많습니다.
    예를 들어, "#>time make -j4 modules" 의 실행결과가 아래와 같을 경우에 대해서 해석해 보겠습니다.
    real 44m40.804s
    user 74m40.316s
    sys   7m43.553s

    일반적으로 위의 명령 실행 결과에 대해서
    User + Sys = Real이라고 이해하는 사람이 많습니다.
    하지만, 이렇게 이해할 경우 User(74m) + Sys(7m)  > Real(44m)이 됩니다.
    우리의 상식대로라면, time명령 자체가 문제가 있거나, 우리의 지식에 뭔가 문제가 있음을 알수 있습니다.

    따라서, 이제 User와 Sys의 출력값에 대한 정확한 이해가 필요합니다.
    ( #> man time 을 통해 나오는 내용이 요약 설명이라서, 실상 time의 출력값을 올바르게 이해하는것이 쉽지만은 않습니다. )

    * Real: 이 값은 gettimeofday()시스템콜을 사용하여 특정명령 사용전의 시간, 특정명령 사용후의 시간을
    계산하여 그 차이값을 출력해줍니다. 즉, 특정명령을 실행후 완료되기까지 실제로 소요되는 시간의 값입니다.

    * User: User Space에서 특정명령이 실행되는 시간동안 실제로 사용되었던 CPU의 갯수

    * Sys: Kernel Space에서 특정명령이 실행되는 시간동안 실제로 사용되었던 CPU의 갯수

    위의 설명을 토대로 Sys, User, Real의 관계를 수식으로 표현해 보겠습니다.
    아래의 공식을 통해서 우리가 한가지 정보를 정성적/정량적(?)으로  알수 있겠습니다.

    User+Sys의 합산값을 통해서 특정명령을 실행하는 동안에
    실제로 몇개의 CPU가 사용이 되었는지를 계산해낼수 있게됩니다.

    1) [sys time of CPU] + [usr time of CPU] = [real time of command] * [the num of CPUs spent actually during execution time]

    2) [the num of CPUs spent actually during execution] =(usr+sys) / real

    예를 들어, 1개 이상의 CPU가 있게 된다면, 아래처럼 아마도 100% CPU 시간 이상의 수치값을 얻게 될 것입니다.
    user   670.37
    system 79.64
    real   106.39
    CPUs   704%  

    위의 결과를 이해하기 위해서 한번 계산 해봅시다.
    670.37(user) + 79.64(sys) = 750.01 CPU시간이 됩니다. 이는, 750.01 / 106.30(real) = 7.04가 됩니다.

    이처럼 user,sys값을 활용해서 특정 명령을 수행하는 동안에
    실제로 CPU들이 사용된 평균갯수는 7.04개의 CPU가 됨을 우리는 알수 있습니다.

    #### 3. -f 명령을 통한 프로세스/쓰레드의 CPU & Memory 자원 사용내역 분석

    time 명령을 통해 이것 외에도 특정 명령에 대한 시스템 분석 목적으로도 생각해볼 수 있습니다.
    time 명령으로 잘 활용하면 프로세스들의 최적화를 위해서
    임베디드환경에서 발빠르게 간단히 유용하게 사용될 수 있습니다.

    이를 위해서 -f 옵션을 아래의 몇가지 예제처럼 해당 임베디드 시스템에서 적절히 잘 활용하면 편리합니다.

    예제1) ls 명령을 수행시의 USer Call, System Call, Real time 시간을 알아내는 방법이다.
    rhel6#>> /usr/bin/time -f "Evaluation: \t%S system,\t%F major-fault,\t%R minor-fault" ls

    예제1) ls 명령을 수행시의 USer Call, System Call, Real time 시간을 알아내는 방법이다.
    rhel6#>> /usr/bin/time -f "\t%U user,\t%S system,\t%e real" ls -Fs

    예제2) sync 명령을 수행시에 CPU의 사용량 및 RSS정보  및 문맥교환수를 알아내는 방법이다.
    rhel6#>> /usr/bin/time -f "\t%P cpu,\t%t rss,\t%w cxt" sync
               4% cpu,            0 rss,            23 cxt

    예제3) sync 명령을 수행시에 Major PageFault 및 Minor PageFault 정보
    및 시스템의 페이지 사이즈를 알아내는 방법이다.
    rhel6#>> /usr/bin/time -f "\t%F major-fault,\t%R minor-fault,\t%Z page-size" sync
               0 major-fault,            174 minor-fault,            4096 page-size

    예제4) sync 명령을 수행시에  unshared 데이타영역 사이즈, unshared 스택 사이즈,
    shared 텍스트 사이즈를 킬로 바이트 단위로 알아내는 방법이다.
    rhel6#>> /usr/bin/time -f "\t%D unshared-data,\t%p unshared-stack,\t%X shared-text" top
               0 unshared-data,            0 unshared-stack,            0 shared-text

    time 명령에서 제공되는 -f 옵션을 이용하여 우리가 알아낼수 있는 정보들은 아래와 같습니다.

    c    Number of involuntary context switches because of time slice expiring.
    C    Name and arguments of command being timed.
    D    Average size of unshared data area, in kilobytes.
    e    Elapsed real time, in seconds.
    E    Elapsed real time as hours:minutes:seconds.
    F    Number of major (I/O-requiring) page faults.
    I    Number of filesystem inputs.
    k    Number of signals delivered to the process.
    K    Average total (data+stack+text) memory use, in kilobytes.
    M    Maximum resident set size, in kilobytes.
    O    Number of filesystem outputs.
    p    Average unshared stack size, in kilobytes.
    P    Percent of CPU used.
    r    Number of socket messages received.
    R    Number of minor (recoverable) page faults.
    s    Number of socket messages sent.
    S    Total CPU seconds used by the system on behalf of the process.
    t    Average resident set size, in kilobytes.
    U    Total CPU seconds used directly by the process.
    w    Number of voluntary context switches.
    W    Number of times the process was swapped out of main memory.
    x    Exit status of the command.
    X    Average shared text size, in kilobytes.
    Z    System page size, in bytes.

    이상.

    * 오픈소스는 Open Innovationa & 윈윈전략을 도모할 지언정 절대 공짜(무료)임을 뜻하지 않는다.치

0 답변 글타래를 보이고 있습니다
  • 글쓴이
    답변
    • #12909
      딱털서어
      참가자
      • 게시글87
      • 댓글316
      • 총합403
      • ★★
      @no1linuxer

      마니 참고하겠습니다.
      감사합니다.

      리눅스를 더 가까이 - No1.Linux

0 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.