Как рассчитать процент загрузки дискового ввода-вывода?

Как рассчитать процент загрузки дискового ввода-вывода?

Ниже приведен вывод 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:

diskIOLAxозначает среднюю загрузку диска за x минут (%).

Остальные значения в таблице:

  • diskIONRead — количество байтов, считанных с этого устройства с момента загрузки.
  • diskIONWritten — количество байтов, записанных на это устройство с момента загрузки.
  • diskIOReads — количество операций чтения с этого устройства с момента загрузки.
  • diskIOWrites — количество попыток записи на это устройство с момента загрузки.

Итак, как же можно рассчитать эту нагрузку вручную, если она не собирается на сервере?

В конце концов, мы хотим показать пользователям графики, где они могут узнать, является ли дисковый ввод-вывод тяжелым или нет. Мы можем отобразить это с помощью Read/write bytes/sec или Read/write requests/sec.

Если мы отобразим только запросы на чтение/запись/сек, мы можем знать, что происходит интенсивный ввод-вывод. Но мы не узнаем, влияет ли это на скорость чтения/записи диска.

И отображение скорости чтения/записи само по себе не может сказать нам, почему скорость влияет — из-за слишком большого количества операций ввода/вывода или недостаточного объема буферной памяти для асинхронной записи. Следовательно, нам нужно отображать и то, и другое.

Но что означает другое значение disk IOLoad и как мы можем его рассчитать и почему оно не собирается в snmp. Вызывает ли это огромную нагрузку, если включить это? Если это вызывает большую нагрузку, собирая это значение, то мы можем рассчитать его вручную. Но какова формула?

решение1

Указанной вами информации недостаточно для расчета использования диска %. Использование диска % рассчитывается как disk_time_spent_in_io / elapsed_time.
Например, если ваш диск тратит 0,25 секунды на выполнение ввода-вывода за 1 секунду, то ваш диск используется на 25%.

Количество операций не имеет значения, когда речь идет об использовании %. В зависимости от вашего диска и типа выполняемого вами ввода-вывода (массовый или случайный), он может быть использован на 100% при 10 IOPS или 10000 IOPS. Единственный способ узнать это — посмотреть, сколько времени требуется диску для выполнения этих IOPS.

решение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

Команда для получения загрузки ввода-вывода в процентах за одну секунду:

$ 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
[3]https://github.com/sysstat/sysstat/blob/v11.4.3/iostat.c

Связанный контент