본문 바로가기

Linux/Linux Command

Linux Command - iostat

Disk i/o에 대한 부하 체크를 위해서 일반적으로 많이 쓰이는 것이 iostat, vmstat 등이 있습니다.

그중 가장 기본적으로 쓰이는 iostat을 보도록 하겠습니다

 

Syntax

iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
       [  -j { ID | LABEL | PATH | UUID | ... } [ device [...] | ALL ] ] [ device [...] | ALL ]
       [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

 

옵션을 간단히 설명을 하자면

-c CPU 활용 분석 display 이런식으로 avg-cpu가 뜨게끔 되어 있고 뒤에 있는 숫자는 몇초마다 반복 할 것인지!

[root@CHUNG ~]# iostat -c 1
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                0.04    0.00      0.03      0.00      0.00      99.93

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                0.00    0.00      0.00      0.00     0.00      100.00

 

여기서 나오는 지표는 %user, %nice, %system, %iowait, %steal, %idle 인데요.

%user는 100%의 CPU 자원 중 얼마나 유저가 사용하고 있는지를 나타냅니다.

%nice는 우선순위가 바뀐 프로세스가 사용하는 시간입니다.

%system은 CPU 자원이 시스템에서 쓰이고 있음을 나타냅니다.

%iowait은 INPUT/OUTPUT을 하기 위하여 대기중인 percent입니다.

%idle은 잉여로운 CPU자원이고 iowait은 io를 행하기 위하여 대기중인 것이고 idle은 잉여자원입니다.

 

-t  시간에 맞는 전체 내용이 출력됩니다. 뒤에 숫자는 물론 몇초마다 반복 할 것인지! 입니다

[root@CHUNG ~]# iostat -t 1
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

11/03/2015 05:36:14 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.03    0.00    0.00   99.93

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.46         0.48        30.45   23655214 1486540676
sdb              14.59         2.47       330.92  120641509 16156464593

11/03/2015 05:36:15 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.00    0.00    0.00    0.00   99.97

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0

 

tps(Transaction per Seconds)는 시간당 전송 수로 초당 i/o입니다.

blk_read/s는 초당 블럭 읽는 수입니다.

blk_wrtn/s는 초당 블럭 쓰는 수입니다.

blk_read는 읽기 총 데이터 양입니다.

blk_wrtn는 쓰기 총 데이터 양입니다.

 

-d 장치 활용 분석 display

[root@CHUNG ~]# iostat -d sda
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda                 0.46   0.48             30.45        23655214   1486538684

 

 

-k 시간별 블럭을 kilobyte(KB)로 표시해 줍니다

[root@CHUNG ~]# iostat -k
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.03    0.00    0.00   99.93

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda                 0.46    0.24           15.22           11827607   743269518
sdb                 14.59   1.24           165.46         60320754   8078211644

 

-m 시간별 블럭을 megabyte(MB)로 표시해 줍니다

[root@CHUNG ~]# iostat -m
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.03    0.00    0.00   99.93

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda                 0.46     0.00           0.01             11550        725849
sdb                14.59    0.00            0.16             58906        7888879

 

-V iostat의 버전을 나타내 줍니다

[root@CHUNG ~]# iostat -V
sysstat version 9.0.4
(C) Sebastien Godard (sysstat <at> orange.fr)

 

-x 좀 더 디테일한 값을 볼 수 있습니다.

[root@CHUNG ~]# iostat -x 1
Linux 2.6.32-431.11.2.el6.x86_64 (CHUNG)  11/03/2015  _x86_64_ (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.03    0.00    0.00   99.93

Device:    rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda          0.00     3.35          0.01    0.46    0.48     30.45     66.69       0.00          3.81    0.20    0.01
sdb          0.00     27.46        0.03    14.56   2.47     330.92    22.85       0.00          0.14    0.08    0.12

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.03    0.00    0.00   99.97

Device:    rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda          0.00     0.00          0.00    0.00     0.00     0.00      0.00        0.00          0.00   0.00     0.00
sdb          0.00     0.00          0.00    0.00     0.00     0.00      0.00        0.00          0.00   0.00     0.00

 

rrqm/s는 디바이스로부터 초당 큐된 읽기 요청한 것을 합한 건수입니다.

wrqm/s는 디바이스로부터 초당 큐된 쓰기 요청한 것을 합한 건수입니다.

r/s는 디바이스로부터 초당 읽기 요청 수입니다.

w/s는 디바이스로 초당 쓰기 요청 수입니다.

rsec/s는 디바이스로부터 초당 읽기 섹터 수입니다.

wsec/s는 디바이스로 초당 쓰기 섹터 수입니다.

avgrq-sz(average request size)는 요청의 평균 크기입니다.

avgqu-sz(average queue-size)는 큐의 평균 크기로 짧으면 짧을 수록 좋습니다.

await 서버로부터 제공되어진 i/o 요청 평균 시간(milliseconds)입니다.

svctm 디바이스로부터 i/o 요청 평균 서비스 시간(milliseconds)입니다.

%util 디바이스로부터 i/o 요청된 동안의 cpu 시간 비율입니다.

 

--

실질적으로 iostat을 쓰게 된 것은 갑작스레 DB서버의 부하가 늘어나서였습니다.

 

서버 1

11/03/2015 05:15:04 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                1.36        0.00     1.64        0.16      0.00      96.85
Device:   rrqm/s   wrqm/s  r/s     w/s      rsec/s   wsec/s   avgrq-sz  avgqu-sz  await  svctm  %util
sda        0.00      0.00       0.00     0.00     0.00        0.00        0.00         0.00       0.00    0.00     0.00
sdb        0.00     146.00     12.00   1246.00   384.00    12536.00  10.27        0.15       0.12    0.11    14.00


서버 2

11/03/2015 05:15:03 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                1.67      0.00       1.48        0.38      0.00      96.46
Device:   rrqm/s  wrqm/s  r/s     w/s     rsec/s   wsec/s   avgrq-sz avgqu-sz   await  svctm  %util
sdb        0.00      46.00    18.00   470.00   576.00    5984.00    13.44       0.25         0.51   0.45    21.90
sda        0.00      0.00     0.00    0.00      0.00       0.00         0.00        0.00         0.00   0.00    0.00


서버 1과 서버 2는 각각 다른 곳의 데이터를 받는 곳입니다. 서로에게 독립적인 서버죠. 반면 데이터가 들어가는 양은 서버 2가 더 많아야 정상입니다. 하지만 uptime과 top으로 본 load average는 서버 1이 더 높았습니다. 왜일까요?

iostat을 보았더니 wsec/s와 rsec/s가 확연치 차이가 나고 서버2로 더 많은 데이터가 들어가는데도 불구하고 서버 1이 더 높은 쓰기작업이 되고 있음을 알 수 있었습니다. 물론 이것만 가지고는 원인 파악이 되진 않지만 쓰기가 높다. 라는 유추가 가능하기 때문에 다른 작업을 할 수 있었죠 ㅎ 그래서 mysql-bin 로그를 열어서 1분동안 일어난 update/delete/insert에 대한 것을 분석을 해보니 회원 로그아웃 쿼리가 서버 2가 500건, 서버 1이 6000건이 일어났습니다. 해당 세션서버의 문제로 다른팀에 요청을 해서 처리중입니다..ㅎ 원인파악이 되지 않았다면 요청하기도 어려웠을텐데요..ㅎ

 

iostat을 이용해서 부하 증가 원인분석 후 제대로 부하가 줄어든 것까지 볼 수 있었습니다 ㅎ