首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

[linux][memory]balloon性能优化的几种方案分析

前言: Memory Balloon作为虚拟化平台上的一个重要内存QoS方案,作者在前文《[linux][memory]balloon技术分析 》中做过原理性的简要分析。 本篇介绍Memory Balloon的两种性能优化方案,进一步提升内存QoS性能。 第一种方案:在guest的balloon中填充page,再通知qemu使用madvise让host主动释放page。 第二种方案:在guest的balloon中填充page的同时,把page置零。提升host的ksm/uksm的合并效率。 分析: 1,pfn array 代码选自linux-4.4.69/drivers/virtio/virtio_balloon.c

fill_balloon的函数中在申请到page之后,会调用set_page_pfns把page的pfn填写到vb->pfns中,vb-pfns是一个数组,就会填写新添加到balloon的page的pfn(page frame number)。 2,tell host 代码选自linux-4.4.69/drivers/virtio/virtio_balloon.c

上一步中已经填写好的pfns,放到virt queue中,然后kick host。那么,就可以在host中通过读virt queue知道对应的pfns。这一步操作,是virtio操作的惯用套路。 3,balllon page Host中从virt queue中读到了对应的pfns之后,把pfn计算出来,转化成为hva,执行下面操作: 代码选自qemu-2.8.1/hw/virtio/virtio-balloon.c

即:通过madvise告诉host执行MADV_DONTNEED。 4,madv dontneed 上一步的madvise,进入到内核态执行linux-4.4.69/mm/madvise.c执行madvise_dontneed:

逻辑判断之后继续执行linux-4.4.69/mm/memory.c中的:

先看注释,再看到unmap_single_vma,可以知道主动执行unmap来达到释放page的目的(这里先假定page是独占的,那么执行unmap就可以直接释放)。 结合1,2,3,4四步来看:从guest的balloon开始fill balloon开始,到virtio通知到host,最后host中主动执行unmap,可以让page及时释放,让host有更多的free page来使用。 5,zero page 在guest中加入到balloon中的page,guest会在一段时间内不会访问到。那么它们很可能会被host的ksm/uksm合并,或者被交换到host的swap分区上。 对比一下ksm和swap: a,下一次读到ksm类型的page可以直接读,没有代价;但是读到swap分区上的page需要被swap进来。 b,下一次写到ksm类型的page只需要申请一个新的page,修改mapping;写到swap分区上的page则需要先swap进来,也需要修改mapping。 可见,明显swap的代价更大,ksm是更优的选择。 因为balloon申请到的page带着随机值(每个page中共有256的4096次方种可能),大多数情况下,是很难被host的ksm/uksm合并。所以balloon申请page的时候,把page置零,则会大大提升host的ksm/uksm的效率。 基于上述的原因,作者给linux mm的maintainer提了patch来解决这个问题:

后记: 对于版本稍低的qemu,可以尝试merge一下madv方案。 对于zero page方案,完完全全是guest os的行为,需要等着下次发行版的release了。 Good Luck~

下一篇
举报
领券