Удивительно, когда тебе встречается задача и проводишь параллели с другой, схожей задачей. Помните на заре появления SSD дисков была проблема, что вышестоящий слой файловой системы не сообщал, этажом ниже, контроллеру SSD - какие из блоков уже не нужны и хранят части удалённых файлов? Для обычного HDD помеченные "галочкой" удалённые файлы не проблема, но SSD устроен иначе. Появилась волшебная команда TRIM и вот SSD уже в курсе - какие не нужные блоки равны пустым блокам, никогда до этого не использовавшиеся. У меня возникла небольшая проблема: виртуальные диски виртуальных машин хранятся в виде объектов в Ceph и когда операционная система внутри виртуальной машины "пачкает" свой диск, то размер виртуального диска только растёт в бо́льшую сторону.
Очень бы хотелось, когда внутри виртуальной машины что-либо удаляется, то это удаляется из системы хранения данных Ceph. Просто нужно не забывать, что Ceph - это программное хранилище (software-defined storage), которое по умолчанию всё хранит в 3 экземплярах. Представьте, что вы создали файл внутри виртуальной машины на 1 Гб и удалили его. Простое действие и вот файловая система навсегда увеличилась на 1 Гб. А в Ceph виртуальный диск в виде объектов увеличится на 3 Гб. Эта ситуация меня никак не радует и нужно было искать выход.
Первым делом, стоит всегда обратится к первоисточникам. Читаем ProxmoxVE, Ceph, Qemu, KVM. Находим печальные известия ENABLING DISCARD/TRIM
Note that this uses the IDE driver. The virtio driver does not support discard.
Virtio, который даёт производительность, но не даёт TRIM/DISCARD! Чтение и курение мануалов показало, что речь идёт о virtio-blk, но есть virtio-scsi, который умеет TRIM/DISCARD и не позволит упасть производительности, как в случае с IDE. Итак, есть зацепка в лице virtio-scsi. Как включить virtio-scsi для виртуальной машины Proxmox VE?
Кратко, действия таковы. Нужно выставить для виртуальной машины виртуальный жёсткий диск SCSI и в Options выставить модель SCSI адаптера в VIRTIO. Это можно сделать через веб интерфейс ProxmoxVE, но чуть ниже нам придётся всё равно ручками править конфигурационный файл.
Что если виртуальная машина уже давным давно создана, как было в моём случае? Проще всего найти конфигурационный файл виртуальной машины Proxmox VE в каталоге /etc/pve/qemu-server/ и предельно аккуратно изменить нужный файл. Вот мой пример:
bootdisk: virtio0 virtio0: cephstar:vm-112-disk-1,cache=writeback,size=20G virtio1: cephstar:vm-112-disk-2,cache=writeback,size=500G
bootdisk: scsi0 scsihw: virtio-scsi-pci scsi0: cephstar:vm-112-disk-1,cache=writeback,discard=on,size=20G scsi1: cephstar:vm-112-disk-2,cache=writeback,discard=on,size=500G
Данная виртуальная машина работает под управлением Ubuntu 14.04 Server LTS и легко пережила подобные издевательства. Ведь, используя просто virtio-blk, диски внутри виртуальной машины имели название /dev/vd*. Использование virtio-scsi именует диски /dev/sd*. Современные дистрибутивы Linux используют в /etc/fstab ссылки на блочные устройства, применяя UUID, поэтому магия смены типа жёсткого диска работает. Если внутри виртуальной машины MS Windows, то сначала "потренируйтесь на кошках".
Обратите внимание на параметры cache=writeback и discard=on. Ceph значительно быстрее работает, если включено кэширование RBD rbd_cache = true, но, в таком случае, разработчики Ceph настоятельно рекомендуют использовать для виртуальных машин cache=writeback. Important If you set rbd_cache=true, you must set cache=writeback or risk data loss. Without cache=writeback, QEMU will not send flush requests to librbd. If QEMU exits uncleanly in this configuration, filesystems on top of rbd can be corrupted.
Итак, мы перешли на использование virtio-scsi и включили discard. Теперь осталось дело за малым. Можно внутри наших виртуальных машин - у их файловых систем в /etc/fstab добавить параметр discard.
UUID=5bc6b784-1cb1-4704-8b76-d6a736b9fa73 / ext4 errors=remount-ro,relatime,nobarrier,commit=600,discard 0 1 UUID=171a16ad-52bc-4a72-ab24-aa502cf4f156 /mnt/disk1 btrfs relatime,nobarrier,discard 0 0
НО многие специалисты резонно указывают, что параметр discard в fstab часто приводит к проблемам с производительностью и многие разработчики дистрибутивов linux пошли другим путём, используя fstim. Можно команду TRIM запланировать на работу через планировщик cron. Создайте файл sudo -e /etc/cron.daily/trim
, вставьте строки и сохраните файл.
#!/bin/sh
LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
Не забудьте сделать /etc/cron.daily/trim исполняемым - sudo chmod +x /etc/cron.daily/trim
Ремарка в сторону - знаете зачем у файловой помойки диск в btrfs? Я жду нормальной реализации дедупликации в btrfs. Она уже есть сейчас, но под видом offline deduplication. Собираем из git одну из программ bedup или duperemove и периодически запускаем, чтобы объяснить btrfs какие из блоков можно объединить в один. Я же жду online deduplication. Внедрят и тогда будут не нужны лишние телодвижения. В моей файловой помойке одни и те же файлы, точнее одни и те же блоки данных, не будут занимать дополнительного места -> не будет расти виртуальный жёсткий диск файлового сервера -> не будет расти занятое место в СХД Ceph. Круто? Круто!
А как же узнать, что свободное место реально возвращается назад? К сожалению, если Ceph используется через абстракцию RBD, то нет простой команды, позволяющей узнать размер виртуального диска конкретной виртуальной машины. Ceph хранит всё в виде объектов, а не в виде готовых файлов-дисков и просто так пощупать их не получится. Это объясняет, но не оправдывает Цеф. Выкрутится можно следующей командой, где в примере vm-112-disk-1 - файл-диск из конфигурационного файла данной виртуальной машины:
rbd diff rbd/vm-112-disk-1 | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'
Diff, как вы поняли, это разница между актуальной версией и снапшотом, если он есть. Если снапшотов-снимков нет, то разница будет между актуальной версией и началом создания данного файла-диска, другими словами - размер файла-диска. Awk просуммирует второе поле Length и выдаст в гигабайтах размер виртуального диска, хранящего в недрах Цефа.
Вызывайте команду rbd diff до и после своей эпопеи с discard и наблюдайте милое сердцу любой девушки - похудение!
Дополнительные материалы:
Балансировка виртуальных машин. Разные камни в разные кучи.
Оранжевая коробка Убунту. Кластер Ubuntu в чемодане.
Осваиваем Proxmox VE и собираем грабли лбом.
Оптимизация виртуальных серверов.
Оптимизация гостевых операционных систем KVM.