2006/08/23

솔라리스10에서 thread에 바인드(bind)되는 cpu 알아내기

운영체제 내부 정책에 따라 순간적으로 이루어지는 행위로서 특정 CPU에 바인딩되는 프로세스 스레드의 정보를 알기가 정확하게 알기가 힘듭니다.(관리자 임의로 psrset이나 pbind를 통해서 bind한 프로세스들의 정보는 pbind, psrset 으로 알 수 있습니다)

솔라리스에서는 prstat에서 status 컬럼에서 관련 정보를 알 수가 있습니다만,
reporting하는 툴인 prstat 그 자체의 수행에 의한 모순때문에 정확하게 알기가
힘들게 됩니다. 막상 prstat가 데이타를 읽어서 찍는 경우에는 관찰대상인 프로세스보다
prstat가 우선권을 차지하는 경우가 왕왕발생하므로, 관찰 대상의 프로세스는 대개
sleep으로 나타나게 되는 경우가 많이 있습니다.

복수개의 Core를 사용한다면 좀 낫습니다만, 그래도 여전히 이런 모순이 존재하게 되기
때문에 이러한 형태의 정밀한 보고는 매우 어렵습니다.

솔라리스 10에서는 dtrace로 이와 같은 경우의 보고를 완벽하게 해결할 수 있습니다.

아래 처럼 명령을 주면, -p 옵션 뒤에 있는 프로세스가 cpu에 할당 될때 마다
할당된 thread와 cpu를 인쇄합니다.

> #dtrace -q -n 'sched:::on-cpu/pid==$target/{printf("process/thread
> %s[%d]:%d is running on CPU %d\n\n",execname,pid,tid,cpu)}' -p 1031

-p 옵션 뒤에 관찰 대상이 되는 프로세스의 pid가 제공됩니다.

이렇게 실행해놓으면, 프로세스 1031이 cpu에 바인딩될때마다 1031의 무슨 thread가
어떤 cpu에 바인딩되는 지를 보여줍니다.

dtrace : 놀라울 따름입니다. !!!

댓글 없음: