Proxmox VE磁盘WriteBack性能调优和注意事项
WriteBack是一个提高虚拟机IO的一种非常有效的参数,
一 WriteBack测试
一块300G的sas磁盘,做成ext4分区,并且挂载到PVE上面。
使用none模式读取
read: IOPS=641, BW=2567KiB/s (2629kB/s)(151MiB/60067msec)
使用none模式写入
IOPS=448, BW=1795KiB/s (1838kB/s)(105MiB/60066msec);
使用Writeback写入
write: IOPS=97.1k, BW=379MiB/s (398MB/s)(22.2GiB/60001msec)
使用Writeback读取
read: IOPS=155k, BW=606MiB/s (635MB/s)(24.0GiB/40559msec)
我们可以看到使用WriteBack时,对硬盘的IO提升巨大!我的图,都已经看不到none模式了。
二 WriteBack原理
现在我们思考一下为什么WriteBack能提升巨大,有什么影响?
我们可以从Performance Tweaks - Proxmox VE看到Proxmox VE对此的相关说明
下面写道,qemu使用主机的页面缓存,作为Cache。
This mode causes qemu-kvm to interact with the disk image file or block device with neither O_DSYNC nor O_DIRECT semantics, so the host page cache is used and writes are reported to the guest as completed when placed in the host page cache, and the normal page cache management will handle commitment to the storage device.
当我们没有进行WriteBack的操作时,我们的内存看起来像这样
root@pve:~# grep -i "^cache\|dirty\|writeback:" /proc/meminfo
Cached: 18570916 kB
Dirty: 868 kB
Writeback: 0 kB
进行WriteBack的操作时,内存看起来像这样:
root@pve:~# grep -i "^cache\|dirty\|writeback:" /proc/meminfo
Cached: 18571092 kB
Dirty: 953668 kB
Writeback: 21960 kB
-
Cached:是用于读取缓存的内存量。
-
Dirty:它表示要写入(即:已更改)的内存量。要回收此内存,系统必须将更改写出到磁盘。这意味着,根据底层IO子系统,脏页面回收可能会很慢。
-
Writeback:它是系统当前写入磁盘的内存量,这是内存负载(和脏页回收)和计时回收(最多30秒后,脏页被写回磁盘)的数据。
这3个参数可以参考:kvm virtualization - How much memory does a qemu disk cache writeback mode use? - Server Fault
我们可以认为,为虚拟机磁盘开启WriteBack时,写操作会先被写入到主机页面缓存中——即写入脏页。当内存负载太高,需要回收内存,那么脏页可能将数据写入硬盘,或者达到了脏页的回收时间,那么也可以将脏页数据写入到硬盘,此时数据才算完整被写入。所以写入和读取都非常的高!
关于脏页参考:脏页_百度百科 (baidu.com)
三 WriteBack调优
3.1 更多的内存容量
使用WriteBack模式时,第一点需要注意的是内存的容量
若脏页无法及时的写入硬盘,则会占用更多的内存,会给主机带来极大的内存负担,长时间的脏页堆积,也会造成大量的IO延迟。
给主机更大的内存容量,可以给提高写入缓存的上限,可以为脏页提供更多的写入硬盘的时间。
3.2 脏页优化
对脏页优化,主要是对下面几个参数调整。此部分 务必请参考Linux 脏数据回刷参数与调优 - 广漠飘羽 - 博客园 (cnblogs.com)
配置文件 | 功能 | 默认值 |
---|---|---|
dirty_background_ratio | 触发回刷的脏数据占可用内存的百分比 | 0 |
dirty_background_bytes | 触发回刷的脏数据量 | 10 |
dirty_bytes | 触发同步写的脏数据量 | 0 |
dirty_ratio | 触发同步写的脏数据占可用内存的百分比 | 20 |
dirty_expire_centisecs | 脏数据超时回刷时间(单位:1/100s) | 3000 |
dirty_writeback_centisecs | 回刷进程定时唤醒时间(单位:1/100s) | 500 |
更多请参考更好的 Linux 磁盘缓存和性能与vm.dirty_ratio (lonesysadmin.net)
3.3 优质的硬件
WriteBack是一个性能和风险并存的技术,我们并不讨论停电带来的风险,正经服务器怎么会停电。
正如上文所说,数据会从脏页写入硬盘,那么硬盘就需要具有稳定的IO读写性能。使用数据中心级硬盘是个好办法。
内存频率也和WriteBack相关。越高的内存频率,性能也就越优。
3.4 高速的Swap
Swap是一个兼顾经济和性能的措施。
Swap可以有效的避免主机内存不足。但是Swap io性能不足,会导致很高的io延迟。
所以一个高速的Swap,可以有效的节约内存。以及兼顾了脏页的速度。
3.5 注意使用场景
虽然WriteBack很优秀,但
WriteBack并不适合与网络存储,如NFS,SAN。
也不适和本身具有内存缓存的后端,如Ceph和ZFS。ZFS本身就有内存作为Arc缓存。
以上2点我没有在网上找到论证,但是通常网络存储,建议直接Cache=none,Write-through。一方面其后端,通常具有缓存,另一方面网络具有网络延迟丢包等因素,建议还是不要开启Writeback,以避免数据不一致。
他很适用于DAS-Jbod或者DAS-RAID场景
作者:佛西
链接:https://foxi.buduanwang.vip/virtualization/pve/2038.html/
文章版权归作者所有,未经允许请勿转载
如需获得支持,请点击网页右上角
ak4700
佛西@ak4700
ak4700
testtt
佛西@testtt
testtt@佛西