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

Почему чтение с моего зеркала lvm происходит медленнее, чем чтение с отдельных дисков?

Я измеряю с помощью hdparm -t PV (sda3 и sdb2) и LV (рабочий). На самом деле это быстрее на PV.

Неужели все так и есть на lvm, или я что-то делаю не так?

# lvs -a -o +devices
LV              VG     Attr   LSize   Origin Snap%  Move Log       Copy%  Convert Devices                          
root            foobar -wi-ao 165.00G                                             /dev/sda3(10752)                 
swap            foobar -wi-ao   2.00G                                             /dev/sda3(10240)                 
work            foobar mwi-ao 148.52G                    work_mlog 100.00         work_mimage_0(0),work_mimage_1(0)
[work_mimage_0] foobar iwi-ao 148.52G                                             /dev/sda3(52992)                 
[work_mimage_1] foobar iwi-ao 148.52G                                             /dev/sdb2(0)                     
[work_mlog]     foobar lwi-ao   4.00M                                             /dev/sdb1(0)                     

Есть небольшие дополнительные накладные расходы на передачу данных через интерфейсы дополнительных виртуальных блочных устройств (в ядре). Обычно это порядка линейного шума (не более 3%).

Если вы хотите повысить производительность нескольких дисков, вам нужно взглянуть на драйверы md (метадиск) ... RAID 1 (зеркалирование) или RAID 10 (зеркалирование + чередование). В этих случаях ваша система может одновременно чередовать чтение и запись с нескольких дисков (шпинделей). (Обратите внимание, что есть некоторые конфигурации оборудования, при которых вам не удастся использовать зеркалирование; например, два диска свисают с простого старого кабеля IDE / PATA; один контроллер / кабель является узким местом).

Двумя основными факторами, которые влияют на общую производительность накопителя, являются время поиска и пропускная способность ... сколько времени требуется, чтобы расположить головки накопителя над запрашиваемыми данными и как быстро данные могут быть переданы по кабелю. Зеркалирование двух каналов ввода / вывода, очевидно, улучшает читать пропускная способность (потенциально почти вдвое больше данных, передаваемых за любой заданный интервал). Влияние на время поиска драматично и более вероятно ... головки на двух дисках, скорее всего, будут находиться над разными частями их соответствующих пластин. Запрос на чтение может поступать с любого диска, таким образом, запрос может быть направлен на диск, головки которого расположены ближе к желаемой области. (Насколько я знаю, это действительно просто сделано грубой эвристикой в ​​ядре Linux ... драйверы не знают деталей геометрии диска, а просто обрабатывают запросы как смещения в таблице «линейного массива блоков»).

Что еще более важно, зеркальная конфигурация RAID может обслуживать несколько запросов на чтение одновременно.

Обратите внимание, что зеркалирование RAID не дает никаких преимуществ для записи. Каждая запись должна выполняться на нескольких дисках ... таким образом, она должна передаваться по каждому каналу ввода-вывода в наборе, и вы страдаете от наихудшего времени поиска в наборе (вместо того, чтобы выигрывать от оптимально расположенной головки в случае читает).

Обратите внимание, что в Linux можно использовать функции LVM и md RAID вместе. Обычно вы используете драйверы md * в качестве нижнего виртуального блочного уровня (объединение физических дисков в наборы RAID), а затем используете LVM над ними (превращая каждое из ваших md * (1, 5 или 6) устройств верхнего уровня в LVM PV. --- физические тома). По большей части я бы сказал, что RAID 0 (чередование) не имеет смысла с LVM. (LVM может объединять несколько дисков в большие виртуальные тома, как это делает RAID 0. Однако он делает это гораздо более гибко).

Это могло быть по любому количеству причин. Я знаю, что в некоторых файловых системах есть «копирование при записи», включая Ext3, ZFS, WAFL, VERITAS (NetBackup) и btrfs. Однако, хотя COW (копирование при записи) МОЖЕТ замедлить работу вашей системы, это не должно быть чем-то легко заметным.

Кроме того, если у вас включены снимки (с любым контроллером, который вы используете для создания LV), это также замедлит их.

В зависимости от размера физических экстентов в томе это могло замедлить его (скажем, возможно, что каждый физический диск имел разный общий объем). Или, возможно, что-то происходит с одним из отдельных физических дисков, составляющих ваш LVM.

Попробуйте провести диагностику самих дисков и посмотреть, не возвращает ли какой-либо из них поврежденные сектора / срезы. Вы увеличиваете этот логический том автоматически или это том фиксированного размера?

Это вполне может быть способ настройки вашего зеркала LVM. В контроллере или физических дисках может что-то происходить. Вы также должны помнить скорость на контроллере, так как путь, по которому данные попадают на диски, проходит через контроллер - наличие старого контроллера с новыми жесткими дисками не ускоряет работу (в зависимости от старого контроллера, у меня есть старый и почти всегда превосходит некоторые из новых).

Одна из проблем, с которыми я столкнулся в какой-то момент, заключалась в том, что для томов LVM значения по умолчанию для максимальной скорости чтения были установлены на что-то глупо низкое. IIRC, который был исправлен с тех пор, но я полагаю, это не повредит проверить. Например. в

blockdev --getra / dev / foo / bar

чтобы увидеть настройку опережения чтения устройства, и --setra N, чтобы установить его в N секторов. И вы, вероятно, захотите установить приличную опережение чтения либо на базовом устройстве, либо на томе LVM, но не на обоих.

Кроме того, для «правильного» тестирования используйте что-то вроде iozone, fio, bonnie ++ вместо hdparm. hdparm обращается к дискам напрямую, и я не уверен, что он делает что-нибудь значимое, когда вы запускаете его на виртуальном устройстве, таком как LVM LV.