prstat (3)


다음과 같은 시나리오를 생각해보자. 사용자는 소프트웨어 벤더가 제공한 서버 애플리케이션이 약간의 메모리 누수 현상을 보이고 있다고 의심한다고 가정해보자. 이 사실을 벤더에게 제시하기 위해, 서버 애플리케이션의 프로세스 ID로 제한하는 prstat 명령어를 수행시켜서 매 15초마다 결과값을 수합하고자 한다. 다음 코드 예제는 이를 실행시키는 방법을 나타낸다.


kincaid/tartan 74 $ server &

[1] 2423
kincaid/tartan 75 $
kincaid/tartan 56 $ prstat -p 2423 15 > server.out &
kincaid/tartan 57 $ tail -f server.out
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 32M 1008K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 47M 1248K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 62M 1488K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 77M 1728K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 92M 1968K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 107M 2208K sleep 58 0 0:00.00 0.0% server/1

prstat가 수집하는 데이터를 보면, 프로세스는 매 15초마다 대략 15MB씩 증가하고 있는 것이 명확히 나타난다. 또한 프로세스의 레지던트 세트 크기는 매 15초마다 대략 40K씩 증가하고 있다. 서버 애플리케이션의 메모리 누수 현상 외에 이 현상을 설명할 다른 방안도 있겠지만, 이 코드 예제에서 나타난 바와 같은 데이터는 애플리케이션의 메모리 누수 현상이 있을 것이라는 강력한 의심을 뒷받침한다.

Java 서버 애플리케이션 메모리 누수 쓰레드를 관찰하기 위해 prstat 명령어를 사용하는 방법이 나오는 예제가 여기에 있다. prstat는 항상 각 프로세서 내에 lwps(쓰레드) 번호를 나타내준다.



kincaid/tartan 47 $ prstat -p 3221 > threads.out &

[1] 3235
kincaid/tartan 48 $ tail -f threads.out
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 58 0 0:00.00 32% java/43
Total: 1 processes, 43 lwps, load averages: 1.29, 1.20, 1.18
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 36% java/45
Total: 1 processes, 45 lwps, load averages: 1.44, 1.23, 1.19
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 38% java/48
Total: 1 processes, 48 lwps, load averages: 1.43, 1.23, 1.19
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 44 0 0:00.00 45% java/50
Total: 1 processes, 50 lwps, load averages: 1.65, 1.29, 1.21
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 52% java/52
Total: 1 processes, 52 lwps, load averages: 2.03, 1.37, 1.24
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 48 0 0:00.00 55% java/55


이 출력 내용은 시간 경과에 따른 lwps의 수치를 보여준다. 따라서 서버 애플리케이션이 쓰레드를 누수하는 가능성을 보여준다.



사용자는 prstat를 이용해 다른 자원 누수 현상도 찾아낼 수 있다. prstat가 가진 아주 매력적인 특징은 -L 스위치를 사용하면 볼 수 있으며, 이 경우 prstat는 프로세스의 각 쓰레드에 대한 통계치를 출력해준다. 이것은 다음과 같이 다양하게 사용할 수 있다.

- 각 쓰레드의 CPU 점유율을 살펴봄으로서 풀 간에 작업량을 어떻게 조절할 수 있는지를 판단할 수 있다.
- 프로세서만이 아니라 개별 쓰레드에 대한 자원 누수 현상을 감소시킬 수 있는 옵션이다. 예를 들어 사용자는 어떤 쓰레드가 메모리를 누수시키는지를 판단할 수 있다.

kincaid/tartan 49 $
kincaid/tartan 49 $ prstat -L -p 3295

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/LWPID
3295 kincaid 28M 10M sleep 38 0 0:00.01 2.1% java/16
3295 kincaid 28M 10M sleep 55 0 0:00.01 1.9% java/17
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.8% java/15
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.8% java/23
3295 kincaid 28M 10M sleep 52 0 0:00.01 1.7% java/12
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.6% java/22
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.5% java/13
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.5% java/14
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.4% java/19
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.4% java/18
3295 kincaid 28M 10M sleep 38 0 0:00.01 1.4% java/21
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.3% java/24
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.2% java/20
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/1
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/11
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/10
3295 kincaid 28M 10M sleep 59 0 0:00.00 0.0% java/9
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/8
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/7
3295 kincaid 28M 10M sleep 59 0 0:00.00 0.0% java/6
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/5

Total: 1 processes, 24 lwps, load averages: 1.30, 1.22, 1.21
kincaid/tartan 50 $



