Настройки Readahead для LVM, Device-Mapper, Software Raid и Block Devices - что выигрывает?

Я пытался найти прямой ответ на этот вопрос, и он оказался неуловимым. Этот вопрос и его ответ близки, но на самом деле не дают мне того, что мне хотелось бы. Давайте начнем с того, что я думаю, я знаю.

Если у вас стандартное блочное устройство и вы запускаете 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 достаточно большой, чтобы выполнить запрос с единым доступом.

3 ответа

Решение

Как настройка 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 block devices.

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

Так что, по моему мнению, ядро ​​получает доступ к block device способом, который фактически установлен. Один логический том может быть доступен через RAID (который он является частью) или устройство устройства отображения, и каждый с другим RA, который будет соблюдаться.

Таким образом, ответ таков: настройка RA ИМХО не передается по цепочке блочных устройств, но независимо от настройки RA устройства верхнего уровня, она будет использоваться для доступа к составляющим устройствам.

Имеет ли dm-0 преимущество, потому что это блок-устройство верхнего уровня, к которому вы фактически обращаетесь?

Если вы имеете в виду глубокое распространение "козырь всех" - согласно моему предыдущему комментарию, я думаю, что у вас могут быть разные RA для разных устройств в системе.

Повлияет ли lvchange -r на устройство dm-0 и не появится здесь?

Да, но это частный случай. Давайте предположим, что у нас есть / dev / dm0, который является /dev/vg0/block device LVM. Если вы делаете:

lvchange -r 512 /dev/vg0/blockdevice

/ dev / dm0 также изменится, потому что / dev / dm0 и /dev/vg0/block device - это одно и то же блочное устройство, когда дело доходит до доступа к ядру.

Но давайте предположим, что /dev/vg0/block device - это то же самое, что и / dev / dm0 и /dev/xvda1 в Xen domU, который его использует. Установка RA для /dev/xvda1 вступит в силу, но dom0 увидит, что все еще имеет свой собственный RA.

Что вы используете, эквивалентно размеру сектора, указанному выше, чтобы определить фактическое значение readahead для виртуального устройства:

Обычно я обнаруживаю 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, чтобы доказать, что вы правы:

https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices

Важно то, что использует ОС

Другие вопросы по тегам