-
반응형개발하는데 있어서 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을 주기적으로 하고 있는게 보인다. 자세한 내역은 생략한다.반응형