Я пытался найти прямой ответ на этот вопрос, и он оказался неуловимым. Этот вопрос и его ответ близки, но на самом деле не дают мне того, что мне хотелось бы. Давайте начнем с того, что, я думаю, я знаю.
Если у вас есть стандартное блочное устройство и вы запускаете, 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 достаточно большой, чтобы выполнить запрос с единым доступом.
источник
Ответы:
Это зависит. Давайте предположим, что вы находитесь внутри Xen domU и имеете RA = 256. Ваш / dev / xvda1 - это фактический LV на dom0, видимый в / dev / dm1. Таким образом, у вас RA (domU (/ dev / xvda1)) = 256 и RA (dom0 (/ dev / dm1)) = 512. Это будет иметь такой эффект, что ядро dom0 будет обращаться к / dev / dm1 с другим RA, чем ядро domU. Просто как тот.
Другая сидячая ситуация произойдет, если мы примем / dev / md0 (/ dev / sda1, / dev / sda2).
Настройка / dev / md0 RA не повлияет на / dev / sdX blockdevices.
Так что, по моему мнению, ядро получает доступ к blockdevice способом, который фактически установлен. Один логический том может быть доступен через RAID (который он является частью) или устройство устройства отображения, и каждый с другим RA, который будет соблюдаться.
Таким образом, ответ таков: настройка RA ИМХО не передается по цепочке блочных устройств, но независимо от настройки RA устройства верхнего уровня, она будет использоваться для доступа к составляющим устройствам.
Если вы имеете в виду глубокое распространение «козырь всех» - согласно моему предыдущему комментарию, я думаю, что у вас могут быть разные RA для разных устройств в системе.
Да, но это частный случай. Давайте предположим, что у нас есть / dev / dm0, который является / dev / vg0 / blockdevice LVM. Если вы делаете:
/ dev / dm0 также изменится, потому что / dev / dm0 и / dev / vg0 / blockdevice - это одно и то же блочное устройство, когда дело доходит до доступа к ядру.
Но давайте предположим, что / dev / vg0 / blockdevice - это то же самое, что и / dev / dm0 и / dev / xvda1 в Xen domU, который его использует. Установка RA для / dev / xvda1 вступит в силу, но dom0 увидит, что все еще имеет свой собственный RA.
Обычно я обнаруживаю RA, экспериментируя с разными значениями и тестируя его с помощью hdparm.
То же, что и выше.
Конечно - это очень большая тема. Я рекомендую Вам начать здесь http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
источник
Знайте ответ труднее объяснить, поэтому я сделаю это на примере. Скажем, ради этого у вас есть 3 блочных устройства, и вы устанавливаете свой RA, чтобы сказать 4 (4 * 512 байт), принимая стандартный сектор. Если вы скажете использовать схему RAID-5 с использованием 3 дисков, любое чтение, которое даже коснулось полосы на уникальном диске, привело бы к увеличению RA по фактору, который вы изначально установили для блочного устройства RA. Таким образом, если ваше чтение охватывает ровно все 3 диска, тогда ваш эффективный RA будет 12 * 512 байт. Это может быть осложнено установкой RA на разных уровнях, например, MD или LVM. Как правило, если мое приложение использует RA, я устанавливаю его на максимально возможном слое, чтобы не создавать ненужные RA. Затем я запускаю файловую систему в секторе 2049 и смещаю начало каждого сектора на число, кратное 8. Я могу быть далека от того, что вы просите, но это мои 2 ¢.
источник
Это для объяснения. Я провел несколько тестов с настройкой RAID и LVM, чтобы доказать, что вы правы:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
Важно то, что использует ОС
источник