시스템의 3대 자원이라고 하면 CPU, 메모리, I/O를 꼽는데 이의를 달기는 어려울 것이다. 각 항목을 어떻게 모니터링할지 고민해 보자.
 
1. CPU
 
우선 알아둘 것이 있는데 CPU 사용량에는 User, System, I/O, 기타 등이 있다. 일반적인 경우는 User가 많다.
 
***************
1-1. top
***************
 
소수점 첫째자리까지 보여주는 툴이다.
 
그냥 top를 치면 실시간으로 계속 변화한다. 특정 횟수만큼만 보고 싶다면 -n [횟수]
 
만약 Cpu 사용률만 보고 싶다면 다음과 같은 커맨드를 이용할 수 있다.
 
# top -n 1 | grep Cpu\(
 
 
***************
1-2. vmstat
***************
 
X초 간격으로 Y번 볼 수 있는 툴이다. (X초 동안의 평균값을 보여준다) CPU뿐 아니라 메모리, 스왑, I/O에 대한 내용을 한 눈에 볼 수 있다.
 
-t 옵션을 사용하면 시간도 찍어준다.
 
# vmstat 1 10 -t
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 743420 454652  93424 124172    0    0     2     8    0    0  1  0 99  0  0        2016-11-25 09:02:51 KST
 0  0 743420 454644  93424 124172    0    0     0     0   98  239  0  0 100  0  0       2016-11-25 09:02:52 KST
 0  0 743420 454644  93428 124168    0    0     0    80   95  245  1  0 99  0  0        2016-11-25 09:02:53 KST
 0  0 743420 454644  93428 124172    0    0     0     0  104  252  0  0 100  0  0       2016-11-25 09:02:54 KST
 4  0 743420 453636  93428 124172    0    0     0     0  114  262  1  1 98  0  0        2016-11-25 09:02:55 KST
 1  0 743420 452992  93428 124176    0    0     0     0  192  306  4  1 95  0  0        2016-11-25 09:02:56 KST
 0  0 743420 452984  93428 124176    0    0     0     0   89  268  1  0 99  0  0        2016-11-25 09:02:57 KST
 1  0 743420 452984  93428 124176    0    0     0     0   89  245  1  0 99  0  0        2016-11-25 09:02:58 KST
 0  0 743420 452984  93436 124172    0    0     0    60  105  243  1  0 99  0  0        2016-11-25 09:02:59 KST
 0  0 743420 452984  93436 124176    0    0     0    12  123  265  1  1 98  0  0        2016-11-25 09:03:00 KST
 
-s 옵션을 쓰면 출력을 변경할 수 있다.
 
# vmstat -s
      1922880  total memory
      1468600  used memory
       954208  active memory
       397500  inactive memory
       454280  free memory
        93656  buffer memory
       124236  swap cache
      4095992  total swap
       743420  used swap
      3352572  free swap
     23135220 non-nice user cpu ticks
         6849 nice user cpu ticks
      7080406 system cpu ticks
   3395853169 idle cpu ticks
      1719769 IO-wait cpu ticks
       306628 IRQ cpu ticks
        79700 softirq cpu ticks
       745106 stolen cpu ticks
     52957432 pages paged in
    284538654 pages paged out
       309473 pages swapped in
       480667 pages swapped out
   2368227709 interrupts
   1298554622 CPU context switches
   1445658680 boot time
      7741068 forks
 
 -d 옵션을 쓰면 디스크에 대한 보다 상세한 정보를 볼 수 있다.
 
# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
loop4      0      0       0       0      0      0       0       0      0      0
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
vda   1342845 476201 104927698 4752510 33658968 35484822 553122808 349552702      0  31218
vdb    25387  13128  985246   23476  30287 2479664 15957044 7361440      0    131
 
 
***************
1-3. mpstat
***************
 
top이 소수점 첫째자리까지 보여준다면 mpstat은 소수점 둘째자리까지 보여준다.
 
역시 X초 간격으로 Y번 볼 수 있는 툴이다.
 
기본적으로 시간을 찍어주기 때문에 -t 옵션은 제공되지 않는다.
 
# mpstat 1 10
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

09:05:19 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
09:05:20 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:05:21 AM  all    1.00    0.00    0.00    1.00    0.00    0.00    0.00    0.00   98.00
09:05:22 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:05:23 AM  all    0.99    0.00    0.99    0.00    0.00    0.00    0.00    0.00   98.02
09:05:24 AM  all    4.00    0.00    1.00    0.00    0.00    1.00    0.00    0.00   94.00
09:05:25 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:05:26 AM  all    1.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.99
09:05:27 AM  all    2.00    0.00    0.00    0.00    0.00    0.00    1.00    0.00   97.00
09:05:28 AM  all    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
09:05:29 AM  all    1.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   98.00
Average:     all    1.10    0.00    0.30    0.10    0.00    0.10    0.10    0.00   98.30
 
