Вопрос: Настройка последовательного чтения диска для повышения производительности


Я читаю большой файл последовательно с диска и пытаюсь понять вывод iostat во время чтения.

  • Размер файла: 10 ГБ
  • Буфер чтения: 4 КБ
  • Читать дальше (/ sys / block / sda / queue / read_ahead_kb): 128 КБ

Выход iostat выглядит следующим образом

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz await r_await w_await  svctm  %util
sda               0.00     0.00  833.00   14.00   103.88     0.05   251.30     6.07    5.69    2.33 205.71  1.18 100.00

Вычисление среднего размера запроса ввода-вывода = (rMB / s, деленное на r / s) дает ~ 128 КБ, что является значением для чтения вперед. Это, по-видимому, указывает на то, что, хотя системный вызов чтения задал буфер 4 КБ, фактический ввод / вывод диска происходит в соответствии со значением чтения вперед.

Когда я увеличил значение чтения до 256 Кбайт, выход iostat был следующим:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00    28.00  412.00   12.00   102.50     0.05   495.32    10.78   12.15    4.76  265.83   2.36 100.00

Снова средний размер запроса ввода-вывода составлял 256 КБ, что соответствовало чтению вперед.

Это продолжалось до тех пор, пока я не установил 512 Кбайт в качестве значения для чтения вперед и не задерживался, когда я перешел на начальное значение 1024 КБ - средний размер запроса ввода-вывода по-прежнему составлял 512 КБ. Увеличение max_sectors_kb (максимальное количество данных на запрос ввода-вывода) по умолчанию от 512 КБ до 1024 КБ также здесь не помогло.

Почему это происходит - в идеале я хотел бы как можно больше свести к минимуму мои IOPS и прочитать больше данных на запрос ввода-вывода (более 512 Кбайт на запрос). Кроме того, во всех случаях я использую 100% дисковое использование - я бы хотел задушить себя, чтобы читать с 50-60% дискового использования с хорошей последовательной пропускной способностью. Короче говоря, каковы оптимизированные параметры приложения / ядра для последовательного чтения ввода-вывода.


5
2017-10-19 02:11


Источник


Можете ли вы предоставить любую полезную информацию о используемой ОС, версии и дистрибутиве, настройке контроллера диска и хранилища и что-нибудь еще, что поможет нам предоставить разумные предложения? - ewwhite


Ответы:


Вы говорите, что хотите минимизировать чтение IOPS и максимизировать размер каждого запроса ввода-вывода. Я подозреваю, что вы не выиграете от этого. Обычно я хотел бы максимизировать пропускную способность и свести к минимуму задержку и найти хороший баланс этих двух для конкретного приложения.

Обратите внимание, что когда вы перешли от readahead от 128 КБ к readahead на 256 КБ, скорость чтения фактически снизилась с 103,88 МБ / с до 102.50 МБ / с. Я бы не ожидал, что эта тенденция изменится при более высоком размере readahead. Более высокий readahead также приводит к риску более потерь в IO, если данные не являются чисто последовательными, что снижает производительность полезного ввода-вывода.

Если вам интересно, ограничение на 512 кБ, вероятно, происходит из другого уровня в стеке хранилища, такого как драйвер SCSI, прошивка контроллера или шина.

Для дросселирования ввода-вывода вы можете посмотреть следующее: Как дросселировать каждый процесс ввода-вывода до максимального предела?


1
2017-10-19 05:45





Если вы читаете из файловой системы поверх тома LVM, это, по-видимому, является измененным поведением. Я также написал в списке рассылки LVM, но никто не ответил мне.

Я подозреваю, что LVM-код внутренне управляет блоками / запросами в размере 512 КБ, поэтому увеличение max_sectors_kb параметр по этому жесткому пределу не влияет.


0
2017-10-23 20:37