• Disk의 read/write 통계지표 및 CPU 사용률, queue 대기열 길이 등 io에 대한 지표를 실시간으로 볼 수 있는 유용한 tool
  • iostat 지표로 부하(read/write) 주는 job의 블록 크기, 부하 크기, 레이턴시 등의 정보를 확인 가능
  • Linux kernel에서 IO 발생 시 CPU와 device의 사용률 정보를 /proc/diskstats, 또는 /sys/block/[device]/stat에 저장
  • kerenl에선 해당 diskstats 파일에 기록된 정보를 바탕으로 값들을 계산해서 iostat 지표에 출력
  • iostat 필드 중 대표적으로 많이 보는 %util 필드의 경우 아래와 같이 계산하여 출력
  • iostat는 Disk에 문제가 발생할 때 주로 보게 되는 툴이지만, Nvme나 SSD에서는 %utils가 의미 X
  • %util 지표 외에 await과 read/write throughput(xx MB/s) 지표와, nand 제품의 성능 한계치(별도의 부하 테스트나 제품 공식 성능 자료 참고)와 비교하며 모니터링에 참고
  • iostat 외에 iotop, blktrace, vmstat, perf, flo 등 다양한 툴로 다른 레벨까지 모니터링
  • %util 계산 방법

    1. io request에 대한 응답 시간을 통해 산출

    2. 응답 시간은 tot_ticks을 이용해 계산

    3. io 함수 호출 시마다 디스크가 처리한 응답 시간(tick) 만큼 더하는 방식

    4. io가 시작된 시점과 완료된 시점을 추적하여 계산

    5. a=>b, c=>d 사이의 시간을 카운터에 누적

    6. 해당 값을 계산하는 코드 → in_flight 인 경우 now - then 값이 추가되는 방식


iostat 설치 방법

$ yum install -y sysstat

iostat 명령어 옵션

  • 자주 사용하는 iostat 명령어 옵션

    # iostat -dxm 1 -p ALL | grep -iw "device\|sda4\|nvme0n1" | awk '{now=strftime("%Y-%m-%d %T "); print now $0}'참고
    $ iostat -dxm 1 -p ALL

  • 자주 사용하는 iostat 명령어 옵션에 대한 설명

    1. -d : 디스크 사용량 정보를 출력
    2. -x : 확장 정보 출력
    3. -m : 초당 throughput 출력 → MB/S으로 출력
    4. 1 : iostat 출력 간격을 초로 지정 → 1이면 1초마다 갱신
    5. -p ALL : 시스템에 모든 디바이스를 출력


iostat 출력 값에 대한 설명

1. rrqm/s

  • 큐에 대기 중인 초당 읽기 요청 수.
  • /proc/diskstats의 결과에서 2번째 줄로 출력
  • 장치에 대기 중인 초당 병합된 읽기(read) 요청 수

2. wrqm/s

  • 큐에 대기 중인 초당 쓰기 요청 수.
  • /proc/diskstats의 결과에서 6번째 줄로 출력
  • 장치에 대기 중인 초당 병합된 쓰기(write) 요청 수

3. r/s

  • 초당 읽기 섹터 수
  • /proc/diskstats의 결과에서 1번째 줄로 출력
  • 초당 장치에 발행된 읽기(read) 요청 수
  • OS의 block layer가 아니라 Process가 OS의 커널 영역으로 read/write 함수를 호출한 횟수

4. w/s

  • 초당 쓰기 섹터 수
  • proc/diskstats의 결과에서 5번째 줄로 출력
  • 초당 장치에 발행된 쓰기(write) 요청 수
  • OS의 block layer가 아니라 Process가 OS의 커널 영역으로 read/write 함수를 호출한 횟수

5. rMB/s

  • 초당 읽기 처리 크기 (r/s * 섹터 크기(블록 사이즈 크기))
  • proc/diskstats의 결과에서 3번째 줄로 출력
  • 초당 장치에서 읽은 메가바이트 수

6. wMB/s

  • 초당 쓰기 처리 크기 (w/s * 섹터 크기(블록 사이즈 크기))
  • proc/diskstats의 결과에서 7번째 줄로 출력
  • 초당 장치에 기록된 메가바이트 수

