Назад | Перейти на главную страницу

Настройки 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)

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

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

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

Важен тот, который использует ОС.