[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~

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2017-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

DIY一个专属HID注入设备吧

*本文原创作者:kincaid,本文属FreeBuf原创奖励计划,未经许可禁止转载

1620
来自专栏Youngxj

SpeedTest lite服务器测试源码分享

7505
来自专栏不二小段

【爬虫军火库】下载保存图片(文件)

今天开始开一个新坑,暂且叫做【爬虫军火库】吧。以前一直想系统地写些东西,最终大都未能成文,想来我不适合发宏愿立长志,还是一步一个脚印地写点零碎的东西。有关爬虫,...

3268
来自专栏JAVA高级架构

分布式之redis复习精讲

1574
来自专栏前端杂货铺

deno深入揭秘及未来展望

node.js之父Ryan Dahl在一个月前发起了名为deno的项目,项目的初衷是打造一个基于v8引擎的安全的TypeScript运行时,同时实现HTML5...

2001
来自专栏令仔很忙

【JVM调优】----内存溢出和内存泄漏

项目的开发,涉及到了服务器的运维,先来介绍下JVM相关的知识,也方便后期的使用。今天主要是说一说内存溢出和内存泄漏两件事。

1271
来自专栏Linyb极客之路

缓存三大问题及解决方案

随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统...

1272
来自专栏Android群英传

跨越平台!SQLite居然在各个平台这样使用

1551
来自专栏ImportSource

并发编程-多线程的好处

上一文:并发编程-并发的简史 如果线程使用得当,多线程可以降低你的开发和维护成本,而且还能改善复杂应用程序的性能。多线程让模仿人类工作方式以及交互变得简单,多线...

3676
来自专栏Linyb极客之路

分布式之redis复习精讲

博主的《分布式之消息队列复习精讲》得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章。但是还是要说明一下,复习精讲的文章偏面试准备,真正在开发过程中...

1763

扫码关注云+社区

领取腾讯云代金券