아무런 옵션을 주지 않으면 Global 사용률(all)을 보여준다. -P 옵션을 쓰면 특정 Processor만 볼 수 있고 -P ALL하면 모든 Processor에 대해 보여준다.
 
 
***************
1-4. iostat
***************
 
iostat도 CPU 정보를 제공한다. iostat -c 옵션을 쓰면 상세히 볼 수 있다.
 
# iostat -c
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.67    0.00    0.22    0.05    0.02   99.04
 
 
***************
1-4. pidstat
***************
 
pidstat을 통해 특정 프로세스 및 내부 스레드의 현황을 볼 수 있다.
 
# pidstat -p 2666
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

10:27:11 AM       PID    %usr %system  %guest    %CPU   CPU  Command
10:27:11 AM      2666    0.00    0.00    0.00    0.00     0  java
 
2666은 자바 프로세스이다. 내부 스레드까지 보자.
 
# pidstat -t -p 2666
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

10:27:24 AM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
10:27:24 AM      2666         -    0.00    0.00    0.00    0.00     0  java
10:27:24 AM         -      2666    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2667    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2668    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2669    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2670    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2671    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2672    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2673    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2674    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2675    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2676    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2677    0.00    0.00    0.00    0.00     0  |__java
10:27:24 AM         -      2678    0.00    0.00    0.00    0.00     0  |__java
 
 
2. 메모리
 
***************
2-1. ps
***************
 
기본적으로 프로세스 현황을 보는 용도이지만 메모리 확인도 가능하다.
 
# ps -efl
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 -  4808 poll_s  2015 ?        00:02:54 /sbin/init
5 S root       983     1  0  80   0 - 64048 poll_s  2015 ?        00:14:36 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
5 S dbus       995     1  0  80   0 -  5351 poll_s  2015 ?        00:00:00 dbus-daemon --system
5 S root      1027     1  0  80   0 - 16003 poll_s  2015 ?        00:14:59 /usr/sbin/sshd
1 S root      1035     1  0  80   0 - 29208 hrtime  2015 ?        00:02:23 crond
1 S root      1042     1  0  80   0 - 27041 wait    2015 ?        00:00:00 /bin/sh /etc/rc3.d/S99local start
0 S mysql    31224 30613  0  80   0 - 31611 n_tty_ Nov23 pts/1    00:00:00 mysql -umysqluser -p
 
SZ가 의미하는 것은 다음과 같다.
 
approximate amount of swap space that would be required if the process were to dirty all writable pages and then be swapped out. This number is very rough!
 
조금 바꿔서 확인하자.
 
# ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss
USER       PID  PPID   RSS    SZ    VSZ %MEM %CPU     TIME CMD
mysql     4916     1 28732 745184 789876  1.4 0.0 03:26:06 ./mysqld
root      8499     1 25496 1153680 1294820  1.3 0.0 05:49:30 /java/bin/java -classpath /app/testapp/
root      2944  1027  4496   800 102424  0.2  0.0 00:00:03 sshd: root@pts/1
root     30763  1027  4492   804 102428  0.2  0.0 00:00:01 sshd: root@pts/2
root     17932  1027  4484   800 102424  0.2  0.0 00:00:00 sshd: root@pts/0
 
RSS 기준으로 내림차순으로 보았다.
 
  • RSS - resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).
  • VSZ - virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).
 
 
***************
2-2. pidstat
***************
 
각 프로세스의 정보를 보여주는 pidstat을 사용하여 메모리 확인을 할 수 있다.
 
# pidstat -r
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