어떤 프로세스가 작동중인지를 좀더 확인해보려면, 사용자는 prstat에 -m 옵션을 이용해 프로세스의 미시적 통계치를 출력해볼 수 있다. 사용자가 -m 옵션을 지정하면, prstat는 다른 컬럼 집합을 보여주는데, 이곳에는 최종 샘플이 구해진 이후 프로세스가 어떻게 시간을 사용했는지를 나타내게 된다.
표 1은 마이크로 통계 컬럼 머릿말과 의미를 나타낸 것이다.

표 1. 마이크로 통계 컬럼 머릿말과 의미
컬럼 머릿말 의미
USR 사용자 모드에서 프로세스가 사용한 시간 점유율
SYS 시스템 모드에서 프로세스가 사용한 시간 점유율
TRP 시스템 트랩을 처리하면서 사용한 시간 점유율
DFL 데이터 페이지 fault를 처리하면서 사용한 시간 점유율
LCK 사용자 잠금 대기 시간에 프로세스가 사용한 시간 점유율
SLP 절전 모드에 프로세스가 사용한 시간 점유율
TFL 텍스트 페이지 fault를 처리하면서 사용한 시간 점유율

다음 예제는 앞서 나온 서버 애플리케이션에서 -m 옵션을 사용해 출력된 것이다.

prstat -m -p 3295
PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP
3295 kincaid 0.8 0.0 0.0 0.0 0.0 0.0 99 0.0 22 4 25 0 java/24


이러한 컬럼의 의미와 내용을 여기서 설명하는 것은 다소 주제를 벗어나는 일이다. 그러나 사용자가 운영체계의 개념 및 Solaris 내부구조와 점점 친숙해짐으로써, 개별 프로세스나 혹은 프로세스 그룹의 미시적인 통계치를 모니터링하는 능력은 아주 강력한 툴이 되어줄 것이며, 특히 성능과 관련된 사항을 파악하고자 할 때는 더욱 그러할 것이다. 또한 -m 옵션은 -L 옵션과 함께 사용할 수 있으므로 프로세스의 각 쓰레드의 미시적인 통계치도 감시할 수 있다.



이미 언급했듯이, prstat는 다른 Solaris 성능 감시 툴과 함께 사용할 수 있으므로 개발자에게 있어서는 시스템 성능과 관련된 문제를 디버깅하고 증상을 파악하는 데 사용하는 무기라고 할 수 있다. 다른 몇몇 Solaris 툴로서 살펴볼 만한 가치가 있는 것으로는 sar와 iostat, netstat, mpstat 등이 있다. 이들은 시스템 성능 문제를 파악하는 데 있어서 아주 좋은 툴들이다. prstat는 이들의 아주 좋은 보완 툴이다. 즉 prstat는 시스템 성능 문제에 직접 영향을 주는 프로세스와 쓰레드를 더욱 세밀하게 파악할 수 있도록 해주기 때문이다.



prstat는 Solaris 툴 세트에 첨가된 매우 훌륭한 툴이다. 이것은 표준형으로서 Solaris 2.8부터 소개되었다. 개발자들은 더 이상 새로운 Solaris가 출시될 때마다 top 버전을 업그레이드하지 않아도 된다. prstat는 top 버전에서는 발견할 수 없는 여러 가지 강력한 특징이 추가되어, 사용자들이 가장 널리 사용되는 특징들을 모두 가지고 있다.

이 글을 통해서 Solaris 개발자들은 자신의 애플리케이션이 시스템 자원을 어떻게 소모하며 애플리케이션이 시간을 어떻게 소모하고 있는지를 이해했을 것이다. 이와 함께 개발자들은 자신의 애플리케이션에서의 자원 고갈을 파악하고 이를 보정할 수 있으며, 자신의 애플리케이션이 Solaris 플랫폼상에서 더욱 향상된 성능을 낼 수 있도록 변경할 수 있는 방법을 얻게 된 셈이다.



이 글은 Tom Kincaid와 Andrei Dorofeev씨가 쓴 ‘Topping top in Solaris 8 with prstat’를 정리한 것임을 밝혀둔다

by 무난하게 | 2005/02/27 00:43 | Technical.Doc | 트랙백(1)

트랙백 주소 : http://munhwan.egloos.com/tb/1006801
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from RevoLutioNis.. at 2008/07/30 11:38

제목 : [SOLARIS]prstat command
[LINK] http://munhwan.egloos.com/1006810 http://munhwan.egloos.com/1006801 NAME prstat - report active process statistics SYNOPSIS prstat [-acJLmRtTv] [-C psrsetlist] [-j projlist] [-k task- list] [-n ntop[,nbottom]] [-p pidlist] [-P cpulist] [-s key......more

※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지          다음 페이지 ▶