专栏首页皮振伟的专栏[linux][memory]balloon性能优化的几种方案分析

[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),作者:AlwaysGeek

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux][memory]KSM技术分析

    前言: 先来回顾一下Linux平台上的节约内存的方案: swap:通过LRU淘汰掉掉一部分page,把这些page交换到磁盘上。再次访问到这些page的时候,k...

    皮振伟
  • [linux][memory]ksm/uksm的调优和优化尝试

    前言: 在前文《[linux][memory]KSM技术分析》中,分析了KSM技术的基本实现原理。这里再总结一下使用ksm/uksm遇到的几个问题,并附加上作者...

    皮振伟
  • [Linux][mm]TLB shootdown和读取smaps对性能的影响 ​

    作者遇到了业务的一个性能抖动问题,在这里介绍一下它的原因和解决办法。 分析 1,page fault 在Linux上,进程分配到的内存是虚拟内存,经过内核...

    皮振伟
  • 【JavaWeb基础】客户关系管理系统(修订版)

    要想在下拉框中可以选择很多的数据,那么value的值就不能单单只有一个。当然了,也不可能在JSP页面中写下面的代码

    Java3y
  • Django-pure-pagination的使用

    Django自带有分页的两个类,但是用起来没有第三方这个分页模块方便,下面介绍一下django-pure-pagination使用方法。该库基于django.c...

    菲宇
  • django-分页

    from django.core.paginator import Paginator

    小小咸鱼YwY
  • Innodb_buffer_pool_read_requests探究之路

    Innodb_buffer_pool_read_requests,可以用来计算innodb命中率。但是这个值具体代表什么呢?

    老叶茶馆
  • iOS内存管理-深入解析自动释放池

    iOS开发中的Autorelease机制是为了延时释放对象。自动释放的概念看上去很像ARC,但实际上这更类似于C语言中自动变量的特性。

    梧雨北辰
  • 同样是消息中间件,Kafka吞吐量为何如此优秀。

    Apache Kafka基准测试:每秒写入2百万(在三台廉价机器上),网上也有很多Kafka的测试文章,测试结果通常都是“吊打”其他MQ。是不是吹牛逼你是否怀疑...

    王炸
  • 【编程经验】变量的存储类型

    在 C 语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、 变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,...

    编程范 源代码公司

扫码关注云+社区

领取腾讯云代金券