Skip to content

Commit 6883ab0

Browse files
committed
rbd text reformatted
1 parent 4702d29 commit 6883ab0

File tree

2 files changed

+136
-136
lines changed

2 files changed

+136
-136
lines changed

rbd-qemu.rst

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
qemu-kvm и RBD
2+
++++++++++++++
3+
4+
И Ceph (RBD) и Qemu умеют в discard/trim/unmap. Это означает, что гостевая ОС
5+
может отправить соответствующий запрос к хранилищу, чтобы сообщить что данные не
6+
нужны. Исходно это было предназначено для SSD-дисков с целью оптимизации
7+
wear-leveling (выравнивание износа). В RBD это позволяет удалить ненужные данные
8+
из кластера и тем самым уменьшить бекфиллинг, размеры снапшотов и др.
9+
10+
Мы знаем, что RBD виртуально делит диски на куски по 4 МБ (по-умолчанию). Каждый
11+
кусок -- это один объект Rados. Соответственно, дискард может либо удалить целиком
12+
один объект (если он не нужен), либо сократить размер (вплоть до нуля). Что он не может
13+
-- так это продискардить середину объекта или начало. Он мог бы просто заполнить нулями,
14+
но нет. Появляется ошибка, правда, не фатальная. В API RBD нет функции для
15+
выяснения размера чанка. Поэтому Qemu не может догадаться какие дискарды можно отправлять
16+
в librbd, а какие закончатся ошибкой. В документации про это ничего не сказано.
17+
18+
Есть костыль для ceph.conf -- параметр ``rbd_skip_partial_discard``. Однако:
19+
20+
* http://tracker.ceph.com/issues/16386
21+
* http://tracker.ceph.com/issues/16869
22+
23+
В связи с чем, лучше проинструктировать Qemu чтобы она сообщила в гостевую об
24+
имеющемся выравнивании в 4 МБ. Тогда ядро гостевой ОС не будет отправлять дискарды
25+
которые невозможно выполнить в RBD.
26+
27+
К сожалению, libvirt напрямую не может указать это для каждого диска персонально.
28+
Но есть костыль:
29+
30+
.. code-block:: xml
31+
32+
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
33+
<qemu:commandline>
34+
<qemu:arg value='-global'/>
35+
<qemu:arg value='scsi-hd.discard_granularity=4194304'/>
36+
</qemu:commandline>
37+
...
38+
<disk type='network' device='disk'>
39+
<!--
40+
detect_zeroes='on'
41+
https://libvirt.org/formatdomain.html:
42+
43+
NB enabling the detection is a compute intensive operation,
44+
but can save file space and/or time on slow media.
45+
46+
А ещё это может повлиять на бенчмарки в стиле dd if=/dev/zero ...
47+
fio использует случайный паттерн.
48+
-->
49+
<driver name='qemu' type='raw' cache='writeback' discard='unmap'/>
50+
...
51+
</disk>
52+
</domain>
53+
54+
.. important::
55+
56+
``xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'`` крайне важен.
57+
Без этой строки ``<qemu:commandline>`` будет проигнорирован. Проверить
58+
можно повторно отредактировав описание ВЫКЛЮЧЕНОЙ виртуальной машины
59+
``virsh edit some-domain``
60+
61+
Данный фрагмент будет работать только для virtio-scsi. Для IDE аналогично,
62+
но мне неизвестно как :).
63+
64+
(Пример по ссылке http://docs.ceph.com/docs/master/rbd/qemu-rbd похоже что
65+
устарел и не работает)
66+
67+
Для справки есть ещё такие параметры:
68+
69+
* ``logical_block_size``
70+
* ``physical_block_size``
71+
* ``min_io_size``
72+
* ``opt_io_size``
73+
74+
.. important::
75+
76+
Discard будет работать только для виртуальных дисковых интерфейсов IDE и
77+
virtio-scsi. Не путайте virtio и virtio-scsi -- это два совершенно разных
78+
интерфейса. virtio устарел и более не развивается. В гостевой ОС
79+
virtio-scsi выглядит как ``/dev/sd*``, а virtio как ``/dev/vd*``.
80+
81+
82+
Их всех можно посмотреть командой ``lsblk`` в гостевой ОС чтобы удостовериться,
83+
что виртуальная машина настроена правильно
84+
(``DISC-GRAN`` равен размеру чанка в RBD):
85+
86+
.. code::
87+
88+
$ lsblk -D
89+
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
90+
sda 0 4M 1G 0
91+
├─sda1 4176896 4M 1G 0
92+
├─sda2 3145728 4M 1G 0
93+
└─sda3 3145728 4M 1G 0
94+
95+
$ lsblk -t
96+
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
97+
sda 0 512 0 512 512 1 deadline 128 128 2G
98+
├─sda1 0 512 0 512 512 1 deadline 128 128 2G
99+
├─sda2 0 512 0 512 512 1 deadline 128 128 2G
100+
└─sda3 0 512 0 512 512 1 deadline 128 128 2G
101+
102+
103+
Чтобы это заработало полностью, нужно не только убедиться что эта возможность
104+
появилась на блочном уровне в гостевой ОС, но и чтобы гостевая ОС
105+
использовала эту функцию.
106+
107+
Linux
108+
~~~~~
109+
110+
* ``fstrim -v -a``. Вручную, либо по расписанию (раз в неделю). Рекомендуется.
111+
не уверен, но в Ubuntu, по-моему, работает из коробки.
112+
* Опции для SWAP-разделов. TODO: расписать какие именно. Есть первичный дискард
113+
перед подключением, есть включение дискарда во время работы.
114+
* Есть опции при монтировании различных ФС чтобы выполняли discard для данных
115+
которые стали ненужными (после удаления файлов)
116+
* Команда ``blkdiscard`` для очистки всего устройства либо раздела или тома LVM.
117+
118+
.. warning::
119+
120+
Говорят, что опции монтирования и аналогичные опции для SWAP-раздела понижают
121+
производительность. С другой стороны, массивный fstrim по расписанию может
122+
дать непредвиденные проседания IO в гостевой ОС.
123+
124+
Windows
125+
~~~~~~~
126+
127+
TODO: всё работает из коробки как-то само собой. На старых версиях можно включить
128+
через реестр. Как посмотреть ? Как форсировано прочистить ?
129+
130+
Настоятельно рекомендуется установить дополнения в гостевую ОС:
131+
132+
* https://fedoraproject.org/wiki/Windows_Virtio_Drivers
133+
* https://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers
134+
135+
Иначе придётся довольствоваться только IDE, а это сильно меньшая производительность.