7. avgrq-sz

  • 요청 건수의 평균 크기 ( 1 = 512byte )
  • proc/diskstats의 결과에서 출력값 X
  • 장치에 발행된 요청의 평균 크기(섹터)

8. avgqu-sz

  • 해당 Device에 발생된 request들의 대기 중인 queue의 평균 length
  • proc/diskstats의 결과에서 11번째 줄로 출력
  • 장치에 발행된 요청의 평균 대기열 길이
    avgqu-sz = await / svctm * %util
  • 상세 설명 : avgqu-sz는 io스케줄러 queue + 디스크 queue의 대기열을 포함된 평균 수치
  • io 스케줄러 queue depth 경로 → sys/block/[device]/queue/nr_requests
  • 디스크 queue depth 경로 → /sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/host0/target0:2:0/0:2:0:0/queue_depth
  • avgqu-sz 수치보다 await 수치가 훨씬 높으면 디스크 쪽에서 병합이 있다고 판단

9. await

  • 레이턴시 값 (svctm + waiting in the queue)
  • proc/diskstats의 결과에서 4번째 줄로 출력
  • 처리할 장치에 발행된 I/O 요청의 평균 시간(밀리초)
  • 대기열의 요청에 소요된 시간과 해당 요청을 처리하는 데 소요된 시간이 포함
    await = svctm + however_long_in_quere
  • 상세 설명 : await는 io 완료 시간 + 스케줄러에서 대기 큐에 소비된 시간을 합친 값
  • 해당 값은 스케줄러, 드라이버, 컨트롤러, 실제 물리 디스크 단 까지 모든 대기 시간이 포함

10. svctm

  • 장치에 발행된 I/O 요청의 평균 서비스 시간(밀리초)
  • proc/diskstats의 결과에서 출력값 X
  • svctm의 조기 처리에 대한 조치로 인해 10 io 가 발생하면 10 ms 만에 1 io 는 1 ms 로 처리해 svctm에 1.00 일이 발생

11. %util

  • proc/diskstats의 결과에서 10번째 줄로 출력
  • 장치에 I/O 요청이 발행된 CPU 시간의 백분율(장치의 대역폭 사용률).
  • %util 값이 100%에 가까울 때 장치 포화가 발생
  • Disk 가 버틸 수 있는 한계치를 %로 표시해 주는 필드
  • 스핀들 디스크에선 잘 처리해서 보여 주지만, 병렬 io처리를 하는 nand제품이나 cache가 달린 Raid 구성 또는 스토리지에서는 신용할 수 없는 정보


iostat 예제 출력 결과로 내용 설명

  • iostat 명령어 출력 설명
    1. 부하 → 4k 블록 사이즈로 read 10MB, write 10MB 부하 확인(read는 r/s, write는 w/s)
    2. rMB/s 출력 → 4k x 1024(r/s) = 4MB (rMB/s)
    3. wMB/s 출력 → 4k x 1024(w/s) = 4MB (wMB/s)
    4. 부하준 블록 사이즈 크기 확인 → 8(avgrq-sz 값) x 512 (byte) = 4kb, 만약 8k 블록 사이즈로 부하를 주면 avgrq-sz는 16으로 표시
    5. %util 값 → 1025(r/s) + 1025(w/s) / (0.32(svctm) / 10)
  • iostat 명령어 출력 결과



iostat 지표는 disk속도나, 문제가 있을 때 확인 → 의미 있는 지표 확인 방법

  1. 장착된 디스크의 종류 확인 → sata, sas, ssd, nvme 등 물리적 디스크 종류 확인
  2. raid 구성 확인 →raid는 캐시가 있는, write-back인지. 직접 쓰기하는 write-through인지 확인
  3. 현재 구성된 디스크의 성능 한계치를 파악
    • hdparm 명령어로 하드 디스크 점검 및 성능 측정
    • ssd의 경우 read 300MB에 write 80MB 정도
    • benchmark를 통해 디스크 성능표도 참고 필요
  4. rMB/s, wMB/s로 현재 부하 크기를 보고, await 지표가 1 (ms) 이상 넘는지 등을 확인
  5. SATA나 SAS는 await 값을 유심히 볼 필요 → await 값은 레이턴시 지표로 보면 되고, 디스크 부하는 크지 않은데 await 값이 순간 올라가는 경우가 종종 있음(Nvme, SSD에는 의미 없음)


