原文在这里:

http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaatbpkvmguestcache.htm

kvm中host和guest可以各自维护自己的缓存,这导致内存中可以有两份缓存数据。这里说的host上的缓存是页缓存,guest上的缓存则是说guest机上的disk write cache。一般至少要保留这两种缓存的其中一种。在linux上,不通过页缓存进行读写使用O_DIRECT标识(buffer io vs direct io)。页缓存通过fsync将改动写入硬盘,大小是剩余可用物理内存,大小差别这么大。按照文章的描述,我感觉这里的disk write cache应该是一个块缓存,并非硬盘自带缓存。

RHEL6上,kvm/qemu支持以下缓存模式:

1.writethrough:默认缓存模式

page cache enable,

disk write cache disabled.重复读的性能可以,但是写入的性能可能会受影响。原文说:数据完整性有保障,不理解为何。

2.writeback

both enabled,尽管性能比较有保障,但是仍然怕突然断电,所以只能做临时方案,不推荐。

3.none

host cache disabled,guest cache enabled.这意味着对磁盘映像文件的访问是direct io,性能很好。如果虚拟机的disk write cache不怕停电(难道能搞得真想硬盘自带的缓存?),或者guest机有序地存储数据(fsync,或者文件系统级别上),数据完整性就有保障了。但是由于host上的page cache被关闭,重复读性能会下降(不过想想,guest上的系统应该也有page cache,其中的程序也会考虑缓存,这样应该不会有大问题)。

4.unsafe

不安全,安装guest机性能好,不能用于生产,具体这个策略怎么工作,原文没有言明。

本地硬盘推荐使用writethrough,因为性能可以接受,数据完整性有保证。NFS推荐用none,因为在nfs上O_DIRECT比O_SYNC快。

PS:感觉水有点深,不能完全理解,只能记下结论。原文中有提到stroage stack,可以搜到ppt:the kvm/qemu storage stack

http://www.linuxfoundation.jp/jp_uploads/JLS2009/jls09_hellwig.pdf

KVM几种缓存模式的更多相关文章

  1. 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache

    开篇介绍 先简单的演示一下使用 Lookup 组件实现一个简单示例 - 从数据源表 A 中导出数据到目标数据表 B,如果 A 数据在 B 中不存在就插入新数据到B,如果存在就更新B 和 A 表数据保持 ...

  2. django 三种缓存模式的使用及注意点

    Django 缓存模式的使用(主要针对RestFul设计模式的项目) 有三种模式: 全站使用缓存模式(整个项目每个接口都会使用缓存,缺点:所以接口都无法实时性获取数据) 单独视图缓存模式(单个接口使用 ...

  3. localforage 对不同浏览器 使用不同的缓存策略 , 大大提高了性能 ,IndexedDB,WebSQL 和 localStorage 三种存储模式

    支持回调的异步 API: 支持 IndexedDB,WebSQL 和 localStorage 三种存储模式(自动为你加载最佳的驱动程序): 支持 BLOB 和任意类型的数据,让您可以存储图片,文件等 ...

  4. SQLite剖析之异步IO模式、共享缓存模式和解锁通知

    1.异步I/O模式    通常,当SQLite写一个数据库文件时,会等待,直到写操作完成,然后控制返回到调用程序.相比于CPU操作,写文件系统是非常耗时的,这是一个性能瓶颈.异步I/O后端是SQLit ...

  5. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解.[size=1.8em]Handler+Runna ...

  6. ThinkPHP的四种URL模式 URL_MODEL

    ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式.PATHINFO.REWRITE和兼容模式. 普通模式 设置URL_MODEL 为0 采用传统的URL参数模 ...

  7. 【转】Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    http://www.cnblogs.com/wanqieddy/archive/2013/09/06/3305482.html android线程池的理解,晚上在家无事 预习了一下android异步 ...

  8. 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  9. CacheConcurrencyStrategy五种缓存方式

    CacheConcurrencyStrategy有五种缓存方式:  CacheConcurrencyStrategy.NONE,不适用,默认  CacheConcurrencyStrategy.REA ...

随机推荐

  1. 一位ACM过来人的心得

    刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解. 很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我 ...

  2. Lock锁_线程_线程域

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. 使用<a>标签,链接到另一个页面

    使用<a>标签可实现超链接,它在网页制作中可以说是无处不在,只要有链接的地方,就会有这个标签. 语法: <a href="目标网址" title="鼠标 ...

  4. Google Calendar(日历)设置农历生日提醒

    Generate birthday dates base on lunar birthdays for google calendar import Can be used for notifying ...

  5. ExtJS智能提示工具spket安装与破解

    用myeclipse写java程序,最怕的是什么呢,写javascript代码,原因很简单,没有智能提示,ExtJS是完全js代码的界面库,写起来就更痛苦了,幸好有人做了spket插件,此文采用傻瓜式 ...

  6. 144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)

    题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: class Solution { pu ...

  7. Phalcon 的 bootstrap.php 自动加载完成;非常人性化的设计

    <?php /** * Bootstraps the application */ use Phalcon\DI\FactoryDefault as PhDi, Phalcon\Config a ...

  8. jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  10. HDU-2054 A==B?

    #include<stdio.h>#include<string.h>char n[100000], m[100000];int main(){ int i, j, len_n ...