1. 주요 명령어 비교

항목 IBM (AIX) Sun HP/UX
CPU 정보 sar -P ALL 1 psrinfo -v glance
CPU 사용량 topas top top, glance
메모리 정보 topas prtinfo dmesg
프로세스 메모리 ps aux ps -elf, ps -aux ps -elf
시스템 메모리 vmstat prtmem, vmstat vmstat
로그 /var/adm/syslog /var/adm/messages /var/adm/syslog/syslog.log
OS uname -a uname -a uname -a
패치 lslpp -L | grep motif showrev -a swlist
I/O iostat 3 1 iostat 3 1 iostat 3 1

2. vmstat

2-1. 설명

vmstat은 CPU, 메모리 등 주요 시스템 자원을 모니터링할 수 있는 명령어이다. 일반적으로 “vmstat 3 5”와 같은 방식을 많이 사용한다. (3초 간격으로 모니터링 정보를 5개 출력을 의미함) 단, 명령어 결과 중 첫번째 줄은 부팅 이후 각 통계치에 대한 평균값을 보여주므로 무시해야 한다.

kthr(Kernel Thread State Change) 영역의 r은 큐에 대기 중인 수다. 이 값을 현재 장착된 CPU의 수로 나누어 시스템의 busy 정도를 판단한다. b는 I/O 작업을 위하여 블록 처리된 수를 나타낸다. 만일 이 수치가 높다면, 디스크 I/O에 이슈가 없는지 확인한다.
 
memory 영역의 avm은 Active Virtual Memory의 약자로 사용 중인 물리 메모리와 가상 메모리의 합이다. 단위는 페이지 수로, 일반적으로 1개 page는 4096 bytes인 경우가 많지만 pagesize등의 OS 명령어를 통하여 재확인이 필요하다. page 영역의 sr 필드는 초당 스캐닝 하는 page 수로 이 값이 클수록 메모리 부족한 상황임을 나타낸다.
 
cpu 영역의 sy 필드의 값이 지나치게 높을 경우 디스크 I/O에 문제가 있을 가능성이 높다. id 필드의 값이 0인 경우 cpu를 100% 사용하고 있다는 것을 뜻하므로, top, ps, sar 등의 명령어를 통해 cpu를 많이 사용하는 프로세스를 식별한다.
 
swap 영역의 so(swap out) 필드는 0에 가까운 상태를 유지하는지 모니터링 할 필요가 있다. 그렇지 않을 경우 가상 메모리를 놓고 프로세스간 경쟁이 발생할 수 있다.

2-2. AIX 서버에서의 vmstat

  • 명령어 : $ vmstat -v | tail -5
  • pbuf가 부족할 경우
    - Pending Disk I/O가 Block되므로, 이 경우 ioo 명령어로 pv_min_pbuf를 증가시켜야 함
  • psbuf가 부족할 경우
    - Paging Space I/O가 Block되므로, 이 경우 Paging을 중지시키고 Paging Space를 늘려야 함
  • fsbuf가 부족할 경우
    - JFS File System I/O가 Block되므로, 이 경우 ioo 명령어로 numfsbufs를 증가시켜야 함 (numfsbufs는 Default가 196이나 568 이상을 권장함)
  • fsbuf가 부족할 경우
    - NFS나 vxfs의 Client File System의 I/O 또한 Block되므로, 이 경우 nfs_v3_pdts와 nfs_v3_vm_bufs를 늘려야 함
  • fsbuf가 부족할 경우
    - NFS2의 External Pager File System의 I/O 또한 Block되므로, 이 경우 j2_nbufPerPageDevice를 2048 이상(Default 512), j2_dynamicBufferPreallocation을 ioo 명령어로 늘려야 함

3. iostat

각 디스크의 부하 등을 모니터링 할 때 사용하는 명령어이다. vmstat의 경우처럼 옵션간격과 수행횟수가 인자로 들어간다.

Sun 서버에서 iostat -iE 로 실행하면 장비의 오류를 확인할 수 있다. 또한 iostat -txc 로 실행하면 과부하 상태를 확인할 수 있다. svc_t 필드, 즉 서비스 타임이 30초간 30%가 넘는 디스크는 점검할 필요가 있다.

4. topas

AIX 서버에서 기본으로 제공하는 실시간 시스템 모니터링 툴이다. 시각적인 모니터링에 유리하지만, 별도의 로그를 남길 수 없다는 단점이 있다.
 
