Кэширование в Qemu-KVM
Управляя режимом кэширования, можно влиять на производительность виртуальных окружений. В KVM и QEMU реализовано несколько режимов кэширования.
Для ускорения операций ввода/вывода, операционная система обслуживает так называемый страничный кэш (page cache). Операции записи считаются завершенными после того как данные попадут в кэш. Операции чтения также могут выполняться быстрее если данные будут найдены в кэше. Страничный кэш периодически сбрасывает данные на диск используя системный вызов fsync. Запросы прямого ввода/вывода (Direct I/O) обходят страничный кэш и используют непосредственно сам диск. В KVM окружениях, собственный страничный кэш может быть как в хост-системе, так и в гостевом окружении, таким образом может получиться так, что одни и те же данные могут находиться в двух кэшах одновременно. В общем случае, будет лучше если отказаться от использования одного из кэшей. Если приложение в виртуальном окружении будет использовать запросы прямого ввода/вывода (Direct I/O), то кэш виртуального окружения не будет использоваться. Если же гостевое окружение запущено без использования средств кэширования, то простаивать уже будет кэш хост-системы и все запросы ввода/вывода гостевого окружения для хост-системы будут считаться прямыми запросами ввода/вывода.
Также известно что и у дисков есть свой собственный кэш (disk write cache).
Использование кэша дисковой записи может значительно увеличить производительность операций записи, т.к. такие операции будут считаться завершенными уже после того как данные попадут в кэш. Но с другой стороны если данные не успели сброситься на диск и произошел сбой питания, то данные будут безвозвратно потеряны. Использование дисковых контроллеров с BBU позволит избежать потери данных.
KVM и QEMU поддерживают следующие режимы поддержки кэширования:
writethrough
- Этот режим используется по умолчанию.
- Использует только кэш хост-системы.
- Дисковый кэш не используется.
- Гарантируется целостность данных.
- Производительность операций чтения значительно лучше (т.к. используется страничный кэш хост-системы).
- Производительность операций записи может быть хуже (т.к. использование кэша дисковой записи запрещено).
writeback
- Использует кэш хост-системы.
- Используется дисковый кэш.
- Высокая производительность операций чтения и записи.
- Риск потери данных в случае сбоя питания.
- Рекомендуется в случаях когда не страшна потеря данных.
none
- Кэш хост-системы не используется.
- Используется только дисковый кэш.
- Операции записи будут быстрее т.к. запросы будут обходить кэш ОС и попадать сразу в дисковый кэш.
- Целостность данных гарантируется в случае использования BBU или соответствующих средств файловых систем (опция монтирования barrier).
- Производительность операций чтения будет хуже чем в writethrough-режиме (ограничение на использование страничного кэша ОС).
unsafe
- Риск потери данных.
- Рекомендуется использовать только там где не страшно потерять данные.
- Не рекомендуется использовать в production окружениях.
Для локальных хранилищ или DAS (Direct-attached storage - дисковые полки) рекомендуется использовать writethrough режим, поскольку он гарантирует целостность данных и приемлемую производительность ввода/вывода. Для удаленных хранилищ (NFS или iSCSI) рекомендуется использовать режим none, т.к. операции прямого ввода/вывода (O_DIRECT) дают лучшую производительность чем синхронные (O_SYNC).
Управление кэшем дисковых устройств в QEMU определяется через параметр cache указываемый при определении дисков:
1 | -drive if=virtio,file=/dev/vg01/kvm302-frontend-root,index=0,media=disk,cache=none |