Я хочу построить небольшой домашний сервер виртуализации на базе ProxMox. Требования к подсистеме хранения такие:
Варианты:
Выбор пал на связку BTRFS over LVM. Она позволяет дедуплицировать данные по расписанию (с помощью duperemove), кешировать данные на SSD с помощью lvmcache.
Файлы образов дисков должны быть в формате qcow2, что позволит делать снепшоты.
Файловые системы контейнеров LXC можно хранить как в виде образов, так и просто в папках на BTRFS. Последний вариант будет скорее всего быстрее (вследствие отсутствия loop-устройства), позволит дедуплицировать и\или сжимать файлы контейнеров средствами BTRFS.
Забегая вперед, скажу, что SSD кеш делает виртуальные машины ГОРАЗДО отзывчивее. Даже в условиях нехватки оперативной памяти.
Всем, кто решит использовать BTRFS + lvmcache на хосте ProxMox нужно помнить следующее:
Пример конфигурации такой. два диска - /dev/vdb (SSD) и /dev/vdc (HDD). Создаем физичесике тома и группу томов test:
pvcreate /dev/vdb pvcreate /dev/vdc vgcreate vgname /dev/vdb /dev/vdc
Создаем том с кешем на SSD:
lvcreate --type cache-pool -L1G -n cache vgname /dev/vdb
Создаем том с данными:
lvcreate -L9G -n data vgname /dev/vdc
И теперь собираем конструкцию:
lvconvert --type cache --cachepool vgname/cache vgname/data Do you want wipe existing metadata of cache pool volume test/cache? [y/n]: y Logical volume vgname/data is now cached.
Отсоединить кеш от тома можно командой:
lvconvert --splitcache vgname/data
Состояние тома можно поглядеть командой:
dmsetup -v status vgname/data
Тип кеша можно поменять командами:
lvchange --cachemode writeback vgname/data lvchange --cachemode writethrough vgname/data
Для начала надо смонтировать том с параметрами noatime,nodiratime
mkdir /mnt/vgname-data echo '/dev/mapper/vgname-data /mnt/vgname-data btrfs noatime,nodiratime 0 2' >> /etc/fstab mount /mnt/vgname-data pvesm add dir Test-Data --path /mnt/vgname-data
Тестовый хост - Pentium Silver J5005, 8GB Ram, mdadm RAID1 2x2Tb Seagate HDD (подключены к SoC AHCI), OCZ Vertex2 EX 100Gb SSD Cache (подключен к ASMedia ASM1061), transparent_hugepage выключены.
FIO под Windows Server 2008R2 скачанный отсюда: https://bluestop.org/fio/ у меня не заработал. Все время при запуске падал - fio.exe has stopped working.
Очевидно, это проблемы со сборкой, потому что FIO скачанный отсюда: https://ci.appveyor.com/project/axboe/fio/build/job/1q9lno301yq74mxc/artifacts заработал без проблем.
Тесты запускались такими командами:
fio.exe --name=baseline --rw=randread --direct=1 --size=1g --iodepth=32 --blocksize=4096 --thread --ioengine=windowsaio --filename=E\:fiotest --name=hddBaseline --stonewall fio.exe --name=baseline --rw=randwrite --direct=1 --size=1g --iodepth=32 --blocksize=4096 --thread --ioengine=windowsaio --filename=E\:fiotest --name=hddBaseline --stonewall
То есть тест блоками по 4k, случайные чтение и запись, глубина очереди 32, размер тестового файла - 1Gb, без кеширования на уровне Windows (direct=1).
Тесты запускались по три раза, чтобы тестовый файл попал в SSD-кеш.
LVM Cache/PM Cache/Format | Read, MiB/s | Write MiB/s | Read IOPS avg, k | Write IOPS avg, k | CPU Read, % | CPU Write, % |
---|---|---|---|---|---|---|
WB/NC/qcow2 | 133 | 100 | 34.0 | 25.6 | 26 | 0 |
WB/NC/raw | 127 | 104 | 32.5 | 26,6 | 25 | 0 |
WB/WB/qcow2 | 158 | 107 | 40.5 | 27,4 | 0 | 0 |
WB/WT/qcow2 | 166 | 5.3 | 42.6 | 1.324 | 0 | 4 |
WB/WT/raw | 154 | 5.47 | 39.5 | 1.335 | 0 | 3.5 |
WB/WB/raw | 150 | 118 | 38.3 | 30.1 | 0 | 23 |
WT/WT/qcow2 | 213 | 0.046 | 54.5 | 0.011 | 21 | 0 |
WT/WB/qcow2 | 159 | 9.5 | 40.8 | 2.37 | 0 | 0.9 |
WT/NC/qcow2 | 128 | 0.612 | 32.8 | 0.152 | 12.5 | 0 |
WT/NC/raw | 121 | 0.832 | 30.9 | 0.208 | 0 | 0 |
WT/WT/raw | 288 | 0.041 | 73.7 | 0.010 | 56 | 0 |
WT/WB/raw | 137 | 16.8 | 35.1 | 4.303 | 0 | 3.3 |
NC/WB/raw | 146 | 4.4 | 37.3 | 1.099 | 0 | 0.4 |
NC/WT/raw | 148 | 0.0476 | 37.8 | 0.011 | 0 | 0 |
NC/NC/raw | 1.766 | 0.694 | 0.441 | 0.173 | 0 | 0.33 |
NC/NC/qcow2 | 1.830 | 0.244 | 0.457 | 0.061 | 0.86 | 0 |
NC/WT/qcow2 | 1.7 | 0.0465 | 0.449 | 0.011 | 0 | 0 |
NC/WB/qcow2 | 3.578 | 4.889 | 0.894 | 1.222 | 0 | 0.47 |
Тестирование производилось на VM - Windows Server 2008 R2, 4GB mem, 2 cores. Для тестирования виртуальной машине добавлен отдельный пустой диск 32Gb.
В качестве SSD cache выступал том LVM на SATA диске OCZ Vertex V2 EX.
Тест в Crystal Mark запускался по 3 раза, чтобы данные успевали закешироваться. В таблице приведены данные после третьего замера.
Параметры CrystalMark - 5, 1GiB.
Boot Time - время загрузки ОС от включения до появления приглашения Press Ctrl+Alt+Del.
1 - lvm cache - On WriteBack, proxmox cache - no cache, qcow2
2 - lvm cache - On WriteBack, proxmox cache - no cache, raw
3 - lvm cache - On WriteBack, proxmox cache - WriteBack, qcow2 . WARNING - Very High CPU Load while tests!!! Very Long test!!!
4 - lvm cache - On WriteBack, proxmox cache - WriteThrough, qcow2 WARNING - Very High CPU Load while tests!!! Very Long test!!!
5 - lvm cache - On WriteBack, proxmox cache - WriteThrough, raw WARNING - Very High CPU Load while tests!!! Very Long test!!!
6 - lvm cache - On WriteBack, proxmox cache - WriteBack, raw . WARNING - Very High CPU Load while tests!!! Very Long test!!!
Disk Config | Seq Read Q32T1 | Seq Write Q32T1 | 4KiB Q8T8 Read | 4KiB Q8T8 Write | 4KiB Q32T1 Read | 4KiB Q32T1 Write | 4KiB Q1T1 Read | 4KiB Q1T1 Write | Boot Time, sec |
---|---|---|---|---|---|---|---|---|---|
1 | 217,1 | 105,3 | 112,4 | 84,32 | 111,4 | 78,72 | 12,12 | 21,75 | 16 |
2 | 218,9 | 104,6 | 112,7 | 86,15 | 111,8 | 84,85 | 11,87 | 21,58 | |
3 | 2423 | 245,6 | 329,0 | 163,6 | 285,6 | 165,5 | 39,83 | 34,49 | 16 |
4 | 2494 | 84,31 | 331,4 | 6,4 | 289,5 | 5,5 | 40,31 | 4,0 | |
5 | 2566 | 90,61 | 347,9 | 6,67 | 301,8 | 5,86 | 40,73 | 4,2 | |
6 | 2457 | 210,9 | 350,5 | 161 | 301,1 | 173,5 | 40,47 | 35,9 |