Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

6.3. Инструменты

Существует множество инструментов диагностики производительности в подсистемах ввода-вывода. Так, vmstat возвращает общую информацию о производительности. Следующие столбцы имеют отношение к вводу-выводу: si (в пространство подкачки), so (из пространства подкачки), bi (в блочное устройство), bo (из блочного устройства), wa (время ожидания). si и so служат индикаторами нагрузки на память, особенно если пространство подкачки расположено на том же устройстве что и раздел данных. si и bi содержат информацию об операциях чтения, а so и bo об операциях записи. В качестве единиц измерения используются килобайты. wa возвращает время простоя и сообщает, какая часть очереди ожидает завершения операции ввода-вывода.
Анализ статистики vmstat поможет подтвердить или опровергнуть факт потери производительности на уровне подсистемы ввода-вывода. Так, если значения cache и bo увеличиваются, после чего cache уменьшается, а free увеличивается, это означает, что система осуществляет запись и освобождает кэш страниц.
Вывод vmstat объединяет статистику всех устройств. Определив слабое место, можно провести более тщательный анализ с помощью iostat, который покажет статистику по устройствам, включая средний размер запросов, число операций ввода и вывода в секунду и т.п.
Знание среднего размера запросов и очередей (avgqu-sz) поможет оценить производительность. Так, если средний размер очереди равен 1, а размер запросов — 4 КБ, производительность не может быть высокой.
Более детальный анализ можно провести с помощью blktrace. Вывод blktrace может быть обработан другими утилитами, такими как blkparse.
blkparse представляет вывод blktrace в удобном для чтения формате.
Пример вывода blktrace:
8,64   3        1     0.000000000  4162  Q  RM 73992 + 8 [fs_mark]
8,64   3        0     0.000012707     0  m   N cfq4162S / alloced
8,64   3        2     0.000013433  4162  G  RM 73992 + 8 [fs_mark]
8,64   3        3     0.000015813  4162  P   N [fs_mark]
8,64   3        4     0.000017347  4162  I   R 73992 + 8 [fs_mark]
8,64   3        0     0.000018632     0  m   N cfq4162S / insert_request
8,64   3        0     0.000019655     0  m   N cfq4162S / add_to_rr
8,64   3        0     0.000021945     0  m   N cfq4162S / idle=0
8,64   3        5     0.000023460  4162  U   N [fs_mark] 1
8,64   3        0     0.000025761     0  m   N cfq workload slice:300
8,64   3        0     0.000027137     0  m   N cfq4162S / set_active wl_prio:0 wl_type:2
8,64   3        0     0.000028588     0  m   N cfq4162S / fifo=(null)
8,64   3        0     0.000029468     0  m   N cfq4162S / dispatch_insert
8,64   3        0     0.000031359     0  m   N cfq4162S / dispatched a request
8,64   3        0     0.000032306     0  m   N cfq4162S / activate rq, drv=1
8,64   3        6     0.000032735  4162  D   R 73992 + 8 [fs_mark]
8,64   1        1     0.004276637     0  C   R 73992 + 8 [0]
Как видно из примера, такой вывод не очень удобно читать. Фрагмент вывода blkparse будет выглядеть так:
Total (sde):
Reads Queued:          19,       76KiB  Writes Queued:     142,183,  568,732KiB
Read Dispatches:       19,       76KiB  Write Dispatches:   25,440,  568,732KiB
Reads Requeued:         0               Writes Requeued:       125
Reads Completed:       19,       76KiB  Writes Completed:   25,315,  568,732KiB
Read Merges:            0,        0KiB  Write Merges:      116,868,  467,472KiB
IO unplugs:        20,087               Timer unplugs:           0
Существует несколько утилит для интерпретации слишком подробного вывода blkparse.
Так, btt получает информацию о том, сколько времени было затрачено на выполнение операций в стеке ввода-вывода.
  • Q — запросы к блочному устройству поставлены в очередь;
  • G — запрос получен;
    Полученный запрос не может быть объединен с существующим и будет обслуживаться отдельно.
  • M — запрос объединен с существующим.
  • I — запрос добавлен в очередь к устройству;
  • D — запрос передан устройству;
  • C — запрос обработан;
  • P — очередь к блочному устройству закрыта с целью объединения запросов;
  • U — очередь к блочному устройству открыта, передача составных запросов устройству разрешена.
btt разбивает информацию по времени:
  • Q2Q — интервал передачи запросов блочной подсистеме;
  • Q2G — время от добавления операции в очередь блочного ввода-вывода до выдачи запроса обслуживания;
  • G2I — время от выдачи запроса до его добавления в очередь устройства;
  • Q2M — время с момента добавления операции в очередь блочного ввода-вывода до его слияния с существующим запросом;
  • I2D — время нахождения запроса в очереди устройства (с момента поступления запроса в очередь до его передачи устройству);
  • M2D — время с момента слияния запросов до их передачи устройству;
  • D2C — время обслуживания запроса устройством;
  • Q2C — общее время нахождения запроса в блочной подсистеме.
На основе данных из приведенной выше таблицы можно сделать много выводов. Например, если Q2Q значительно превышает Q2C, это значит, что приложение генерирует запросы ввода-вывода слишком медленно. Слишком высокое значение D2C означает, что устройство слишком долго обрабатывает запросы в силу слишком большой или неоптимальной нагрузки. Высокое значение Q2G сообщает о том, что в очередь одновременно поступает большое число запросов, и возможно, подсистема хранения не справляется с нагрузкой.
Еще одна утилита — seekwatcher — использует двоичные данные blktrace для построения диаграмм обработки ввода-вывода.
Пример вывода seekwatcher

Рисунок 6.2. Пример вывода seekwatcher

Горизонтальная ось содержит время. Кривые чтения и записи представлены разными цветами. Обратите внимание на зависимость производительности от скорости поиска данных — производительность накопителей, интенсивно выполняющих операции seek, снижается.