Авторские статьи об OpenSource

Отдайте моё назад.


Удивительно, когда тебе встречается задача и проводишь параллели с другой, схожей задачей. Помните на заре появления SSD дисков была проблема, что вышестоящий слой файловой системы не сообщал, этажом ниже, контроллеру SSD - какие из блоков уже не нужны и хранят части удалённых файлов? Для обычного HDD помеченные "галочкой" удалённые файлы не проблема, но SSD устроен иначе. Появилась волшебная команда TRIM и вот SSD уже в курсе - какие не нужные блоки равны пустым блокам, никогда до этого не использовавшиеся. У меня возникла небольшая проблема: виртуальные диски виртуальных машин хранятся в виде объектов в Ceph и когда операционная система внутри виртуальной машины "пачкает" свой диск, то размер виртуального диска только растёт в бо́льшую сторону.

Кластер виртуализации ProxmoxVE и кластер хранения данных 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.

    Twitter   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта

Лучшее на сайте:

1С под Linux.   Ускорение Ubuntu.   21 пример iptables.   Цикл статей о Ceph.   Убунту в дикой среде.   Ubuntu Linux на SSD.   Ubuntu для блондинок.   Поддержка железа в Linux.   BTSync на службе у админа.   Андроид программы в Ubuntu.   Прокидывание портов для p2p.   Анти СПАМ в Postfix.  



Круги Гугл Ада.


Группа поддержки