top, prstat, rstat - 윈디하나의 솔라나라

목차

개요

top

설치

솔라리스 11에는 top 3.8 beta 1 이 이미 설치되어있으므로, 소스를 받아 설치해서는 안된다.
root@wl ~/src # wget http://www.unixtop.org/dist/top-3.8beta1.tar.gz
root@wl ~/src # tar xvfz top-3.8beta1.tar.gz
root@wl ~/src # cd top-3.8beta1
root@wl ~/src/top-3.8beta1 # ./configure
...
config.status: creating top.1
config.status: creating config.h
root@wl ~/src/top-3.8beta1 # make
...
cc -DHAVE_CONFIG_H  -I. -I. -g -v   -o top color.o commands.o display.o hash.o s
creen.o top.o username.o utils.o version.o  m_sunos5.o -lm -ltermcap -lkvm -lkst
at -lelf
root@wl ~/src/top-3.8beta1 # make install
...
./install-sh -c -m 755 \
        top /usr/local/bin/top
root@wl ~/src/top-3.8beta1 #

실행 및 화면 설명

top의 사용 방법은 매우 쉽다. 그냥 top을 실행시키면 된다. 종료하려면 q 를 누른다.
root@wl ~ # top
last pid:1) 14149;  load avg:2) 0.03, 0.06, 0.08;       up 46+07:54:14  15:57:473)
56 processes:  55 sleeping, 1 on cpu4)
CPU states: 97.6% idle,  1.4% user,  1.0% kernel,  0.0% stolen,  0.0% swap5)
Kernel: 224 ctxsw, 7 trap, 232 intr, 230 syscall, 7 flt8)
Memory: 2048M phys mem, 1873M free mem, 2048M total swap, 2048M free swap6)
 This terminal can only display 18 processes9)
   PID USERNAME NLWP PRI NICE  SIZE   RES STATE    TIME    CPU COMMAND7)
  2698 windy       1  59    0 4024K 2172K cpu/0    0:00  0.05% top
  2688 windy       1  59    0   15M 5432K sleep    0:00  0.02% sshd
   567 root       32  59    0 9380K 3988K sleep    0:00  0.00% nscd
    11 root       13  59    0   13M   11M sleep    0:03  0.00% svc.startd
   898 root        1  59    0 5124K 1264K sleep    0:00  0.00% dhcpagent
   219 root        6  59    0 7052K 3140K sleep    0:00  0.00% devfsadm
    13 root       17  59    0   27M   26M sleep    0:54  0.00% svc.configd
   170 root        5  60  -20 2644K 1300K sleep    0:00  0.00% zonestatd
   740 root       27  59    0   29M   14M sleep    0:00  0.00% fmd
    44 root        6  59    0   15M 7008K sleep    0:00  0.00% dlmgmtd
   686 root        4  59    0 7224K 5456K sleep    0:00  0.00% hald
   257 daemon      3  59    0   10M 4468K sleep    0:00  0.00% kcfd
   565 root        1  59    0   10M 3956K sleep    0:00  0.00% cupsd
  2687 root        1  59    0   11M 3612K sleep    0:00  0.00% sshd
   973 root        4  59    0   10M 3412K sleep    0:00  0.00% rad
   713 root        4  59    0 7232K 3148K sleep    0:00  0.00% inetd
    72 netadm      5  59    0 4236K 2800K sleep    0:00  0.00% ipmgmtd
  1. 마지막으로 할당된 PID. 따라서 PID에서 가장 큰 값을 의미하지는 않는다. 단지 얼마나 빨리 프로세스가 생성되는지 대략적인 가늠만 할 수 있을 뿐이다. (PID는 순차적으로 할당되지 않는다) root권한으로 top을 실행해야 표시된다. 버전에 따라 표시되지 않는 경우도 있다. (3.8에서는 표시되지 않는다)
  2. 로드 평균(Load Average). 로드란 시스템 스케줄러의 런 큐에 대기하고 있는 쓰레드의 개수로, '부하'라고도 번역된다. 일반적으로 시스템의 부하는 로드 평균값이 높은 것을 의미한다. (항상 그런것은 아니다) 보통 일정한 시간(예를 들어 10밀리초)마다 런 큐의 길이를 재어 평균낸 값이다. 왼쪽부터 차례대로, 1분, 5분, 15분간 평균 로드값을 나타낸다. 시스템과 어플리케이션마다 차이있지만, 스팍 CPU의 경우 [동시에 처리할 수 있는 쓰레드 개수 * 4] 까지는 성능에 이상 없을 것이다. 솔라리스 10부터는 이 값의 측정 방법이 변경되었다. 기존 방법으로는, 측정 주기보다 빨리 소멸한 쓰레드의 경우 측정되지 않았기 때문에 부하가 낮은것으로 출력되었기 때문이다. 솔라리스 10부터는 감가상각 알고리즘을 바탕으로 마이크로코드를 기반으로 측정하고 있어 좀 더 정확한 값이 나온다.
  3. 시스템 가동시간(Uptime)및 현재 시간
  4. 모든 프로세스 상태 개요. 총 개수와 각각의 상태를 가리킨다.
  5. CPU 상태 표시 Idle 과 IOWait는 동일하게 '대기중'이란 의미를 가지며, 실행할 프로세스가 없다는 의미다. 필자는 두 수치를 해석할 때 의미에 크게 차이두지 않는다. 솔라리스 11.4 에 번들되어있는 top 명령에는 IOWait 가 표시되지 않는다.
  6. 메모리 상태 표시 솔라리스에서 남은 메모리는 커널과 어플리케이션에서 사용한 메모리보다 적을 수 있다. 이는 ZFS 캐시에서 사용하는 것으로, 시스템에서 메모리가 부족하면 즉시 ZFS 캐시에 할당된 메모리를 돌려받아 시스템에 돌려주기 때문에 문제되지 않는다.
  7. 프로세스 상태 표시
  8. 커널 개요 표시 (TOP 3.7이상) 1) 트랩(Trap)은 예외적인 상황이 발생해 동기화된 인터럽트로 생각할 수 있다. 디버깅에서 사용하는 브레이크 포인트가 걸렸거나, 잘못된 메모리 접근으로 인한 폴트가 이에 해당된다.
  9. 터미널 라인 표시. 실행시 이 터미널은 18개의 프로세스만을 표시할 수 있습니다라고 안내해준다.

