虚拟化一般网络和存储都是难点。下图所示,磁盘I/O从虚拟机到宿主物理机存储的过程。

其中虚拟机镜像并不是必须的。并不一定要给虚拟机创建虚拟磁盘文件。我们可以通过逻辑映射,将SAN的块设备指定给虚拟机使用。这里我们暂讨论宿主机模拟磁盘的场景。

                               

如上图,缓存模式作用在虚拟化层和宿主机文件系统或块设备之间。

性能:none>unsafe>writeback>writeththrough

数据一致性:writethrough>none>writeback>unsafe

directsync类似于writethrough,属于新增缓存模式,性能应该略强于writethrough,一致性很高。

 

缓存方式

标志位

性能

安全性

磁盘缓存属性是作用在镜像文件或块设备上的

不指定,默认

 

 

 

qemu-kvm <1.2版本

qemu-kvm >1.2版本

宿主机:CentOS

qemu-kvm >1.2版本

&IDE\SCSI\Virtio

writethrough

writeback

none

writethrough

writethrough/透写

O_DSYNC

读较快

写超慢

不使用任何缓存,直接操作磁盘写,只有数据被写入磁盘才会返回成功。虽然保持了数据一致性,但是因为磁盘的写入速度很慢,所以该模式下写速度很慢,但是读速度较高。无需刷盘。

writeback/回写

 

读写快

将数据写入宿主机页面缓存则返回写成功。页面缓存再合并数据写磁盘。虚机磁盘控制器也知道使用了back cache,所以为了保持数据一致性(虚机侧数据新,磁盘侧数据旧),在需要的时候,虚机会发送刷盘(将缓存里的数据强制持久化到磁盘。)指令。

none

O_DIRECT

随机读写快

顺序读写慢

绕过宿主机页面缓存(OS Cache),而是在qemu-kvm用户空间直接访问宿主机磁盘。这个过程就相当于让vm直接访问了你的host的磁盘,从而性能得到了提升。数据被放入宿主机磁盘写队列则返回成功。需要时刷盘。

unsafe

 

读写快

同writeback,但是unsafe忽略所有的刷盘指令。无刷盘。

directsync

O_DSYNC

O_DIRECT

读写快

应该属于writethrough和none方式的结合。无需刷盘。

 

注释:

O_DIRECT - 绕过缓冲区高速缓存 - 直接IO:Linux允许应用程序在执行磁盘IO时绕过缓冲区高速缓存,从用户空间直接将数据传递到文件或磁盘设备,称为直接IO(direct IO)或者裸IO(raw IO)

应用场景:

none:支持在线迁移,主要应用于虚拟化集群。

writeback:性能较好,不太安全(取决于刷盘周期,刷盘周期跟fs配置相关,ext4默认5秒刷一次,可以在guest fs中配置刷盘周期),可用户测试环境。

wirthrough:性能差,安全性高,可用于单机虚拟化场景。

unsafe:性能较好,最不安全,只有在虚拟机关机(虚机进程结束),才会执行一次刷盘操作。可用于安装虚机。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