디스크 IO 로드 비율을 계산하는 방법은 무엇입니까?

디스크 IO 로드 비율을 계산하는 방법은 무엇입니까?

다음은 net-snmp 출력이며, 보시다시피 diskIOLA를 사용할 수 없습니다.

SNMP table: UCD-DISKIO-MIB::diskIOTable

diskIOIndex diskIODevice diskIONRead diskIONWritten diskIOReads diskIOWrites diskIOLA1 diskIOLA5 diskIOLA15 diskIONReadX diskIONWrittenX

      25          sda   845276160     2882477056      576632     42597061         ?         ?          ?   5140243456    883350772736

여기의 정의에 따르면http://www.net-snmp.org/docs/mibs/ucdDiskIOMIB.html:

디스크IOLAxx분 평균 디스크 로드(%)를 의미합니다.

테이블의 다른 값은 다음과 같습니다.

  • diskIONRead - 부팅 이후 이 장치에서 읽은 바이트 수입니다.
  • diskIONWritten - 부팅 이후 이 장치에 쓴 바이트 수입니다.
  • diskIOReads - 부팅 이후 이 장치에서 읽기 액세스 횟수입니다.
  • diskIOWrites - 부팅 이후 이 장치에 대한 쓰기 액세스 횟수입니다.

그렇다면 이 로드는 서버에 수집되지 않는데 어떻게 수동으로 계산할 수 있습니까?

결국 우리는 디스크 IO가 무거운지 여부를 알 수 있는 그래프를 사용자에게 보여주고 싶습니다. 읽기/쓰기 바이트/초 또는 읽기/쓰기 요청/초를 사용하여 이를 표시할 수 있습니다.

읽기/쓰기 요청/초만 표시하면 과도한 I/O가 진행되고 있음을 알 수 있습니다. 그러나 디스크 R/W 속도가 이로 인해 영향을 받는지는 알 수 없습니다.

그리고 R/W 속도를 표시하는 것만으로는 속도가 영향을 받는 이유를 알 수 없습니다. I/O 작업이 너무 많기 때문인지 비동기 쓰기를 위한 버퍼 메모리가 부족하기 때문인지도 알 수 없습니다. 따라서 두 가지를 모두 표시해야 합니다.

하지만 디스크 IOLoad의 다른 값은 무엇을 의미하며 어떻게 계산할 수 있으며 snmp에 수집되지 않는 이유는 무엇입니까? 이것을 활성화하면 엄청난 부하가 발생합니까? 이 값을 수집하는 데 과도한 부하가 발생하는 경우 수동으로 계산할 수 있습니다. 그런데 공식이 뭔가요?

답변1

귀하가 가지고 있는 정보는 디스크 사용률(%)을 계산하는 데 충분하지 않습니다. 디스크 사용률(%)은 다음과 같이 계산됩니다 disk_time_spent_in_io / elapsed_time.
예를 들어, 디스크가 1초 동안 IO를 수행하는 데 0.25초를 소비한다면 디스크 활용률은 25%입니다.

가동률을 보면 작업횟수는 의미가 없습니다. 디스크 및 수행 중인 IO 유형(대량 및 무작위)에 따라 10 IOPS 또는 10000 IOPS에서 100% 활용될 수 있습니다. 알 수 있는 유일한 방법은 디스크가 해당 IOP를 수행하는 데 걸리는 시간입니다.

답변2

솔루션을 검색하는 모든 사람을 위해 iostat는 /sys/block/sda/stat. 공식은 대략 다음과 같습니다.

{now,past}_tot_ticks = total time this block device has been active (/sys/block/sda/stat)
{now,past}_uptime = uptime in /proc/uptime (first value)

percentage = (now_tot_ticks - past_tot_ticks) / (now_uptime - past_uptime) / 10

1초 동안 IO 로드를 백분율로 가져오는 명령은 다음과 같습니다.

$ cat \
    <(cat /sys/block/sda/stat && cat /proc/uptime)            \
    <(sleep 1 && cat /sys/block/sda/stat && cat /proc/uptime) \
    | awk -v RS="" '{printf "%.2f%\n", ($27-$10)/($33-$16) / 10}';

추가 자료:
[1]https://www.kernel.org/doc/Documentation/block/stat.txt
[2]https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-uptime
[삼]https://github.com/sysstat/sysstat/blob/v11.4.3/iostat.c

관련 정보