关于qemu-kvm cache mode = none 和writeback的研究

xiaoxiao2021-02-28  67

qemu-kvm磁盘读写的缓冲(cache)模式一共有五种,分别是 writethrough, wirteback, none, unsafe, directsync 当你对VM读写磁盘的性能有不同的要求的时候,你可以在其启动的参数(cache=xxxx) 里面进行一个合理的选择.

现在来简单说一说这五种模式的各自的特点

 

cache=writethrough:   该模式对应的标志位是O_DSYNC,仅当数据被提交到了存储设备里面的时候,写操作   才会被完整的通告。此时host的页缓存可以被用在一种被称为writethrough缓存的模式。   guest的虚拟存储设备被告知没有回写缓存(writeback cache),因此guest不需要为了   操纵整块数据而发送刷新缓存的指令了。此时的存储功能如同有一个直写缓存(writethrough cache)一样

 

cache=none:   所对应的标志位是O_DIRECT,在 none 模式下,VM的IO操作直接   在qemu-kvm的userspace缓冲和存储设备之间进行,绕开了host的页缓冲。   这个过程就相当于让vm直接访问了你的host的磁盘,从而性能得到了提升。

 

cache=writeback:   对应的标志位既不是 O_DSYNC 也不是 O_DIRECT ,在writeback模式下,IO操作会经过   host的页缓冲,存放在host页缓冲里的写操作会完整地通知给guest.   除此之外,guest的虚拟存贮适配器会被告知有回写缓存(writeback cache),所以为了能够   整体地管理数据,guest将会发送刷新缓存的指令.类似于带有RAM缓存的磁盘阵列(RAID)管理器.

 

cache=unsafe:   该模式与writeback差不多,不过从guest发出的刷新缓存指令将会被忽视掉,这意味着使用者   将会以牺牲数据的完整性来换取性能的提升。

 

cache=directsync:   该模式所对应的标志位是O_DSYNC和O_DIRECT,仅当数据被提交到了存储设备的时候,写   操作才会被完整地通告,并且可以放心地绕过host的页缓存。   就像writethrough模式,有时候不发送刷新缓存的指令时很有用的.该模式是最新添加的一种cache模式,   使得缓存与直接访问的结合成为了可能.

 

以上是网上都能百度到的

根据qemu-kvm的实际需求:

如果直接使用writeback,当cache占满的时候容易出现卡顿,而且在使用时cache的高速IO瞬间降为磁盘IO速度会造成IO延时的上升,使用者在使用时能明显感受到。所以不能直接使用writeback模式,因此我们需要限制writeback模式IO写入所占用的cache大小,通过dirty_bytes可以控制内核使用的内存缓冲区(脏页)。我们可以设置dirty_bytes = 4M,在io过程中能得到小幅度的提升并迅速回落,这样就减小io延时。

在测试过程中dirty_bytes=1M iops上升,dirty_bytes=2M iops有所下降,dirty_bytes=3M,dirty_bytes=4Miops逐步上升。

与none相比,虽然writeback可以提高iops的上限,但同时会影响到io请求响应时间await,使用writeback后await成几十倍上升,大约是10~20倍。

所以个人观点writeback是用io的请求响应时间来换取iops的提高。

转载请注明原文地址: https://www.6miu.com/read-2620293.html

最新回复(0)