topas에서 제공하는 프로세스별 cpu 수치는 각 cpu의 사용률을 합한 수치이다. 즉, 101%를 사용하는 프로세스가 있고 cpu 개수가 4개라면 실제로는 101/4 = 25.25%를 사용하고 있다는 뜻이다. cpu별로 사용률을 확인하고 싶다면 sar를 사용할 수 있다. PgSp는 프로세스에 할당된 페이징의 량을 MB(Mega Bytes)로 나타낸 것이다.
 
메모리 영역은 물리적 메모리와 페이징에 대한 정보를 제공한다. 물리적 메모리는 Comp(computational area = 계산 가능 영역)와 Noncomp(noncomputational area = 계산 불가 영역)이 있으며, Noncomp는 파일 캐싱 용도로 사용된다.
 
기본적으로 topas나 nmon은 수퍼 유저(root)에게만 개방이 되어 있다. 하지만 /dev/kmem을 other에게도 read 권한을 주면 일반 유저도 사용할 수 있게 된다. /dev/kmem은 시스템 메모리나 I/O 주소 공간에 읽기, 쓰기 권한을 허용하는 목적의 파일이다.

5. top

시스템의 상태를 볼 수 있는 명령어이다.

예: 메모리 real 부분의 3767964K는 시스템의 모든 프로세스에 할당된 물리적 메모리 량이며, 괄호안의 2726444K는 실행 중인 프로세스의 물리적 량이다. virtual 부분은 말그대로 가상 메모리를 포함한 경우이다. free가 적다면 swap이 발생할 가능성은 높아진다.
 
프로세스 정보 부분에서 RES(RESident set size) 영역은 프로세스가 실제 사용하는 메모리 량이다. 서버에 메모리가 부족할 경우 어떠한 프로세스가 많은 메모리를 사용하는지 확인하고자 할 때 유용하다. 그 앞 필드의 SIZE는 프로세스가 사용하는 가상 메모리까지 포함한 량이다.
 

PRI 필드는 프로세스가 OS 프로세스 스케쥴러에서 갖는 우선순위이다. 우선순위가 높으면 낮은 것보다 우선적으로 실행된다. NICE는 프로세스의 nice 값으로 음수인 경우 우선순위를 갖는다.

일반적으로 I/O 위주의 작업은 우선순위를 변경해도 크게 달라지는 것이 없다. 보통 I/O를 대기하느라 많은 시간을 소비하는 프로세스는 이에 대한 보상으로 시스템 자체에서 우선순위를 높여주기 때문이다. 하지만 CPU 위주의 프로세스, 예를 들어 복잡한 계산을 하는 프로그램 등의 우선순위를 낮추면 영향은 많다, 예를 들어 이 경우 키보드 입력 반응 속도를 높일 수 있기도 하다.

  • 프로세스 전체 명령행을 확인하고자 한다면 top -c로 실행한다.
  • top -b로 실행하면 화면 갱신 없이 단 1회만 결과를 출력하므로 모니터링을 위하여 주기적으로 top의 결과를 텍스트로 받아 저장해야 할 경우에 유용하다.

6. ps

RSS 필드는 물리적 메모리 사용량이며, SZ는 가상 메모리를 포함한 량이다. 단위는 KB(Kilo Bytes)이다.

  • ps -elf 명령을 사용할 수도 있다. 메모리와 관련이 있는 필드는 SZ인데 가상 메모리를 포함한 량을 나타내며, 단위는 페이지 수로 앞서 언급한 바와 같이 pagesize 명령어로 확인이 필요하다.
  • 리눅스에서 pe -eLF 명령을 사용하면 CPU를 많이 사용하는 스레드를 식별할 수 있다.
    - LWP 행 : 스레드 ID
    - C 행 : CPU 사용률
    - NLWP 행 : 프로세스 스레드 수

7. truss

프로세스가 어떠한 일을 하는지 모니터링 할 수 있다. truss -p 프로세스번호 로 실행한다.


8. strace

truss의 리눅스 버전이다.

hostname 명령어를 실행하면서 확인해보겠다. strace hostname 과 같이 실행하면 된다.

execve("/bin/hostname", ["hostname"], [/* 20 vars */]) = 0

결과의 처음에 나타나는 execve는 새로운 프로세스를 생성하고 커맨드를 실행하는 System call이다. 아무튼 환경에 따라 다르겠지만 -o 옵션으로 생성한 System Call output 파일의 크기는 3,853바이트이다.

그러면 이번에는 hostname -f 옵션으로 실행해보았다. -f 옵션은 다음과 같은 의미를 지닌다.

