虚拟机磁盘缓存策略是个非常有趣的话题,很多人都探讨过,也是我琢磨了很久想写但没敢写的话题。因为实在有趣,所以一直想写,但因为过于复杂,一直都没敢写。只好题目里加上漫谈二字,随便聊聊,如有错误,欢迎批评指正。

很多刚接触Proxmox VE的同学都会问以下几个问题:

1、Proxmox VE性能好吗?

2、Proxmox VE下虚拟机的磁盘驱动应该用哪个?

3、Proxmox VE下虚拟机磁盘性能怎么提高呢?

其实虚拟机技术的优势有很多,包括但不限于:提高硬件设备利用率,减少能源消耗,节约运行成本,降低运维难度,提高连续运行能力,延续老旧系统寿命等等等等....

但性能偏偏就是虚拟机技术的一个劣势。当然,随着intel vt-x等技术的成熟,加上各种半虚拟化驱动之类的技术,虚拟机性能相对物理服务器的损耗已经进入可以接受的范围,不再是考虑的重点。但,讲真,如果真的很看重性能,某个系统需要物理服务器的所有资源,那还是考虑直接跑在物理服务器上吧。

在我刚开始接触Proxmox时,也着实花过一段时间琢磨怎么提高虚拟机的磁盘性能,看过不少资料....最后的结论是:基本都是瞎折腾。

因为,脱离实际应用需求场景的性能优化,都是臭不要脸耍流氓~~~~

先说俺在Proxmox VE里虚拟磁盘配置上的选择:磁盘类型选IDE,追求最佳的操作系统兼容性和稳定性;磁盘缓存策略选write through,尽量提高读性能,同时确保数据完整性。

曾经有同学提议磁盘类型选virtio,缓存策略选no cache,理由是这样性能更好,同时更能保证数据完整性。

但由于virtio在windows server 2000/2003上糟糕透顶的兼容性和稳定性(很容易蓝屏),加上繁琐的安装部署,以及给虚拟机克隆带来的一系列问题,引入virtio驱动并不是一个很好的选择。毕竟,兼容性和稳定性是要优先于性能的。

至于no cache的选择,我觉得似乎是把孩子和洗澡水一起倒掉了。write through的cache策略只针对读操作进行缓存,理论上并不会对数据完整性产生不良影响。

关于虚拟机磁盘缓存策略,首先推荐一篇文章,感兴趣的同学可以去读一下。

http://www.ilsistemista.net/index.php/virtualization/23-kvm-storage-performance-and-cache-settings-on-red-hat-enterprise-linux-62.html?start=2

这里摘取上文中的一幅图片,以便理解虚拟机的缓存策略选择的影响。

从上图可以看到,在虚拟机环境里,实际上存在三个缓存:虚拟机操作系统缓存(Guest OS Pagecache)、Proxmox VE主机页缓存(Host OS Pagecache)、磁盘设备缓存(Physical Disk cache)。 Proxmox VE提供的虚拟磁盘缓存策略影响的实际上是Proxmox VE主机页缓存。

在write through策略下,Proxmox VE主机页缓存只提供虚拟机读操作缓存,虚拟机发出的写操作指令将直接同步到磁盘设备后才返回,即使系统掉电,也不会丢失缓存数据。

在write back策略下,Proxmox VE主机页缓存同时为虚拟机提供读缓存和写缓存,虚拟机发出的写操作指令,只要写到Proxmox VE主机页缓存即返回,如果系统掉电,Proxmox VE主机页缓存中数据将会丢失。

在no cache策略下,Proxmox VE主机页缓存将被关闭,磁盘设备缓存将为虚拟机提供读缓存和写缓存,虚拟机发出的写操作指令,只要写到磁盘设备缓存后即返回,但如果系统掉电,磁盘设备缓存还是可能丢失数据(当然,如果该磁盘是配置有非易失缓存器件的高级货色,就另当别论了)。

实际生产环境中,绝大部分系统都属于读多写少的应用类型。采用write through策略能够大大提高大部分磁盘读操作性能,对于剩余的那一小部分写操作,就随它去吧,即便是使用write back策略优化,估计也很难对整体性能有很大改善,反而引入了数据丢失的风险。如果真的遇到写负载很重的虚拟机应用,考虑单独为其配置使用virtio驱动+no cache策略也不晚。

总之,write through策略充分利用Proxmox VE主机的内存,能够大大提高虚拟机读操作性能,加之Proxmox VE主机页缓存有容量大、距离近、安全性高、对虚拟机透明等诸多优势,属于不用白不用的性能优化手段。与其在虚拟机上费劲吧唧装virtio驱动提高百分之二三十性能,还不如设置一个write through磁盘缓存,很可能立杆见影就有几倍的性能提升,一不会引入掉电丢数据的风险,二不会影响虚拟机的稳定性和兼容性,只是多消耗一些主机内存而已,可谓少有的一本万利的买卖。还不赶紧试试看?