리눅스의 ps 명령어의 eLf와 lwp는 thread 정보를 구할 수 있다.


java에서 thread가 Future를 많이 쓰지 않는 경우, 즉, 계속 netty 또는 tomcat pool thread의 경우 cpu 를 많이 소진하는 thread 번호(10진수)를 얻어올 수 있다.  수치가 높을 수록 누적 cpu 소진이 많은 cpu를 의미한다.


$  ps -eLf -p 프로세스 넘버 |grep java |awk '{print $4,$7,$9}'  | grep -v "00:00:00" |sort -k 4 -r |head -n 30


9750 18:21 00:00:03

9177 18:21 00:00:04

9176 18:21 00:00:04

9175 18:21 00:00:05

9174 18:21 00:00:05

9173 18:21 00:00:05

9172 18:21 00:00:04

9171 18:21 00:00:05

9170 18:21 00:00:04

9169 18:21 00:00:05

9168 18:21 00:00:05

9167 18:21 00:00:04

9166 18:21 00:00:04

9165 18:21 00:00:04

9164 18:21 00:00:05

9163 18:21 00:00:04

9162 18:21 00:00:04

9161 18:21 00:00:04



그러나, 위 명령어는 태생적인 한계가 있는데, Future를 사용하는 Thread는 잘 못 잡는 경우가 존재할 수 있다. 이 때는 갑자기 튀어 cpu 를 많이 소비하는 (튀는) thread 를 구할 때 유용하다. 



$ ps -mo pcpu,lwp -p 프로세스 넘버 | awk '{if ($2 ~/[0-9]/) {print $2 " " $1""}}' | sort -k 2 -r  | head -n 10


Posted by '김용환'
,