====== Кэширование в 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// указываемый при определении дисков: | -drive if=virtio,file=/dev/vg01/kvm302-frontend-root,index=0,media=disk,cache=none