假设您有一个运行多个 KVM 客户机的基本服务器。现在关于磁盘 I/O 缓存,似乎基本服务器会将 I/O 缓存在其内存中,但客户机是否也会将相同的 I/O 缓存在其内存池中?如果是这样,如果磁盘内容被缓存两次,这不会浪费内存吗?如果是这种情况,那么调整此行为的好方法是什么(即,要么缓存来自基本服务器的所有内容,要么不缓存来自基本服务器的任何内容,只缓存来自客户机的内容)?我能想到的唯一方法是为客户机分配比通常更少的内存,将客户机中的 swappiness 参数设置为 0(这样进程内存就不会被交换出去以支持磁盘缓存),这样客户机中就没有多余的内存可用于缓存。然后,这将强制所有缓存在基本服务器中进行。或者,这是一个由 KVM 以某种方式自动解决的问题?
答案1
是的,客户机将使用其内存进行磁盘缓存。就像非虚拟系统一样。
虚拟机管理程序上可能发生的缓存取决于您为客户机使用的磁盘接口类型以及您选择的缓存策略类型。但无论您的选择是什么,虚拟机管理程序上的缓存都只会针对客户机愿意提交到其虚拟驱动器的数据,而不会针对缓存的数据。
答案2
这就是为什么有额外的调整可用。对于 KVM 客户机,建议至少noop
在客户机和deadline
主机上使用。客户机中的截止日期有时可以产生更好的结果,具体取决于 IO 模式。
还有额外的调整可用(dataplane、vhost-blk 等),每种调整都有自己的优点和局限性。
虽然老旧,但仍然有用: http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaatbpstorage.htm