Кэширование в Qemu-KVM

Управляя режимом кэширования, можно влиять на производительность виртуальных окружений. В KVM и QEMU реализовано несколько режимов кэширования.

Для ускорения операций ввода/вывода, операционная система обслуживает так называемый страничный кэш (page cache). Операции записи считаются завершенными после того как данные попадут в кэш. Операции чтения также могут выполняться быстрее если данные будут найдены в кэше. Страничный кэш периодически сбрасывает данные на диск используя системный вызов fsync. Запросы прямого ввода/вывода (Direct I/O) обходят страничный кэш и используют непосредственно сам диск. В KVM окружениях, собственный страничный кэш может быть как в хост-системе, так и в гостевом окружении, таким образом может получиться так, что одни и те же данные могут находиться в двух кэшах одновременно. В общем случае, будет лучше если отказаться от использования одного из кэшей. Если приложение в виртуальном окружении будет использовать запросы прямого ввода/вывода (Direct I/O), то кэш виртуального окружения не будет использоваться. Если же гостевое окружение запущено без использования средств кэширования, то простаивать уже будет кэш хост-системы и все запросы ввода/вывода гостевого окружения для хост-системы будут считаться прямыми запросами ввода/вывода.
Также известно что и у дисков есть свой собственный кэш (disk write cache).

Использование кэша дисковой записи может значительно увеличить производительность операций записи, т.к. такие операции будут считаться завершенными уже после того как данные попадут в кэш. Но с другой стороны если данные не успели сброситься на диск и произошел сбой питания, то данные будут безвозвратно потеряны. Использование дисковых контроллеров с BBU позволит избежать потери данных.

writethrough

  • Этот режим используется по умолчанию.
  • Использует только кэш хост-системы.
  • Дисковый кэш не используется.
  • Гарантируется целостность данных.
  • Производительность операций чтения значительно лучше (т.к. используется страничный кэш хост-системы).
  • Производительность операций записи может быть хуже (т.к. использование кэша дисковой записи запрещено).

writeback

  • Использует кэш хост-системы.
  • Используется дисковый кэш.
  • Высокая производительность операций чтения и записи.
  • Риск потери данных в случае сбоя питания.
  • Рекомендуется в случаях когда не страшна потеря данных.

none

  • Кэш хост-системы не используется.
  • Используется только дисковый кэш.
  • Операции записи будут быстрее т.к. запросы будут обходить кэш ОС и попадать сразу в дисковый кэш.
  • Целостность данных гарантируется в случае использования BBU или соответствующих средств файловых систем (опция монтирования barrier).
  • Производительность операций чтения будет хуже чем в writethrough-режиме (ограничение на использование страничного кэша ОС).

unsafe

  • Риск потери данных.
  • Рекомендуется использовать только там где не страшно потерять данные.
  • Не рекомендуется использовать в production окружениях.

Для локальных хранилищ или DAS (Direct-attached storage - дисковые полки) рекомендуется использовать writethrough режим, поскольку он гарантирует целостность данных и приемлемую производительность ввода/вывода. Для удаленных хранилищ (NFS или iSCSI) рекомендуется использовать режим none, т.к. операции прямого ввода/вывода (O_DIRECT) дают лучшую производительность чем синхронные (O_SYNC).

Управление кэшем дисковых устройств в QEMU определяется через параметр cache указываемый при определении дисков:

-drive if=virtio,file=/dev/vg01/kvm302-frontend-root,index=0,media=disk,cache=none