사용

prstat

실행 및 화면 설명

기본적으로 top 과 비슷하다.
root@wl ~ # prstat
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP         
  1033 root     7272K 2776K cpu0    54    0   0:00:00 0.5% prstat/1
   602 noaccess  166M  109M sleep   59    0   0:01:37 0.4% java/18
   491 root       35M   26M sleep   59    0   0:00:31 0.2% Xorg/1
   919 root     9000K 4116K sleep   59    0   0:00:00 0.1% sshd/1
   638 root       19M   13M sleep   59    0   0:00:15 0.1% dtgreet/1
   925 root     5156K 1888K sleep   59    0   0:00:00 0.0% bash/1
   236 root     4876K 1348K sleep   59    0   0:09:58 0.0% VBoxService/2
   642 root     8520K 1948K sleep   59    0   0:00:02 0.0% sendmail/1
   142 root     9488K 3060K sleep   59    0   0:00:04 0.0% nscd/30
     9 root     8920K 7404K sleep   59    0   0:01:07 0.0% svc.configd/15
   385 root     6120K 1560K sleep   59    0   0:00:00 0.0% sshd/1
   233 root     4988K 1136K sleep   59    0   0:00:00 0.0% cron/1
   365 root     1428K  700K sleep   59    0   0:00:00 0.0% utmpd/1
   137 root     1756K 1092K sleep   59    0   0:00:00 0.0% powerd/3
   640 smmsp    8648K 1728K sleep   59    0   0:00:00 0.0% sendmail/1
   132 root     7612K 2240K sleep   59    0   0:00:00 0.0% syseventd/15
   376 root       17M   10M sleep   59    0   0:00:03 0.0% fmd/19
   309 daemon   2800K 1308K sleep   59    0   0:00:00 0.0% rpcbind/1
   150 root     5280K 1968K sleep   59    0   0:00:00 0.0% picld/4
   373 root     2432K 1428K sleep   59    0   0:00:00 0.0% ttymon/1
   340 root     2436K 1344K sleep   59    0   0:00:00 0.0% ttymon/1