iostat %util, svctm 지표 오류

  • 스핀들 디스크 (SATA, SAS 등)의 경우 플래터가 돌면서 헤더가 지정된 섹터를 찾아 한번에 한 가지 job씩 처리함 → 병렬 처리가 안 되는 구조로, iostst 지표의 값이 정확한 지표라 판단 가능
  • Nand (Nvme, ssd)의 경우 die 칩셋이 채널로 구성되며, 각 채널별로 io를 분산 처리됨 → 병렬 처리가 가능(병렬 처리하여 퍼포먼스를 높이더라도 iostat 툴에서는 계산하지 못함)
  • SSD 병령 처리 구성
  • Nand 제품에선 적은 부하를 줘도 %util 에선 과도하게 높은 지표를 출력 가능
  • nvme 디스크에 (fio 테스트, 4k 블록 사이즈, radomwrite 부하) numjob을 늘려가며 테스트 결과를 확인하면, job=3부터 이미 %util 은 최대치를 도달
  • 이론상 %util이 100이 되면 디스크 포화 상태를 의미하지만 부하를 더 줄수록 write 성능 증가 → 즉, %util 필드 자체는 의미 X

참고 : https://brunch.co.kr/@lars/7

  • 현재 메모리의 상태를 출력함.
  • 프로세스 정보 , 메모리 사용량 , 스왑 , IO 상태 및 CPU 활동 상황에 대한 정보를 보여준다.

vmstat 명령어 사용 형식

# 첫번째 방법
$ vmstat [옵션]

 # 두번째 방법  -> 예시) vmstat 5 5 (5초 간격으로 1줄씩 5번 생성)
$ vmstat [시간] [반복]

vmstat 명령어 출력 필드

$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 345316  39780 259932    0    0    13     5   53  108  1  0 99  0  0

1. procs 필드

  • r : CPU 접근 대기 중인 실행 가능한 프로세스 수
  • b : I/O 자원을 할당 받지 못해 블록된 프로세스의 수

2. memory 필드

  • swpd : 사용된 가상 메모리의 용량
  • free : 사용가능한 여유 메모리의 용량
  • buff : 버퍼에 사용된 메모리의 총량
  • cache : 페이지 캐시에 사용된 메모리의 용량

3. swap 필드

  • si : swap-in된 메모리의 양(kb)
  • so : swap-out된 메모리의 양(kb), swap-out가 지속적으로 발생한다면 메모리 부족을 의심

4. I/O 필드

  • bi : 블록 디바이스로부터 입력 블록수
  • bo : 블록 디바이스에 쓰기 블록수

5. system 필드

  • in : 초당 발생한 interrupts의 수
  • cs : 초당 발생한 context switchs(문맥교환)의 수

6. CPU 필드

  • us : CPU가 사용자 수준 코드를 실행한 시간 (단위: %)
  • sy : CPU가 시스템 수준 코드를 실행한 시간 (단위: %)
  • id : idle 시간
  • wa : I/O wait 시간

vmstat 명령어 옵션

1. vmstat -a 명령어 → buffer와 cache 대신 active 와 inactive 메모리 사용량에 대한 결과를 출력

  • inactive : 사용되지 않은 메모리의 양
  • active : 사용중인 메모리의 양
    $ vmstat -a
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
    r  b   swpd   free  inact     active   si   so    bi    bo   in   cs us sy id wa st
    0  0      0 333036 209580 310260    0    0    12     5   52  105  1  0 99  0  0

