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 для построения диаграмм обработки ввода-вывода.
Рисунок 6.2. Пример вывода seekwatcher
Горизонтальная ось содержит время. Кривые чтения и записи представлены разными цветами. Обратите внимание на зависимость производительности от скорости поиска данных — производительность накопителей, интенсивно выполняющих операции seek, снижается.