Total: 42 processes, 181 lwps, load averages: 0.02, 0.02, 0.02
root@wl ~ # prstat -a
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP         
  1034 root     7272K 2780K cpu0    44    0   0:00:00 0.5% prstat/1
   602 noaccess  166M  109M sleep   59    0   0:01:37 0.4% java/18
   491 root       35M   26M sleep   59    0   0:00:31 0.2% Xorg/1
   638 root       19M   13M sleep   59    0   0:00:15 0.1% dtgreet/1
   236 root     4876K 1348K sleep   59    0   0:09:58 0.0% VBoxService/2
   919 root     9000K 4116K sleep   59    0   0:00:00 0.0% sshd/1
   925 root     5156K 1888K sleep   59    0   0:00:00 0.0% bash/1
   142 root     9488K 3060K sleep   59    0   0:00:04 0.0% nscd/30
   642 root     8520K 1948K sleep   59    0   0:00:02 0.0% sendmail/1
   396 root     5860K 1640K sleep   59    0   0:00:00 0.0% syslogd/11
     9 root     8920K 7404K sleep   59    0   0:01:07 0.0% svc.configd/15
   376 root       17M   10M sleep   59    0   0:00:03 0.0% fmd/19
   309 daemon   2800K 1308K sleep   59    0   0:00:00 0.0% rpcbind/1
   150 root     5280K 1968K sleep   59    0   0:00:00 0.0% picld/4
   373 root     2432K 1428K sleep   59    0   0:00:00 0.0% ttymon/1
 NPROC USERNAME  SWAP   RSS MEMORY      TIME  CPU                               
    38 root       67M   97M    13%   0:12:35 0.9%
     1 noaccess   83M  161M    21%   0:01:37 0.4%
     1 smmsp    1256K 6068K   0.8%   0:00:00 0.0%
     2 daemon   1644K 6188K   0.8%   0:00:00 0.0%

Total: 42 processes, 181 lwps, load averages: 0.02, 0.02, 0.02
root@wl ~ # prstat -v
   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP    
  1060 root      30  66 0.7 0.0 0.0 0.0 0.0 4.0   0 434 17K   0 prstat/1
   639 root     2.9 6.8 0.0 0.0 0.0 0.0  85 5.5  1K  24  1K   0 /0
   236 root     0.0 1.8 0.0 0.0 0.0  98 0.0 0.0   0   0   6   0 VBoxService/2
   491 root     0.1 0.1 0.0 0.0 0.0 0.0 100 0.2  20   0  83  10 Xorg/1
   638 root     0.0 0.1 0.0 0.0 0.0 0.0 100 0.0  10   0  51   0 dtgreet/1
   919 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   3   0  27   0 sshd/1
   697 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   2   0  23   0 sshd/1
   602 noaccess 0.0 0.0 0.0 0.0 0.0  72  28 0.0   5   0   7   0 java/18
     9 root     0.0 0.0 0.0 0.0 0.0  13  87 0.1   4   0  11   0 svc.configd/15
   925 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0  10   0 bash/1
   642 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   1   0   8   0 sendmail/1
     7 root     0.0 0.0 0.0 0.0 0.0  36  64 0.0   2   0   5   0 svc.startd/14
   361 root     0.0 0.0 0.0 0.0 0.0  25  75 0.0   1   0   3   0 inetd/4
     1 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   1   0 init/1
   918 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 sshd/1
   696 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 sshd/1
   365 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 utmpd/1
   376 root     0.0 0.0 0.0 0.0 0.0  68  32 0.0   0   0   0   0 fmd/19
   373 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 ttymon/1
   385 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 sshd/1
   233 root     0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   0   0   0   0 cron/1
Total: 42 processes, 181 lwps, load averages: 0.04, 0.03, 0.02
-v, -m 옵션을 붙인 경우 각 컬럼별 의미는 다음과 같다다. 자세한 사항은 prstat(1)을 참조하자.

NumaTOP

rstat

RPC를 사용한 원격 호스트의 상태를 알 수 있는 rstat(3rpc) 서비스가 있다. 이 서비스의 클라이언트로 솔라리스에서는 rup(1)가 있다. 리눅스에서는 rstatd 4 Linux를 설치해 사용해볼 수 있다.
root@wl ~ # svcadm enable /network/rpc/rstat:default
root@wl ~ # rpcinfo -p
...
    100001    2   udp  42277  rstatd
    100001    3   udp  42277  rstatd
    100001    4   udp  42277  rstatd
