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 : 놀라울 따름입니다. !!!

opensolaris에서 한글환경

solaris 10 intel/amd 버젼에서는 데스크탑 환경으로 사용하는 경우에 gdm기반으로 로그인 하는 경우, 기본 한글 환경을 설정하기 위해서 로케일을 ko_KR.UTF-8로 설정됩니다. 특히, 솔라리스 10 U2부터는 gdm이 기본 로그인 환경으로 바뀜에 따라, 사용자는 선택의 여지가 없이 unicode(ko_KR.UTF-8)로 로그인해야 합니다.
gdm 세션 옵션 메뉴에서 언어를 선택할 수 있기는 합니다만, 한국어는 하나밖에 없으며, 이 옵션은 유니코드(UTF-8)에만 적용됩니다.

그런데, 아직은 많은 애플리케이션들이 컨텐츠들의 인코딩 로케일로 ko_KR(euc-kr)을 사용하는 경우가 많기 때문에, 로그인시 ko_KR.UTF-8이 아닌, 기존의 euc-kr 코드셋을 사용하는 로케일인 ko 혹은 ko_KR 로 설정하기 위해서는 두가지 방법이 있습니다.

하나는 /etc/X11/gdm/gdm.conf에서 설정하는 방법이 있고,
다른 하나는 사용자의 ~/.profile 혹은 ~/.login 에서 설정하는 방법이 있습니다.

두 방법다 환경 변수 GDM_LANG=ko를 선언하도록 하면 됩니다.
gdm.conf의 방법은 gdm.conf의 내용을 이해해야 하므로 사용자 별 하는 방법을 소개하면

~/.profile을 사용하는 경우
맨 처음 라인에
GDM_LANG=ko;export GDM_LANG

~/.login을 사용하는 경우
맨 처음 라인에
setenv GDM_LANG ko

를 선언하면 됩니다.