虚拟化一般网络和存储都是难点。下图所示,磁盘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:性能较好,最不安全,只有在虚拟机关机(虚机进程结束),才会执行一次刷盘操作。可用于安装虚机。