2.vmstat -d 명령어 → 디스크의 사용량을 출력

  • Reads (읽기)
    1. total : 성공한 모든 읽기 작업 개수
    2. merged : 하나의 I/O로 묶은 읽기 작업 수
    3. sectors : 성공적으로 읽은 섹터 수
    4. ms : 읽기 작업을 하는데 소요된 시간(밀리초)
  • Wrties (쓰기)
    1. total : 성공한 모든 쓰기 작업 개수
    2. merged : 하나의 I/O로 묽은 쓰기 작업 수
    3. sectors : 성공적으로 쓴 섹터 수
    4. ms : 쓰기 작업을 하는데 소요된 시간(밀리초)
  • I/O (입출력)
    1. cur : 현재 수행 중인 I/O 수
    2. sec : I/O를 수행하는데 소요된 시간(초)
      $ 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
      - 생략 -
      loop7      0      0       0       0      0      0       0       0      0      0
      sr0        0      0       0       0      0      0       0       0      0      0
      sda    10864   5487  541394   55154   6140  14695  166258   47768      0     29
      sdb      874    941    4334     785     24     17     200      47      0      0
      sdc     1889    891   12894    1390    146   7908   64308     847      0      1

vmstat 명령어를 crontab에 활용

  • 시스템의 프로세스 정보 , 메모리 사용량 , IO 상태 , CPU사용률 등의 정보를 vmstat 명령어를 사용하여 매일 23시 30분에 1초단위로 10회씩 check.log 파일에 누적 저장
    # 아래와 같이 등록한 후 출력된 결과 확인
    $ crontab -l
    30 23 * * * vmstat 1 10 >> /var/log/check.log

  • yum을 하였을 때 databases가 lock이 발생하여 yum으로 패키지 설치 불가
  • yum으로 설치가 불가능하면, 패키지 관리 및 서비스 운영에 문제 발생

yum database is locked 문제 발생

$ yum install -y sysstat
...생략...
Total size: 315 k
Installed size: 1.1 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Traceback (most recent call last):
  File "/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 375, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 281, in main
    return_code = base.doTransaction()
  File "/usr/share/yum-cli/cli.py", line 817, in doTransaction
    resultobject = self.runTransaction(cb=cb)
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1834, in runTransaction
    lastdbv = self.history.last()
  File "/usr/lib/python2.7/site-packages/yum/history.py", line 1271, in last
    ret = self.old([], 1, complete_transactions_only)
  File "/usr/lib/python2.7/site-packages/yum/history.py", line 1220, in old
    executeSQL(cur, sql, params)
  File "/usr/lib/python2.7/site-packages/yum/sqlutils.py", line 166, in executeSQLQmark
    return cursor.execute(query)
sqlite3.OperationalError: database is locked

yum database is locked 해결 명령어

  • /var/lib/yum/history 디렉토리 내용 확인

    $ ls /var/lib/yum/history/  
    2021-11-15/ history-2021-11-15.sqlite history-2021-11-15.sqlite-journal
  • /var/lib/yum/history 디렉토리 삭제

    $ rm -rf /var/lib/yum/history

해결 결과 → yum으로 설치 가능

  • yum으로 패키지 설치 가능

    $ yum install -y sysstat
    Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
    
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    
    Loading mirror speeds from cached hostfile
    * base: mirror.kakao.com
    * epel: ftp.riken.jp
    * extras: mirror.kakao.com
    * updates: mirror.kakao.com
    Resolving Dependencies
    --> Running transaction check
    ---> Package sysstat.x86_64 0:10.1.5-19.el7 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ============================================================================
    Package                    Arch                              Version                               Repository                            Size
    ============================================================================
    Installing:
    sysstat                    x86_64                           10.1.5-19.el7                      base                                     315 k
    
    Transaction Summary
    ============================================================================
    Install  1 Package
    
    Total size: 315 k
    Installed size: 1.1 M
    Downloading packages:
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
    Installing : sysstat-10.1.5-19.el7.x86_64                                                                                          1/1
    Verifying  : sysstat-10.1.5-19.el7.x86_64                                                                                          1/1
    
    Installed:
    sysstat.x86_64 0:10.1.5-19.el7
    
    Complete!

참고 URL : https://stackoverflow.com/questions/48037629/yum-database-is-locked

  • 패키지에 따라 의존성 문제로 되돌릴 수 없는 경우가 발생 → 주의 필요
  • 설정파일들은 패키지 설치/삭제 시 되돌리지 못할 수 있으므로 백업 필요

 

