|
1 | 1 | RBD |
2 | 2 | --- |
3 | 3 |
|
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 |
140 | 5 |
|
141 | 6 | Недорасписанное |
142 | 7 | +++++++++++++++ |
|
0 commit comments