Я пытался найти прямой ответ на этот вопрос, и он оказался неуловимым. Этот вопрос и его ответ близки, но на самом деле не дают мне того, что мне хотелось бы. Давайте начнем с того, что, я думаю, я знаю.
Если у вас есть стандартное блочное устройство и вы запускаете, sudo blockdev --report
вы получите что-то вроде этого:
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 500107862016 /dev/sda
rw 256 512 4096 2048 399999238144 /dev/sda1
rw 256 512 1024 781252606 1024 /dev/sda2
Теперь вы решаете изменить это значение по умолчанию с 256 на 128, используя --setra
любой из разделов, и это происходит со всем блочным устройством, например так:
sudo blockdev --setra 128 /dev/sda1
sudo blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 128 512 4096 0 500107862016 /dev/sda
rw 128 512 4096 2048 399999238144 /dev/sda1
rw 128 512 1024 781252606 1024 /dev/sda2
Это имеет смысл для меня - устройство уровня блока находится там, где находится настройка, а не раздел, поэтому все меняется. Кроме того, отношение по умолчанию между настройкой RA и устройством имеет смысл для меня, как правило:
RA * sector size (default = 512 bytes)
Следовательно, изменения, которые я сделал выше, с размером сектора по умолчанию уменьшат чтение с 128 К до 64 КБ. Пока все хорошо.
Однако что происходит, когда мы добавляем программный RAID или LVM и устройство отображения? Представьте, что ваш отчет выглядит так:
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 10737418240 /dev/xvda1
rw 256 512 4096 0 901875499008 /dev/xvdb
rw 256 512 4096 0 108447924224 /dev/xvdj
rw 256 512 4096 0 108447924224 /dev/xvdi
rw 256 512 4096 0 108447924224 /dev/xvdh
rw 256 512 4096 0 108447924224 /dev/xvdg
rw 4096 512 4096 0 433787502592 /dev/md0
rw 4096 512 512 0 429496729600 /dev/dm-0
В этом случае у нас есть устройство LVM с отображением устройства dm-0 поверх md0, созданного mdadm, который фактически является полосой RAID0 на четырех устройствах xvdg-j.
И md0, и dm-0 имеют настройки 4096 для RA, что намного выше, чем для блочных устройств. Итак, несколько вопросов здесь:
- Как настройка RA передается по цепочке виртуальных блочных устройств?
- Имеет ли dm-0 преимущество, потому что это блок-устройство верхнего уровня, к которому вы фактически обращаетесь?
- Повлияет ли
lvchange -r
это на устройство dm-0 и не появится здесь?
Если это так же просто, как передается настройка RA с виртуального блочного устройства, которое вы используете, означает ли это, что чтение из dm-0 (или md0) преобразуется в 4 x 4096 считываний RA? (по одному на каждое блочное устройство). Если это так, это будет означать, что эти параметры увеличивают размер области чтения в приведенном выше сценарии.
Тогда с точки зрения выяснения того, что фактически делает установка readahead:
Что вы используете, эквивалентно размеру сектора, указанному выше, чтобы определить фактическое значение readahead для виртуального устройства:
- Размер полосы RAID (для md0)?
- Какой-то другой размер сектора эквивалентен?
- Это настраивается и как?
- Играет ли роль FS (меня в первую очередь интересуют ext4 и XFS)?
- Или, если он просто передается, это просто установка RA из устройства верхнего уровня, умноженная на размер сектора реальных блочных устройств?
Наконец, будут ли какие-либо предпочтительные отношения между размером полосы и настройкой RA (например)? Здесь я думаю, что если полоса является наименьшим элементом, который будет извлечен из устройства RAID, в идеале вы не хотели бы, чтобы имелось 2 обращения к диску для обслуживания этой минимальной единицы данных, и хотели бы создать RA достаточно большой, чтобы выполнить запрос с единым доступом.