Display  the  FQDN (Fully Qualified Domain Name). A FQDN consists of a short host name and the DNS domain name. Unless you are using bind or NIS for host lookups  you  can  change the FQDN and the DNS domain name (which is part of the FQDN) in the /etc/hosts file. See  the  warnings  in  section  THE  FQDN above, and avoid using this option; use hostname --all-fqdns instead.

아무튼 그랬더니 그 결과는 8,821바이트였다. 훨씬 더 많은 일을 하는 것을 알 수 있다.

앞서 아무런 옵션을 사용하지 않은 hostname의 strace 결과와 비교해보니 끝부분부터 새로운 내용들이 추가되고 있었다. 

getpid()                                = 13064
open("/etc/resolv.conf", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=76, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f34c91ca000
read(3, "; generated by /sbin/dhclient-sc"..., 4096) = 76
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f34c91ca000, 4096)            = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(3)                                = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(3)                                = 0
open("/etc/nsswitch.conf", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1688, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f34c91ca000
read(3, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1688
read(3, "", 4096)                       = 0
close(3)                                = 0

FQDN을 획득하기 위한 작업들이 이루어짐을 알 수 있다. 단순 hostname과 달리 /etc/resolv.conf에 접근하는 것도 확인할 수 있다. 


9. svmon

AIX 서버에서 메모리의 현재 상태에 대한 정보를 보여준다.
 
-G 옵션은 시스템 전체 메모리 사용량 통계를 보여준다. 전체 메모리는 4194304*4096 bytes, 즉 16GB이다. 4096은 이 시스템의 page 크기다. (pagesize 명령어로 확인) 여유 메모리는 7.3GB이다.
 
사용자 별로 확인하는 -U 옵션, 명령어 별로 확인하는 -C 등이 있으며, 프로세스 별로 확인하는 -P 옵션도 많이 사용된다.

10. CPU 확인

리눅스에서 CPU를 확인한 결과이다.

# cat /proc/cpuinfo
processor   : 0
vendor_id   : AuthenticAMD
cpu family  : 21
model       : 2
model name  : AMD Opteron(tm) Processor 6380
stepping    : 0
cpu MHz     : 2500.028
cache size  : 512 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb lm up rep_good extd_apicid unfair_spinlock pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 popcnt aes xsave avx f16c hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm npt nrip_save bmi1
bogomips    : 5000.05
TLB size    : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

11. 커널 확인

리눅스에서 커널 처리비트를 확인한 결과이다.

# getconf WORD_BIT
32

12. 위와 같은 유닉스 메모리 모니터링시 주의사항

유닉스에서 사용하는 메모리는 크게 파일 캐싱과 프로세스가 사용하는 힙 영역의 두가지로 나눌 수 있다.
 
특정 프로세스가 내부에 할당시킨 메모리 영역은 내부에서 free 하였다고 하더라도 그 프로세스 이외 다른 프로세스가 사용할 수 없다. 즉, 내부에서 free() 하였더라도 ps 등의 명령어로 보면 여전히 해당 프로세스가 점유하고 있는 것으로 보인다. 결국 일정시간이 지날수록, 해당 프로세스가 사용하는 영역이 증가하는 듯한 결과가 나타나고, 마치 전체 free 영역이 모자라는 것처럼 보이게 된다.
 
AIX의 경우 가용한 메모리를 대부분 파일 캐싱을 위해 사용한다. 따라서 vmstat, topas, sar 등으로 모니터링 시 메모리가 턱없이 부족한 것처럼 보인다. 그러나 그것은 정말 메모리가 부족한 것이 아니다. 커널이 알아서 조정하기 때문이다.
 
정말 메모리가 부족한 것인가 확인하기 위해서는 vmstat 3 으로 모니터링 한다. 만일 fr, sr 필드가 지속적으로 튄다면 그것은 정말 메모리가 부족한 경우이다.
 
AIX 외에 Linux 역시 가용한 메모리를 파일 캐싱을 위해 사용한다. 어떠한 프로세스가 급하게 메모리를 요청하면 파일 캐싱에 할당한 일부를 떼어주게 된다.
 
결론적으로 유닉스에서 현재 실제 사용하고 있는 메모리를 산정할 수 있는 방법은 없다. Vmstat, topas, sar, ps 등으로 확인할 때 그 결과는 모두 제각각이다. 유일하게 확인 할 수 있는 것은 “얼마나 가용한 메모리가 남아있는가” 그리고 “현재 메모리가 부족한가” 정도이다.
 
추가적으로, AIX의 경우 lsps -a 로 확인하여 %Used 사용 정도의 메모리 증설을 제안할 수 있다.