10:00:59 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:00:59 AM         1      0.00      0.00   19232    684   0.04  init
10:00:59 AM       369      0.00      0.00   10976    340   0.02  udevd
10:00:59 AM       929      0.00      0.00    9120    676   0.04  dhclient
10:00:59 AM       967      0.00      0.00   93200    532   0.03  auditd
10:00:59 AM       983      0.00      0.00  256192   5188   0.27  rsyslogd
10:00:59 AM       995      0.00      0.00   21404    216   0.01  dbus-daemon
10:00:59 AM      1027      0.59      0.00   64012    516   0.03  sshd
10:00:59 AM      1035      0.08      0.00  116832    456   0.02  crond
10:00:59 AM      1042      0.00      0.00  108164    124   0.01  S99local
10:00:59 AM      1052      0.00      0.00    4064    232   0.01  mingetty
10:00:59 AM      1054      0.00      0.00    4064    232   0.01  mingetty
10:00:59 AM      1056      0.00      0.00    4064    232   0.01  mingetty
10:00:59 AM      1058      0.00      0.00    4064    232   0.01  mingetty
10:00:59 AM      1060      0.00      0.00    4060    232   0.01  mingetty
10:00:59 AM      2663      0.00      0.00  106060   1352   0.07  sh
10:00:59 AM      2666      0.00      0.00 2182184 469820  24.43  java
10:00:59 AM      2944      0.00      0.00  102424   4496   0.23  sshd
10:00:59 AM      2946      0.00      0.00  108432   2004   0.10  bash
10:00:59 AM      4916      0.00      0.00  789876  28792   1.50  mysqld
10:00:59 AM      5205      0.00      0.00  984628   6028   0.31  httpd
10:00:59 AM      5264      0.00      0.00  984760   6108   0.32  httpd
10:00:59 AM      5310      0.00      0.00  984628   6132   0.32  httpd
10:00:59 AM      5349      0.00      0.00  984628   6044   0.31  httpd
 
물론 특정 프로세스만 볼 수도 있다.
 
# pidstat -r -p 31224
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

10:02:08 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:02:08 AM     31224      0.00      0.00  126444   3100   0.16  mysql
  
특정 프로세스를 10초간 5번 보자.
 
# pidstat -r -p 2666 10 5
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

10:03:29 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:03:39 AM      2666      2.00      0.00 2182184 469820  24.43  java
10:03:49 AM      2666   1437.79      0.10 2182184 491548  25.56  java
10:03:59 AM      2666    893.69      0.20 2182228 502604  26.14  java
10:04:09 AM      2666     11.07      0.00 2182228 502936  26.16  java
10:04:19 AM      2666      0.10      0.00 2182228 502872  26.15  java
Average:         2666    468.71      0.06 2182210 493956  25.69  java
 
VSZ와 RSS의 차이점을 알아보자.
 
  • VSZ - Virtual Size: The virtual memory usage of entire task in kilobytes.
  • RSS - Resident Set Size: The non-swapped physical memory used by the task in kilobytes.
 
 
***************
2-3. ipcs
***************
 
IPC(Inter Process Communication) 상태를 조회하는 것이다.
 
-q 옵션으로 런큐에 대한 내용을 볼 수 있다.
 
# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
 
나의 테스트 환경에서는 없다.
 
-m 옵션은 공유 메모리(Shared Memory)를 볼 수 있다.
 
-s 옵션은 세마포어 값을 볼 수 있다.
 
# ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 0          root       600        1
0x00000000 32769      root       600        1
0x00000000 655362     nobody     600        1
0x00000000 688131     nobody     600        1
0x00000000 720900     nobody     600        1
 
  
3. I/O
 
***************
3-1. iostat
***************
 
앞에 CPU 편에서 잠시 소개한 바 있다. 이름처럼 I/O에 대한 종합적인 내용을 알려준다.
 
# iostat
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.67    0.00    0.22    0.05    0.02   99.04

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda               1.02         3.06        16.13  104927706  553133208
vdb               0.00         0.03         0.47     985246   15957044
 
-c 옵션이 CPU에 대한 내용을 보여준다고 했는데, -d 옵션을 쓰면 디스크 I/O에 대한 내용을 보여준다.
 
# iostat -d
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda               1.02         3.06        16.13  104927706  553133712
vdb               0.00         0.03         0.47     985246   15957044
 
-p [디바이스명] 옵션을 쓰면 특정 디바이스에 대한 내용을 보여준다.
 
# iostat -p vda
Linux 2.6.32-279.el6.x86_64 (SERVER)       11/25/2016      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.67    0.00    0.22    0.05    0.02   99.04

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda               1.02         3.06        16.13  104929506  553211944
vda1              1.02         2.99        16.02  102449266  549366480
vda2              0.00         0.07         0.11    2478944    3845464
 
다음 링크도 같이 확인해보자 : http://sarc.io/index.php/forum/tips/740
 
 
 
***************
3-2. iotop
***************
 
이름처럼 I/O 계의 top이다.
 
-o (--only) 옵션을 쓰면 I/O가 발생하고 있는 프로세스만 보여준다.