검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/모니터링
참조 원문: Monitor disk io on linux server with iotop and cron

  iotop을 그냥 실행하면 프로세스들의 디스크IO 현황을 보여줍니다. 여기서 cron을 사용하여 지속적으로 현황을 기록한 후 분석하는 것이 이 글의 목표입니다. 이 글에서는 cron을 통해 iotop을 백그라운드로 실행하여 디스크IO 현황을 파일로 기록합니다. 아래는 cron에 적용할 명령어와 출력 예제입니다.
$ iotop -botqqqk --iter=60
17:38:13   335 be/3 root        0.00 K/s    7.64 K/s  0.00 %  2.30 % [jbd2/sda6-8]
17:38:13  3296 be/4 enlighte    0.00 K/s   15.28 K/s  0.00 %  0.00 % chrome
17:38:14   335 be/3 root        0.00 K/s    7.62 K/s  0.00 %  3.35 % [jbd2/sda6-8]
17:38:14  3293 be/4 enlighte    0.00 K/s    7.62 K/s  0.00 %  0.02 % chrome
17:38:15  3319 be/4 enlighte    0.00 K/s   19.09 K/s  0.00 %  0.00 % chrome
  iotop을 실행하기 위해선 root 권한이 있어야 하므로 우분투 계열에서 시험해보려면 sudo 명령어가 필요합니다. 위 옵션 중 가장 중요한 것은 "b"로서 배치 모드로 실행하게 만듭니다. 배치 모드일 때는 한 화면에 지속적으로 출력을 갱신시키지 않고 결과를 그대로 출력합니다. 이를 통해 일정 기간 동안의 IO 사용률을 기록할 수 있습니다. "o" 옵션은 실제로 IO가 발생한 프로세스들만 출력시키는 옵션입니다. 이 옵션을 주지 않으면 모든 프로세스가 출력되어 필요하지 않은 내용까지 출력됩니다. "t" 옵션은 출력에 시간을 포함시키는 역할을 합니다. "k" 옵션은 모든 크기 수치를 킬로바이트로 표시하게 합니다.

  출력 내용을 기록하기 위해 간단히 파일로 리다이렉트를 할 겁니다. 위치는 /var/log, 파일명은 iotop로 할 것입니다.
$ iotop -botqqqk --iter=60 >> /var/log/iotop
  이 명령어를 실행하면 1초당 1번씩 총 60번의 iotop 출력 결과가 /var/log/iotop 파일에 기록됩니다. 그러므로 이 명령어는 cron을 통해 매분 실행해야 합니다. root 권한으로 /etc/cron.d/iotop 파일을 생성하여 아래의 내용을 넣습니다.
* * * * * root /usr/sbin/iotop -botqqqk --iter=60 >> /var/log/iotop
  이제 cron이 매분 위 명령어를 실행할 것이며 그때마다 1분 동안 1초마다 샘플을 수집하여 모든 IO 활동을 /var/log/iotop에 기록합니다. 행여나 프로그램의 경로가 위와 다를 수 있으니 which 명령어를 통해 iotop이 있는 위치를 확인합니다.
$ which iotop
/usr/sbin/iotop
  이제 출력 결과 중 디스크IO가 10K/s 이상인 것들만 기록하도록 실행 명령어를 변경해보겠습니다.
$ sudo iotop -botqqqk --iter=60 | grep -P "\d\d\.\d\d K/s"
17:49:02   335 be/3 root        0.00 K/s   41.90 K/s  0.00 %  8.43 % [jbd2/sda6-8]
17:49:02  3307 be/4 enlighte    0.00 K/s  152.36 K/s  0.00 %  0.87 % chrome
17:49:10  3310 be/4 enlighte    0.00 K/s   22.80 K/s  0.00 %  0.10 % chrome
17:49:15  3319 be/4 enlighte    0.00 K/s   26.54 K/s  0.00 %  2.50 % chrome
17:49:16  3310 be/4 enlighte    0.00 K/s   19.02 K/s  0.00 %  0.00 % chrome
  정규식 부분만 바꾸면 원하는 조건으로 쉽게 추출할 수 있습니다. 예를 들어 1M/s 이상만 추출하고 싶다면 정수 부분을 위의 2개에서 4개로만 바꾸면 됩니다.

  위의 명령어를 이전에 생성한 cron 파일에 적용합니다.
* * * * * root /usr/sbin/iotop -botqqqk --iter=60 | grep -P "\d\d\.\d\d K/s"  >> /var/log/iotop
  아래는 그 결과의 예입니다.
13:19:01  1325 be/4 root        0.00 K/s 1897.74 K/s  0.00 %  5.65 % [kjournald]
13:24:22  2836 be/4 mysql       0.00 K/s 1071.07 K/s  0.00 %  0.18 % mysqld
13:32:01  1325 be/4 root        0.00 K/s 1469.17 K/s  0.00 %  7.13 % [kjournald]
13:46:18 10978 be/4 binary   1634.31 K/s    0.00 K/s  0.00 % 23.87 % php-fpm: pool binary
13:47:01  2955 be/4 mysql       0.00 K/s 8738.80 K/s  0.00 %  0.00 % mysqld
14:17:01  1325 be/4 root        0.00 K/s 1354.01 K/s  0.00 %  6.84 % [kjournald]
14:23:02  1325 be/4 root        0.00 K/s 1146.18 K/s  0.00 %  4.69 % [kjournald]
14:25:01  1325 be/4 root        0.00 K/s 1494.21 K/s  0.00 % 11.05 % [kjournald]
14:34:01  9938 be/4 mysql       0.00 K/s 2878.55 K/s  0.00 %  0.00 % mysqld
14:36:01  9424 be/4 mysql       0.00 K/s 2694.21 K/s  0.00 %  0.00 % mysqld
  여기에 추가로 logrotate를 사용하여 매주 로그 파일을 교체해주면 더 좋습니다. /etc/logrotate.d/iotop 파일을 생성하여 아래 내용을 넣기만 하면 됩니다.
/var/log/iotop.log {
weekly
compress
notifempty
missingok
}
2013/10/25 11:20 2013/10/25 11:20