시스템의 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가 발생하고 있는 프로세스만 보여준다.