마지막으로 할당된 PID. 따라서 PID에서 가장 큰 값을 의미하지는 않는다. 단지 얼마나 빨리 프로세스가 생성되는지 대략적인 가늠만 할 수 있을 뿐이다. (PID는 순차적으로 할당되지 않는다) root권한으로 top을 실행해야 표시된다. 버전에 따라 표시되지 않는 경우도 있다. (3.8에서는 표시되지 않는다)
로드 평균(Load Average). 로드란 시스템 스케줄러의 런 큐에 대기하고 있는 쓰레드의 개수로, '부하'라고도 번역된다. 일반적으로 시스템의 부하는 로드 평균값이 높은 것을 의미한다. (항상 그런것은 아니다) 보통 일정한 시간(예를 들어 10밀리초)마다 런 큐의 길이를 재고 통계학에 사용되는 이동평균, 지수평활법, 감가상각법 등을 사용해 1분, 5분, 15분의 수치를 구한다. (즉 로드값은 실제 '측정'한 값이 아니라 '계산'된 값이다. 성능상 정확하게 측정할 수 없다) 로드값이 1이라는 의미는 1개의 코어를 대기없이 쉬지 않고 계속 사용할 때 나오는 값이다.
왼쪽부터 차례대로, 1분, 5분, 15분간 평균 로드값을 나타낸다. 시스템과 어플리케이션마다 차이있지만, 스팍 CPU의 경우 [동시에 처리할 수 있는 쓰레드 개수 * 4] 까지는 성능에 이상 없을 것이다. 인텔 CPU 의 경우 로드값이 코어개수인 경우 까지는 성능에 이슈 없을 것이다.
솔라리스 10부터는 이 값의 측정 방법이 변경되었다. 기존 방법으로는, 측정 주기보다 빨리 소멸한 쓰레드의 경우 측정되지 않았기 때문에 부하가 낮은것으로 출력되었기 때문이다. 솔라리스 10부터는 감가상각 알고리즘을 바탕으로 마이크로코드를 기반으로 측정하고 있어 좀 더 정확한 값이 나온다.
시스템 가동시간(Uptime)및 현재 시간
모든 프로세스 상태 개요. 총 개수와 각각의 상태를 가리킨다.
On cpu: 현재 CPU에 의해 실행되고 있는 프로세스 개수
Running: 실행할 수 있는 프로세스 개수. On CPU와 Running인 프로세스가 많다는 것은 시스템에 부하가 많다는 뜻이다.
Sleeping: 외부 이벤트/입력을 기다리고 있는 프로세스 개수
Stopped: Ctrl+Z와 같은, 정지 시그널로 정지된 프로세스 개수
Swapped: 디스크로 스왑되고 있는 프로세스 개수. 0이어야 한다.
Zombie: 프로세스는 종료되어 부모 프로세스에게 종료된 상태를 전달하려 했지만, 부모 프로세스가 상태를 받지 않은 경우 자식 프로세스가 좀비 프로세스가 된다. defunct 프로세스라고도 부른다. 없어야 한다. preap(1)을 사용해 없앨 수 있다.
CPU 상태 표시
Idle: 대기 중(실행할 다른 프로세스가 없음)인 CPU 시간
User: 유저 프로세스 실행중인 CPU 시간
Kernel: 커널 시스템 콜, 페이지 폴트, 인터럽트 수행 중인 CPU 시간
IOWait: 대기 중(I/O 가 완료될 때까지, 실행할 다른 프로세스가 없음)인 CPU 시간
Stolen: 하이퍼바이저에서 할당해주지 않은 CPU 시간 (이는 솔라리스가 GUEST OS 로 실행될때에 0 이상의 값이 표시됨. CPU Steal Time 이라고도 한다)
Swap: 스와핑 또는 페이징하는 중인 CPU 시간
Idle 과 IOWait는 동일하게 '대기중'이란 의미를 가지며, 실행할 프로세스가 없다는 의미다. 필자는 두 수치를 해석할 때 의미에 크게 차이두지 않는다. 솔라리스 11.4 에 번들되어있는 top 명령에는 IOWait 가 표시되지 않는다.
메모리 상태 표시
phys mem: 프로세스가 사용할 수 있는 물리 메모리 양 (커널에 의해 예약된 영역 제외)
free mem: 남은 메모리 양
total swap: 사용된 스왑 메모리 양
free swap: 남은 스왑 메모리 양
솔라리스에서 남은 메모리는 커널과 어플리케이션에서 사용한 메모리보다 적을 수 있다. 이는 ZFS 캐시에서 사용하는 것으로, 시스템에서 메모리가 부족하면 즉시 ZFS 캐시에 할당된 메모리를 돌려받아 시스템에 돌려주기 때문에 문제되지 않는다.
프로세스 상태 표시
PID: 프로세스 아이디
USERNAME: 프로세스 소유자 이름
NLWP/LWP/THR: LWP 또는 쓰레드 개수 (SUN은 쓰레드와 LWP는 다르다!고 하지만 유닉스 쓰레드가 LWP를 이용해 구현되기 때문에 비슷한 개념인건 맞다). 모든 프로세스는 1개 이상의 쓰레드를 가진다. top 버전마다 표시되는 컬럼의 이름은 다르지만, 같은 의미다.
PRI: 우선순위. 솔라리스에서 사용자 프로세스의 우선순위 범위는 0 ~ 59 으로 커널에 의해 자동으로 결정된다. 이 값을 사용자가 직접 지정할 수는 없지만, priocntl(1), nice(1)을 사용해 간접적으로 조절을 시도해 볼 수 있다. 값이 높을 수록 우선순위가 높다. 이 값에 신경쓸필요는 없다. 솔라리스 커널은 똑똑하니 말이다.
NICE: 나이스. 우선순위를 결정하기 위해 커널에서 참고하는 값이다. 사용자가 nice(1)을 사용해 설정할 수 있으며 설정하지 않으면 0이다. 커널은 이 값이 낮을수록 우선순위 값을 높게 설정한다. 솔라리스에서는 -20 ~ 20 까지 설정할 수 있다.
SIZE: 프로세스에 할당된 메모리 양. 물리 메모리 + 가상 메모리 + 공유 메모리 + ... 의 값이다.
RES: 프로세스에 의해 사용된 물리 메모리 양. RES는 RESident set size의 약어로 RSS 으로 표기하기도 한다.
STATE: 프로세스 상태. CPU, RUN, SLEEP, STOP, SWAP, ZOMB가 있다. 자세한 내용은 [4) 프로세스 상태]를 참고하자.
TIME: 프로세스가 사용한 CPU시간이다. 1:00 이라 되어있으면 해당 프로세스는 1분동안 CPU를 100% 소모한것과 같다. 1000분이 넘으면 H(시간)으로 단위가 바뀐다. [127.4H]라면 127시간 + 0.4시간(24분) 이라는 뜻이다.
FLTS: TOP이 실행된 이후 생긴 메이저 페이지 폴트 회수. 일반적인 경우 0에 가까워야 한다.
CPU: 현재 프로세스의 총 CPU 대비 사용률. TOP는 이를 기준으로 프로세스 목록을 정렬한다. 1개의 CPU가 있는 시스템에서 [30%]라 되어있으면 해당 프로세스는 전체의 30%를 사용하고 있는 것이다. 4개의 CPU가 있는 시스템에서 [25%]라 나왔다면, 해당 프로세스는 CPU 1개를 100% 소비하고 있다고 해석된다.
windy@wl ~ $ top -T
These color tags are available:
1min 5min 15min header cpu.idle cpu.user cpu.kernel cpu.stolen cpu.swap
kernel.ctxsw kernel.trap kernel.intr kernel.syscall kernel.fork kernel.flt
kernel.pgin kernel.pgout memory.physmem memory.freemem memory.totalswap
memory.freeswap
...
색상번호는 ANSI코드와 같다. 색상코드는 color.h에 나와 있으며 다음과 같다.
속성 글자 색상 번호 배경 색상 번호
0 초기화 30 검은색 40 검은색
1 밝게 31 붉은색 41 붉은색
2 흐릿하게 32 녹색 42 녹색
4 아랫줄 33 노란색 43 노란색
5 깜빡임 34 파란색 44 파란색
7 반전 35 붉은자주색(Magenta) 45 붉은자주색(Magenta)
8 숨김 36 맑은파란색(Cyan) 46 맑은파란색(Cyan)
37 흰색 47 흰색
최소, 최대값중 로드 평균을 나타내는 값은 원래 값에 100을 곱한 값을 넣어야 한다. (소숫점 2째자리까지 표현하기 위함이다)
예를들어 1min=500,1000#31와 같이 지정하면 1분단위 로드에서 5.00이상 10.00이하면 붉은색으로 표시한다.
NumaTOP은 인텔에서 개발한 Intel CPU 모니터링 툴이다. 프로세스의 메모리 접근에 대한 지역적 특성, 즉 LMA인지 RMA인지 보여주고 분석해주는 툴이다.
소스가 공개되어있으며, 공식적으로는 리눅스만 지원하지만, 솔라리스에도 포팅되어있다. 솔라리스 11.2 부터 번들되어있다.
top과 prstat, rstat등을 과신하지 않는다. 부하에 대한 판단은 여러가지 정보를 종합적으로 생각해야 한다.
NICE와 PRI에 대한 설명이 복잡하게 느껴질지도 모르겠다. 한마디로 우선순위는 사용자가 임의로 정해줄 수 없다는 것이다. 그나마 다행인건 솔라리스 커널이 꽤 똑똑하게 PRI값을 정해준다는 사실이다. nice, renice, priocntl(솔라리스 8 이상) 커맨드를 참고하자