ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ps명령어를 통하여 thread 정보를 확인하는 방법
    2011. 11. 18. 1 comments
    개발하는데 있어서 thread를 사용하는 경우가 많다. "나는 thread가 필요 없어!" 하는 분들도 한번쯤은 보면 나중에 우연히 만나게 될 때 조그마한 도움(빠른 원인분석등)이 될수 있다.

    ps 명령어를 사용하면 linux 시스템의 프로세스 정보들을 얻을 수 있다. 시스템을 운용하는 사람들에게 있어서도  유용히 사용되는 정보인데, 이러한 ps 명령어에서 해당 프로세스가 thread정보를 함께 출력하게 정보를 얻을 수 있다.

    ps -eLf | grep testsrv



    UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
    root      2588  2587  2588  0   11 00:05 ?        00:00:07 ./testsrv
    root      2588  2587  2589  2   11 00:05 ?        00:23:17 ./testsrv
    root      2588  2587  2590  0   11 00:05 ?        00:00:00 ./testsrv
    root      2588  2587  2591  0   11 00:05 ?        00:00:03 ./testsrv
    root      2588  2587  2592  0   11 00:05 ?        00:00:00 ./testsrv
    root      2588  2587  2593  0   11 00:05 ?        00:00:00 ./testsrv
    root      2588  2587  2594  0   11 00:05 ?        00:05:05 ./testsrv
    root      2588  2587  2595  0   11 00:05 ?        00:00:00 ./testsrv
    root      2588  2587  2596  0   11 00:05 ?        00:00:37 ./testsrv
    root      2588  2587  2597  0   11 00:05 ?        00:00:00 ./testsrv
    root      2588  2587  2601  0   11 00:05 ?        00:00:00 ./testsrv
    
    

    위의 정보의 이해를 돕기 위해 ps 명령어의 man page의 일부 정보를 뽑아내었다. 매뉴얼 페이지를 확인해보면 -e 옵션은 모든 페이지, -L  thread 정보, -f 보여질 수 있는 모든 정보를 출력하라는 옵션이다.

    -e, -A
    Select all processes.
    
    -L
    Show threads, possibly with LWP and NLWP columns.
    
    -F
    Set extra-full format; implies -f.
    
     
    ps -eLF 의 출력물 중에서 제일 첫번째 줄의 LWP(Light Weight Process, is thread)는 thread의 ID를 의미하며, NLWP(Number Light Weight Process)는 해당 프로세스에서 동작하고 있는 프로세스의 총 갯수를 의미한다. 결과적으로 ps -eLF | grep testsrv의 결과물을 보면 프로세스 ID는 2588이며, 총 11개의 thread가 동작하고 있음을 의미한다. 또한 thread는 각각 thread id(LWP)를 갖고 있어 그 정보를 사용할 수도 있다.


    자 그렇다면, 활용하는 방안으로써 strace 명령을 사용하여 해당 thread가 어떤 시스템 함수를 호출하는지 확인해보자.

    strace -p 2589


    Process 2589 attached - interrupt to quit
    restart_syscall(<... resuming interrupted call ...>) = 0
    rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
    nanosleep({1, 0}, {1, 0})               = 0
    rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
    nanosleep({1, 0}, ^C <unfinished ...>
    


    해당 thread는 sleep을 주기적으로 하고 있는게 보인다. 자세한 내역은 생략한다.


    반응형

    댓글 1

Designed by Tistory.