root@wl ~ # rup localhost wl
      localhost    up   1 days, 00:00,    load average: 0.15, 0.14, 0.12
             wl    up   1 days, 00:00,    load average: 0.15, 0.14, 0.12
아래는 간단한 rstat 클라이언트 예제다.
rstat.c
(2,656 바이트)
/*
	Simple rstat client for Solaris
	WindyHana's Solanara http://www.solanara.net/solanara/top
	cc -lrpcsvc -lsocket -lnsl -o rstat rstat.c
*/
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <rpc/rpc.h>
#include <rpcsvc/rstat.h>

char DEFAULT_HOST[] = "127.0.0.1";


int main(int argc, char *argv[]) {
	struct statstime statp1;
	struct statstime statp2;
	enum clnt_stat rlt1 = (enum clnt_stat) rstat(DEFAULT_HOST, &statp1);
	if (rlt1 != RPC_SUCCESS) {
		clnt_perrno(rlt1);
		return 1;
	}
	sleep(1);
	enum clnt_stat rlt2 = (enum clnt_stat) rstat(DEFAULT_HOST, &statp2);
	int hd = havedisk(DEFAULT_HOST);
	if (rlt2 == RPC_SUCCESS) {
		printf("Load: %.2f / %.2f / %.2f\n",
			statp1.avenrun[0] * 1.0 / FSCALE, statp1.avenrun[1] * 1.0 / FSCALE, statp1.avenrun[2] * 1.0 / FSCALE);
		unsigned int cpu_user = statp2.cp_time[RSTAT_CPU_USER] - statp1.cp_time[RSTAT_CPU_USER];
		unsigned int cpu_nice = statp2.cp_time[RSTAT_CPU_NICE] - statp1.cp_time[RSTAT_CPU_NICE];
		unsigned int cpu_sys = statp2.cp_time[RSTAT_CPU_SYS] - statp1.cp_time[RSTAT_CPU_SYS];
		unsigned int cpu_idle = statp2.cp_time[RSTAT_CPU_IDLE] - statp1.cp_time[RSTAT_CPU_IDLE];
		unsigned int cpu_total = cpu_user + cpu_nice + cpu_sys + cpu_idle;
		
		printf("DISK: ");
		for (int i = 0; i < RSTAT_DK_NDRIVE; i ++) {
			printf("%d=%dops/s%s", i, statp2.dk_xfer[i] - statp1.dk_xfer[i], i + 1 != RSTAT_DK_NDRIVE ? ", " : "");
		}
		printf("\n");
		
		printf("CPU: %.1f%% user, %.1f%% nice, %.1f%% sys, %.1f%% idle\n",
			cpu_user * 100.0 / cpu_total,
			cpu_nice * 100.0 / cpu_total,
			cpu_sys * 100.0 / cpu_total,
			cpu_idle * 100.0 / cpu_total);
		printf("INET: %d i_pkts/s, %d i_errs/s, %d o_pkts/s, %d o_errs/s, %d col/s\n",
			statp2.if_ipackets - statp1.if_ipackets,
			statp2.if_ierrors - statp1.if_ierrors,
			statp2.if_opackets - statp1.if_opackets,
			statp2.if_oerrors - statp1.if_oerrors,
			statp2.if_collisions - statp1.if_collisions);
		printf("MEM: %u pgin/s, %u pgout/s, %u swpin/s, %u swpout/s, %u intr/s, %u swtch/s\n",
			statp2.v_pgpgin - statp1.v_pgpgin,
			statp2.v_pgpgout - statp1.v_pgpgout,
			statp2.v_pswpin - statp1.v_pswpin,
			statp2.v_pswpout - statp1.v_pswpout,
			statp2.v_intr - statp1.v_intr,
			statp2.v_swtch - statp1.v_swtch);

		long tv_sec_b = statp2.boottime.tv_sec;
		struct tm * struct_time_b = localtime(&tv_sec_b);
		printf("BOOT TIME: %s", asctime(struct_time_b));
		
		long tv_sec_c = statp2.curtime.tv_sec;
		struct tm * struct_time_c = localtime(&tv_sec_c);
		printf("CUR TIME: %s", asctime(struct_time_c));
		
		printf("%s\n", hd == 1 ? "Have Disk" : "No Disk or Not Determined");
	} else {
		clnt_perrno(rlt2);
	}
	return 0;
}

RSS ATOM XHTML 5 CSS3