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

26

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

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

Адам С
источник
Какой дистрибутив Linux вы используете? Вы используете аппаратный или программный рейд? Похоже на программное обеспечение. Если аппаратное обеспечение, какую карту / набор микросхем вы используете, то большая часть этого будет установлена ​​и сохранена в прошивке устройства.
Джейсон Хантли
Кроме того, настройки RA в значительной степени зависят от схемы размещения файловой системы. Вы используете ext4?
Джейсон Хантли
Я на самом деле упоминаю, что речь идет о программном RAID и LVM, так что да - о программном. Что касается файловой системы, мне было бы интересно узнать разницу между XFS и ext4, хотя ответы на эти вопросы были бы хорошими
Adam C
XFS может быть сильно настроен для лучшей производительности. Это описано в нескольких местах на этом сайте: здесь и здесь ... Какой дистрибутив Linux вы используете? Это играет роль, потому что есть также некоторые инструменты, специфичные для дистрибутива.
ewwhite
Это не вопросы производительности, это более конкретно - я просто хочу узнать о настройках RA и о том, как они преобразуются / взаимодействуют с уровнями LVM / Software RAID
Adam C

Ответы:

11

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

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

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

Таким образом, ответ таков: настройка RA ИМХО не передается по цепочке блочных устройств, но независимо от настройки 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.

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

Обычно я обнаруживаю RA, экспериментируя с разными значениями и тестируя его с помощью hdparm.

Размер полосы RAID (для md0)?

То же, что и выше.

Играет ли роль FS (меня в первую очередь интересуют ext4 и XFS)?

Конечно - это очень большая тема. Я рекомендую Вам начать здесь http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
источник
Это очень близко к тому, что я ищу, и что я подозревал - можете ли вы прояснить одну вещь для меня: в ситуации / dev / md0 (/ dev / sda1, / dev / sda2) я знаю, что вы можете установить отдельные значения RA, но если вы скажете mount / data в / dev / md0 и прочитаете из него файл - используется ли 512 RA для чтения из / dev / sda1 и / dev / sda2 (т. е. 512 используется для обоих) или 256 используется на каждом? Если первое, то было бы разумно установить RAID0 RA равным: SUM (RA устройств в RAID0)
Адам С
1
Просто из своего опыта - установка RA = 512 для / dev / md0 с дисками / dev / sdX под, действует точно так же, как у нас был доступ к / dev / sdX с RA = 512, несмотря на то, что, например, у нас может быть RA = 256 установка на нижнем блоке устройства. В этом случае настройка 256 будет игнорироваться (обратите внимание, что / dev / sda бесполезен как блочное устройство, если оно является частью / dev / md0). Я не программист ядра, но это кажется логичным и подтверждается моей практикой. Так многообещающе. Чтение 3 потоков из / dev / md0, RA = 512 равно чтению 3 потоков из / dev / sd {a, b, c} с RA = 512.
Войцех
Большое спасибо! Я немного отредактировал вещи, чтобы было понятнее в ответе. Могу ли я попросить еще одну вещь, прежде чем принять? У вас есть пример (или ссылка на него) для использования hdparm для тестирования RA? Я собирался сделать что-то подобное сам, поэтому, если есть хорошая рекомендация, это сэкономит мне время.
Адам С
Это не сложно, но зависит от того, что вы хотите проверить. Пожалуйста, обратитесь к руководству hdparm. Если вы хотите проверить чтение с диска (которое является производным от readahead), вы можете выполнить команду типа hdparm -t / dev / md0 . Результат покажет что-то похожее на время чтения буферизованного диска: 310 МБ за 3,02 секунды = 102,79 МБ / с . Последнее значение обычно сильно зависит от настройки RA.
Wojciechz
1
ах, так что не прямое измерение - понял, сейчас принимаю - спасибо за помощь :)
Адам С
4

Знайте ответ труднее объяснить, поэтому я сделаю это на примере. Скажем, ради этого у вас есть 3 блочных устройства, и вы устанавливаете свой RA, чтобы сказать 4 (4 * 512 байт), принимая стандартный сектор. Если вы скажете использовать схему RAID-5 с использованием 3 дисков, любое чтение, которое даже коснулось полосы на уникальном диске, привело бы к увеличению RA по фактору, который вы изначально установили для блочного устройства RA. Таким образом, если ваше чтение охватывает ровно все 3 диска, тогда ваш эффективный RA будет 12 * 512 байт. Это может быть осложнено установкой RA на разных уровнях, например, MD или LVM. Как правило, если мое приложение использует RA, я устанавливаю его на максимально возможном слое, чтобы не создавать ненужные RA. Затем я запускаю файловую систему в секторе 2049 и смещаю начало каждого сектора на число, кратное 8. Я могу быть далека от того, что вы просите, но это мои 2 ¢.

Билл Кларк
источник
Итак, вы говорите, что независимо от того, какая настройка RA установлена ​​на устройстве верхнего уровня, она просто будет передана. Поэтому, если вы использовали LVM -> 2 x RAID -> 4 x физических диска каждый, и у вас было RA 4, то из-за 8 физических устройств вы получите эффективный RA 32. Как бы вы настроили Размер RAID / чередования RAID будет эффективным в этом сценарии - я предполагаю, что вы хотите, чтобы RA покрывал всю череду, чтобы вам не приходилось обращаться дважды?
Адам С
Кстати, если я понимаю это правильно, в сценарии, который я описываю, я думаю, что я бы хотел, чтобы кусок / полоса RAID0 был установлен в X, где X = RA * 512 байт. Поэтому, если у меня есть чанк / полоса 64 КБ (по умолчанию mdadm), тогда минимальное значение RA, которое я должен использовать, составляет 128, потому что это дает мне всю полосу за один выстрел.
Адам С