docker devicemapper thin pool with stripped volumes

Для скорости докер приложений можно использовать не SSD, а полосатый волум - 2 винчестера
с поочерёдной записью / чтением. Возмём за основу оригинальную документацию и
слегка изменим создание тонкого пула.

vgdisplay

1
2
3
4
5
--- Volume group ---
VG Name userspace
System ID
Format lvm2
...

– я имею одну волум группу, и рекомендую использовать только одну. в ней и создаём
волумы:

1
2
lvcreate --wipesignatures y -n thinpool userspace -L 50G --stripes 2
lvcreate --wipesignatures y -n thinpoolmeta userspace -L 3G --stripes 2 # 3GB это с большим запасом, но это полезно

lvdisplay --maps userspace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
--- Logical volume ---
LV Path /dev/userspace/thinpool
LV Name thinpool
VG Name userspace
LV UUID ipfaNa-Cpzi-z1bO-1oNa-CL7o-xJ5j-gXO4aS
LV Write Access read/write
LV Creation host, time flyPlate, 2018-02-11 19:04:06 +0200
LV Status available
# open 0
LV Size 50.00 GiB
Current LE 1600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 512
Block device 252:6
--- Segments ---
Logical extents 0 to 1599:
Type striped
Stripes 2
Stripe size 64.00 KiB
Stripe 0:
Physical volume /dev/sdc1
Physical extents 12800 to 13599
Stripe 1:
Physical volume /dev/sdb3
Physical extents 0 to 799
--- Logical volume ---
LV Path /dev/userspace/thinpoolmeta
LV Name thinpoolmeta
VG Name userspace
LV UUID DV82wS-2lt8-8vWd-fo9G-3Hf4-awP7-lFQiJ5
LV Write Access read/write
LV Creation host, time flyPlate, 2018-02-11 19:09:09 +0200
LV Status available
# open 0
LV Size 3.00 GiB
Current LE 96
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 512
Block device 252:7
--- Segments ---
Logical extents 0 to 95:
Type striped
Stripes 2
Stripe size 64.00 KiB
Stripe 0:
Physical volume /dev/sdc1
Physical extents 59520 to 59567
Stripe 1:
Physical volume /dev/sdb3
Physical extents 800 to 847

Дальше как в оригинальной сататье

1
2
3
4
5
6
7
lvconvert -y \
--zero n \
-c 512K \
--thinpool userspace/thinpool \
--poolmetadata userspace/thinpoolmeta
# create profile for autoextend
lvchange --metadataprofile docker-thinpool userspace/thinpool

Мои настройки докера (/etc/docker/daemon.json):

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/userspace-thinpool",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true",
"dm.basesize=2G",
"dm.fs=xfs",
"dm.libdm_log_level=6",
"dm.min_free_space=10%",
"dm.mountopt=discard"
]
}

dm.basesize=2G - чем меньше, тем быстрее работает, но тем больше шансов, что
будет какой-то контейнер, который не сможет поместиться в 2 гига. В будущем
можно будет увеличить (изменить значение в файле, перезагрузить докер), но не
уменьшить.
"dm.mountopt=discard" - на самом деле тормознутая вещь, но очищает место. Я
в итоге ихменил на "dm.mountopt=nodiscard"

Больше о опциях

docker info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: devicemapper
Pool Name: userspace-thinpool
Pool Blocksize: 524.3kB
Base Device Size: 2.147GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data Space Used: 16.25MB
Data Space Total: 53.69GB
Data Space Available: 53.67GB
Metadata Space Used: 262.1kB
Metadata Space Total: 3.221GB
Metadata Space Available: 3.221GB
Thin Pool Minimum Free Space: 5.369GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.110 (2015-10-30)
...

На этом всё.
Многие опции нельзя теперь поменять без полного пересоздания всего пула, но не все.

Лично мне любопытно, что же будет, когда мы создадим слишком много контейнеров
будет ли наш ЛВС профайл следить за волумом.

1
2
3
4
5
for ((i=1;i<=50;i++));
do
#time docker run -d alpine sleep 3600 # так мы будем ждать оочень долго
time docker run -d alpine sh -c 'cat /dev/urandom >> /1.bin; df -h; sleep 3660'
done

После длительного ожидания, место таки дошло до некоторого порога, и с 50 гиг
волум увеличилился:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo lvdisplay userspace/thinpool
--- Logical volume ---
LV Name thinpool
VG Name userspace
LV UUID hnAuLf-XEEU-2S5a-RUHB-VicS-GO3g-zVowlc
LV Write Access read/write
LV Creation host, time flyPlate, 2018-02-11 19:12:46 +0200
LV Pool metadata thinpool_tmeta
LV Pool data thinpool_tdata
LV Status available
# open 267
LV Size 62.50 GiB
Allocated pool data 43.74%

– сам же размер образа не меняется! :(
Ну и чтобы остановить всё это тестирование:

1
2
3
sudo service docker stop
sudo service docker start
docker rm -v $(docker ps -a -q --filter status='exited')

P.S. если нужна не скорость, а надёжность, то вместо полосатости можно использовать
мироринг.