rbd.rst

Lines changed: 1 addition & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,142 +1,7 @@
11
RBD
22
---
33

4-
qemu-kvm и discard
5-
++++++++++++++++++
6-
7-
И Ceph (RBD) и Qemu умеют в discard/trim/unmap. Это означает, что гостевая ОС
8-
может отправить соответствующий запрос к хранилищу, чтобы сообщить что данные не
9-
нужны. Исходно это было предназначено для SSD-дисков с целью оптимизации
10-
wear-leveling (выравнивание износа). В RBD это позволяет удалить ненужные данные
11-
из кластера и тем самым уменьшить бекфиллинг, размеры снапшотов и др.
12-
13-
Мы знаем, что RBD виртуально делит диски на куски по 4 МБ (по-умолчанию). Каждый
14-
кусок -- это один объект Rados. Соответственно, дискард может либо удалить целиком
15-
один объект (если он не нужен), либо сократить размер (вплоть до нуля). Что он не может
16-
-- так это продискардить середину объекта или начало. Он мог бы просто заполнить нулями,
17-
но нет. Появляется ошибка, правда, не фатальная. В API RBD нет функции для
18-
выяснения размера чанка. Поэтому Qemu не может догадаться какие дискарды можно отправлять
19-
в librbd, а какие закончатся ошибкой. В документации про это ничего не сказано.
20-
21-
Есть костыль для ceph.conf -- параметр ``rbd_skip_partial_discard``. Однако:
22-
23-
* http://tracker.ceph.com/issues/16386
24-
* http://tracker.ceph.com/issues/16869
25-
26-
В связи с чем, лучше проинструктировать Qemu чтобы она сообщила в гостевую об
27-
имеющемся выравнивании в 4 МБ. Тогда ядро гостевой ОС не будет отправлять дискарды
28-
которые невозможно выполнить в RBD.
29-
30-
К сожалению, libvirt напрямую не может указать это для каждого диска персонально.
31-
Но есть костыль:
32-
33-
.. code-block:: xml
34-
35-
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
36-
<qemu:commandline>
37-
<qemu:arg value='-global'/>
38-
<qemu:arg value='scsi-hd.discard_granularity=4194304'/>
39-
</qemu:commandline>
40-
...
41-
<disk type='network' device='disk'>
42-
<!--
43-
detect_zeroes='on'
44-
https://libvirt.org/formatdomain.html:
45-
46-
NB enabling the detection is a compute intensive operation,
47-
but can save file space and/or time on slow media.
48-
49-
А ещё это может повлиять на бенчмарки в стиле dd if=/dev/zero ...
50-
fio использует случайный паттерн.
51-
-->
52-
<driver name='qemu' type='raw' cache='writeback' discard='unmap'/>
53-
...
54-
</disk>
55-
</domain>
56-
57-
.. important::
58-
59-
``xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'`` крайне важен.
60-
Без этой строки ``<qemu:commandline>`` будет проигнорирован. Проверить
61-
можно повторно отредактировав описание ВЫКЛЮЧЕНОЙ виртуальной машины
62-
``virsh edit some-domain``
63-
64-
Данный фрагмент будет работать только для virtio-scsi. Для IDE аналогично,
65-
но мне неизвестно как :).
66-
67-
(Пример по ссылке http://docs.ceph.com/docs/master/rbd/qemu-rbd похоже что
68-
устарел и не работает)
69-
70-
Для справки есть ещё такие параметры:
71-
72-
* ``logical_block_size``
73-
* ``physical_block_size``
74-
* ``min_io_size``
75-
* ``opt_io_size``
76-
77-
.. important::
78-
79-
Discard будет работать только для виртуальных дисковых интерфейсов IDE и
80-
virtio-scsi. Не путайте virtio и virtio-scsi -- это два совершенно разных
81-
интерфейса. virtio устарел и более не развивается. В гостевой ОС
82-
virtio-scsi выглядит как ``/dev/sd*``, а virtio как ``/dev/vd*``.
83-
84-
85-
Их всех можно посмотреть командой ``lsblk`` в гостевой ОС чтобы удостовериться,
86-
что виртуальная машина настроена правильно
87-
(``DISC-GRAN`` равен размеру чанка в RBD):
88-
89-
.. code::
90-
91-
$ lsblk -D
92-
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
93-
sda 0 4M 1G 0
94-
├─sda1 4176896 4M 1G 0
95-
├─sda2 3145728 4M 1G 0
96-
└─sda3 3145728 4M 1G 0
97-
98-
$ lsblk -t
99-
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
100-
sda 0 512 0 512 512 1 deadline 128 128 2G
101-
├─sda1 0 512 0 512 512 1 deadline 128 128 2G
102-
├─sda2 0 512 0 512 512 1 deadline 128 128 2G
103-
└─sda3 0 512 0 512 512 1 deadline 128 128 2G
104-
105-
106-
Чтобы это заработало полностью, нужно не только убедиться что эта возможность
107-
появилась на блочном уровне в гостевой ОС, но и чтобы гостевая ОС
108-
использовала эту функцию.
109-
110-
Linux
111-
~~~~~
112-
113-
* ``fstrim -v -a``. Вручную, либо по расписанию (раз в неделю). Рекомендуется.
114-
не уверен, но в Ubuntu, по-моему, работает из коробки.
115-
* Опции для SWAP-разделов. TODO: расписать какие именно. Есть первичный дискард
116-
перед подключением, есть включение дискарда во время работы.
117-
* Есть опции при монтировании различных ФС чтобы выполняли discard для данных
118-
которые стали ненужными (после удаления файлов)
119-
* Команда ``blkdiscard`` для очистки всего устройства либо раздела или тома LVM.
120-
121-
.. warning::
122-
123-
Говорят, что опции монтирования и аналогичные опции для SWAP-раздела понижают
124-
производительность. С другой стороны, массивный fstrim по расписанию может
125-
дать непредвиденные проседания IO в гостевой ОС.
126-
127-
Windows
128-
~~~~~~~
129-
130-
TODO: всё работает из коробки как-то само собой. На старых версиях можно включить
131-
через реестр. Как посмотреть ? Как форсировано прочистить ?
132-
133-
Настоятельно рекомендуется установить дополнения в гостевую ОС:
134-
135-
* https://fedoraproject.org/wiki/Windows_Virtio_Drivers
136-
* https://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers
137-
138-
Иначе придётся довольствоваться только IDE, а это сильно меньшая производительность.
139-
4+
.. include:: rbd-qemu.rst
1405

1416
Недорасписанное
1427
+++++++++++++++

0 commit comments

Comments
 (0)