Я пытался найти прямой ответ на этот вопрос, но это оказалось неуловимым. это вопрос и его ответ близко, но не дает мне той специфики, которую я хотел бы. Начнем с того, что я знаю.
Если у вас есть стандартное блочное устройство и вы запускаете 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)
Следовательно, изменения, которые я сделал выше, с размером сектора по умолчанию снизят скорость чтения с 128k до 64k. Пока все хорошо.
Однако что происходит, когда мы добавляем программный 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, что намного выше, чем у блочных устройств. Итак, несколько вопросов:
lvchange -r
повлиять на устройство dm-0 и не появиться здесь?Если это так просто, как настройка RA с виртуального блочного устройства, которое вы используете, передается, означает ли это, что чтение из dm-0 (или md0) будет преобразовано в 4 x 4096 чтения RA? (по одному на каждом блочном устройстве). Если это так, это будет означать, что эти настройки увеличивают размер опережающего чтения в сценарии выше.
Затем, чтобы выяснить, что на самом деле делает параметр readahead:
Что вы используете, эквивалентно размеру сектора выше, чтобы определить фактическое значение опережения чтения для виртуального устройства:
Наконец, будет ли какая-либо предпочтительная связь между размером полосы и настройкой RA (например)? Здесь я думаю, что если полоса является наименьшим элементом, который будет извлечен из устройства RAID, в идеале вы не захотите иметь 2 доступа к диску для обслуживания этой минимальной единицы данных и захотите сделать RA достаточно большой, чтобы выполнить запрос с одним доступом.
Как параметр 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).
blockdev --report | grep sda
rw **512** 512 4096 0 1500301910016 /dev/sda
rw **512** 512 4096 2048 1072693248 /dev/sda1
rw **512** 512 4096 2097152 1499227750400 /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw **256** 512 4096 0 1500301910016 /dev/sda
rw **256** 512 4096 2048 1072693248 /dev/sda1
rw **256** 512 4096 2097152 1499227750400 /dev/sda2
Установка / dev / md0 RA не повлияет на блочные устройства / dev / sdX.
rw **256** 512 4096 2048 1072693248 /dev/sda1
rw **256** 512 4096 2097152 1499227750400 /dev/sda2
rw **512** 512 4096 0 1072627712 /dev/md0
Так что в целом, на мой взгляд, ядро обращается к блочному устройству в том порядке, который установлен на самом деле. К одному логическому тому можно получить доступ через RAID (который является его частью) или устройство devicemapper, и каждый с другим RA, который будет соблюдаться.
Итак, ответ таков: настройка RA IMHO не передается вниз по цепочке блочных устройств, но независимо от настройки RA устройства верхнего уровня, она будет использоваться для доступа к составляющим устройствам.
Превосходит ли dm-0 все, потому что это блочное устройство верхнего уровня, к которому вы на самом деле обращаетесь?
Если вы имеете в виду глубокое распространение под «козырем всех» - в соответствии с моим предыдущим комментарием, я думаю, что у вас могут быть разные RA для разных устройств в системе.
Будет ли lvchange -r влиять на устройство dm-0 и не отображаться здесь?
Да, но это частный случай. Предположим, у нас есть / dev / dm0, который является / dev / vg0 / blockdevice LVM. Если вы это сделаете:
lvchange -r 512 /dev/vg0/blockdevice
/ dev / dm0 также изменится, потому что / dev / dm0 и / dev / vg0 / blockdevice - это одно и то же блочное устройство, когда дело касается доступа к ядру.
Но давайте предположим, что / dev / vg0 / blockdevice - это то же самое, что / dev / dm0 и / dev / xvda1 в Xen domU, который его использует. Установка RA для / dev / xvda1 вступит в силу, но dom0 будет видеть, что у нее все еще есть собственный RA.
Что вы используете, эквивалентно размеру сектора выше, чтобы определить фактическое значение опережения чтения для виртуального устройства:
Обычно я обнаруживаю RA, экспериментируя с разными значениями и тестируя его с помощью hdparm.
Размер полосы RAID (для md0)?
То же, что и выше.
Играет ли роль FS (меня в первую очередь интересуют ext4 и XFS)?
Конечно - это очень большая тема. Я рекомендую начать здесь 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, чтобы доказать, что вы правы:
Важен тот, который использует ОС.