일단 가장 쉽게 아는 방법으로는, sysstat이라는 패키지가 있다. 이 패키지상에서 제공되는 iostat이라는 유틸리티는 실행만으로도 편하게 정보를 제공한다.
iostat, /proc/stat, /proc/diskstats 닫기.
iostat를 실행한 모습이다.
elenoa# iostat Linux 2.4.21-27.0.1.EL (elenoa) 07/24/07
avg-cpu: %user %nice %sys %iowait %idle 0.02 0.00 0.01 0.06 99.90
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn hda 0.16 0.21 2.79 519408 6917264 hda1 0.00 0.00 0.00 282 1736 hda2 0.03 0.09 0.58 222794 1446696 hda3 0.07 0.04 1.30 101626 3232920 hda5 0.06 0.08 0.90 193730 2235912 hdb 0.05 0.15 0.97 369706 2400632 hdb1 0.05 0.15 0.97 369258 2400632 hdb2 0.00 0.00 0.00 88 0
elenoa#
이 정보는 proc상에서도 찾아 볼 수 있다. Kernel 2.4에서는 /proc/stat 에 포함되어 있는데,
elenoa# cat /proc/stat cpu 59656 4944 29196 247789145 140314 4829 2866 cpu0 59656 4944 29196 247789145 140314 4829 2866 page 444894 4659556 swap 1 0 intr 253782613 248030950 141 0 2 2 0 5 4 1 0 5240579 0 0 0 510929 0 disk_io: (3,0):(392465,43676,519424,348789,6918456) (3,1):(127203,26781,369706,100422,2400632) ctxt 36343354 btime 1182761042 processes 81236 procs_running 2 procs_blocked 0 elenoa#
이와 같은 내용이며 가운데 disk_io 라고 되어 있는 라인이 말 그대로 Disk의 I/O정보를 담고 있는 부분이다. (3,0)은 위에서 hda, (3,1)은 hdb를 가리킨다. 참고 사이트 : Disk Stats (FreeBSD, Linux Kernel 2.2, 2.4에 대한 Disk IO 정보 조회 방법을 기록해놓았다.) 그에 따르는 다섯개의 숫자가 의미하는 것은 순서대로, (영문 사이트를 일부 해석하고, 이해가 안되는 것은 다른 사이트를 검색하여 참고했다.)
총 IO 횟수,
읽기 횟수,
읽은 블록들의 숫자,
쓰기 횟수,
쓴 블록들의 숫자
가 된다. (이 숫자들은 unsigned long, 그러니까 4byte integer로 되어 있고, 부팅시부터 계속 누적되서 적용되기 때문에 자료형의 크기를 넘게 되면 자동적으로 Overflow 된다. 이것들을 사용한 프로그래밍에서는 이 점을 유의해야 한다.) 블록의 크기는 대개 512b지만, 프로그래밍 상에서 자세하게 알고 싶다면 statfs system call 을 사용한다. Kernel 2.6에서는 /proc/stats 상에서 disk_io 항목에 사라지고 없다. 이 정보는 /proc/diskstats 파일로 분리되어 있다.
elenoa-k26# cat /proc/diskstats 1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 3 0 hda 0 0 0 0 0 0 0 0 0 0 0 8 0 sda 83785 8619 1623106 258898 138912 1753650 15140608 6415184 0 411182 6674077 8 1 sda1 21689 342602 1715205 13721640 8 2 sda2 61962 1080451 93310 746424 8 3 sda3 1092 1329 0 0 8 4 sda4 1 2 0 0 8 5 sda5 7546 197802 84066 672528 2 0 fd0 0 0 0 0 0 0 0 0 0 0 0 9 0 md0 0 0 0 0 0 0 0 0 0 0 0 elenoa-k26#
위와 같다. 더 라인수도 많아지고 항목도 충실해졌다(응?) . 참고 사이트 : http://search.cpan.org/src/BLOONIX/Sys-Statistics-Linux-0.13/lib/Sys/Statistics/Linux/DiskStats.pm (/proc/diskstats 로 Disk I/O 정보를 생성하는 스크립트로 추측된다. 써먹을 수 있을까? 중간쯤에 각 필드들의 설명이 주석으로 첨부되어 있다. 원본은 /usr/src/linux/Documentation/iostat.txt 에 존재하는 것 같다. 하지만 찾을 수 없다;) 각각의 의미는 순서대로, 아래와 같다. (영문 해석이라 틀릴 수 있다.)
읽기가 성공한 횟수.
읽기가 효율적인 동작을 위해 다른 읽기 동작과 병합된 횟수.
읽어들인 섹터의 갯수.
읽기에 소요된 총 시간. (millisecond)
쓰기가 성공한 횟수.
쓰기가 효율적인 동작을 위해 다른 쓰기 동작과 병합된 횟수.
쓴 섹터의 갯수.
쓰기에 소요된 총 시간. (millisecond)
현재 진행중인 I/O의 갯수.
I/O에 소요된 총 시간.
... 가중치를 둬서 계산된 I/O에 소요된 총 시간.. 인것 같다. I/O가 완료되는 시간과, I/O를 대기하고 있는 대기열을 판단하는데 좋은 척도가 된다고 하는 것 같다. (다른 좋은 해석이 있으면.. 헬프미 ~_~;) 일단 블록이 아니고 섹터인것도 약간 이상하긴 하다.
iostat, /proc/stat, /proc/diskstats 닫기. 뭐, 어쨌든 생각해봤던 것은 이미 다 있다.