지금까지 설치한 yum 내용 확인

  • yum 명령을 사용해서 패키지를 설치하거나 업데이트를 하면 ID가 하나씩 증가
  • 각 항목의 세부사항을 알고 싶은면 info 옵션을 사용
    $ yum history
    Loaded plugins: fastestmirror
    ID     | Login user               | Date and time    | Action(s)      | Altered
    -------------------------------------------------------------------------------
      47 | root              | 2012-08-25 16:09 | Install        |    1
      46 | root              | 2012-08-20 17:00 | Install        |    1
      45 | root              | 2012-08-20 09:07 | Install        |    1
      44 | root              | 2012-08-20 09:06 | Install        |    3
      43 | root              | 2012-08-20 09:05 | Install        |    8
      42 | root              | 2012-08-05 15:51 | Install        |    1
      41 | root              | 2012-08-05 15:47 | Install        |    1
      40 | root              | 2012-08-05 15:41 | Install        |    2
      39 | root              | 2012-08-05 15:24 | Install        |    1
      38 | root              | 2012-08-05 15:18 | Install        |    1
      37 | root              | 2012-08-05 15:14 | Install        |    3
      36 | root              | 2012-08-05 14:53 | I, U            |  195 EE
      35 | root              | 2012-08-05 14:52 | Install        |    3
      34 | root              | 2012-01-19 11:20 | I, U            |   42 EE
      33 | root              | 2012-03-07 15:22 | Install        |    8
      32 | root              | 2011-12-26 14:04 | Install        |    1
      31 | root              | 2011-12-26 13:11 | Install        |   18
      30 | root              | 2011-12-26 11:31 | Install        |    1
      29 | root              | 2011-12-26 11:18 | Install        |   12 EE
      28 | root              | 2011-12-21 17:59 | Install        |    1

 

yum 명령을 사용해서 설치한 history의 세부 내용 출력

$ yum history info 47
Loaded plugins: fastestmirror
Transaction ID : 47
Begin time     : Sat Aug 25 16:09:43 2012
Begin rpmdb    : 586:e318ebe25b7f3c641234d8aec7f55b25e005ba00
End time       :                           (0 seconds)
End rpmdb      : 587:870ce250959935e6a5968fbb5928c1378daedda7
User           : root
Return-Code    : Success
Command Line   : install dosfstools
Transaction performed with:
    Installed     rpm-4.8.0-27.el6.x86_64                       @base
    Installed     yum-3.2.29-30.el6.centos.noarch               @base
    Installed     yum-plugin-fastestmirror-1.1.30-14.el6.noarch @base
Packages Altered:
    Install dosfstools-3.0.9-4.el6.x86_64 @base
history info

 

yum 명령어 실수로 rollback이 필요한 경우

  • ID 47에서 46으로 되돌림
    $ yum history rollback 46
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    * base: centos.tt.co.kr
    * extras: centos.tt.co.kr
    * updates: centoso4.centos.org
    base                                                     | 3.7 kB     00:00
    extras                                                   | 3.5 kB     00:00
    nodejs-stable                                            | 2.9 kB     00:00
    updates                                                  | 3.5 kB     00:00
    updates/primary_db                                       | 4.0 MB     00:08
    Rollback to transaction 46, from Mon Aug 20 17:00:17 2012
     Undoing the following transactions: 47
       Install dosfstools-3.0.9-4.el6.x86_64 @base
    Resolving Dependencies
    --> Running transaction check
    ---> Package dosfstools.x86_64 0:3.0.9-4.el6 will be erased
    --> Finished Dependency Resolution
    Dependencies Resolved
    =======================================================================
    Package             Arch            Version               Repository      Size
    =======================================================================
    Removing:
    dosfstools          x86_64          3.0.9-4.el6           @base          197 k
    Transaction Summary
    =======================================================================
    Remove        1 Package(s)
    Installed size: 197 k
    Is this ok [y/N]: y
    Downloading Packages:
    Running rpm_check_debug
    Running Transaction Test
    Transaction Test Succeeded
    Running Transaction
     Erasing    : dosfstools-3.0.9-4.el6.x86_64                                1/1
     Verifying  : dosfstools-3.0.9-4.el6.x86_64                                1/1
    Removed:
     dosfstools.x86_64 0:3.0.9-4.el6
    Complete!

+ Recent posts