[linux][memory]balloon技术分析

前言: 我大天朝人觉得什么东西含量不够,叫做有“水份”。内存的含量不足,叫“balloon”。作者是外语专业毕业的,感觉不同国度的人虽然语言不同,但是表达出来的东西很相似。有点意思~

代码分析: 代码路径:linux-4.0.4/drivers/virtio/virtio_balloon.c 1,Linux的memory balloon的实现上,MODULE_DESCRIPTION是“Virtio balloon driver”,以及driver注册的逻辑中,都会提到virtio。简单来说,virtio是虚拟化平台上Host和Guest通信的一种机制,本文中不讨论virtio机制,默认Host和Guest通过virtio就可以通信啦。 2,数据结构 linux-4.0.4/include/uapi/linux/virtio_balloon.h qemu/include/standard-headers/linux/virtio_balloon.h 分别在内核态和用户态定义了相同的数据结构virtio_balloon_config:

3,vballoon driver的实现,是kernel的八股文。直接进入正题,virtballoon_probe中会启动一个内核线程vballoon(by:vb->thread = kthread_run(balloon, vb, "vballoon");)。线程可以在Guest中使用ps命令看到。Linux内核线程使用一对方括号括起来,则在Guest中会看到[vballoon]这个线程。

4,核心逻辑balloon

基本逻辑就是: a,等待config发生变化被唤醒。 b,计算到底变化了多少,即计算diff。 c1,diff大于0,则填充balloon,即fill_balloon。 c1,diff小于0,则泄露balloon,即leak_balloon。 综上,balloon的作用就是根据balloon config的变化,动态调整balloon的大小。

5,计算diff

即从driver中获取到最新的balloon大小,和之前保存的大小进行比较。 在Host中,可以使用命令来查看和修改vm的balloon大小: virsh qemu-monitor-command vm-always-geek --hmp "info balloon" virsh qemu-monitor-command vm-always-geek --hmp "balloon 1024" 当修改完成后,qemu会把新的大小刷新到virtio_balloon_config中。然后通知Guest。

6,fill_balloon的实现

向kernel申请diff数量的page。对于每个page:使用balloon_page_enqueue函数,把申请到的page链接到balloon的链表中,并标记page的mapcount和设定private标志。这样可以让page不会被kernel继续使用。同时使用adjust_managed_page_count函数修改系统的内存信息,效果就是在Guest中cat /proc/meminfo看到的MemTotal变小了。 7,leak_balloon的实现

逻辑和fill ballon完全相反,从balloon的list中释放page,归还给kernel。 8,通过fill_balloon&leak_balloon动态申请&释放内存,从而让Guest中的用户进程使用更少/更多的内存。那么问题来了,是不是Guest的用户使用的少了,就能让虚拟机使用的内存下降下来?这里要区分一个概念:对于虚拟机来说,即qemu进程,它使用的虚拟内存(VSS)并不会减少;但是因为虚拟机中的很多page被balloon申请,并且长时间不会被访问到,那么会被Host回收(回收算法就是常说的LRU),则qemu进程的RSS会下降。 所谓“内存复用”,memory balloon也是其中的策略之一。

后记: 如果你使用的虚拟机中有vballoon内核线程,耍点小心眼的话:试着删掉balloon driver吧~

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大学生计算机视觉学习DeepLearning

2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA莫名失败 导入tensorflow失败报错问题解决

原文链接:https://www.cnblogs.com/DOMLX/p/9747019.html

70220
来自专栏源码之家

搞定博看原貌版杂志的下载

65930
来自专栏Eugene's Blog

黑客常用的扫描器盒子分类目录文章标签友情链接联系我们

35390
来自专栏java架构师

关于GET和POST请求

网上看了一篇关于这两种请求的区别,感觉和之前看到的不太一样。 大众版: 1. GET使用URL或Cookie传参。而POST将数据放在BODY中。 2. GET...

34670
来自专栏菩提树下的杨过

老生常谈:利用Membership实现SSO(单点登录)

虽然有一些现成的第三方解决方案比如:OpenID,Passport,SpaceCard等都还不错,但是要么就是收费的(passport),要么就是有点用不习惯(...

22150
来自专栏Janti

记一次线程池调优经历

背景: 最近的一个项目需要用到招标,临时加了给我们的系统增加了一个性能需求,多少呢? 一秒钟300次NTP(不知道ntp的同学可以百度一下),平均3ms一次啊,...

66460
来自专栏Android源码框架分析

Android模拟器识别技术

Android模拟器常常被用来刷单,如何准确的识别模拟器成为App开发中的一个重要模块,目前也有专门的公司提供相应的SDK供开发者识别模拟器。 目前流行的And...

53840
来自专栏企鹅号快讯

NSA 攻击工具再遭利用,Windows、Linux服务器沦为挖矿工具

F5研究员发现了一种新型Apache Struts 漏洞利用。这种恶意行动利用NSA EternalBlue 和 EternalSynergy两种漏洞,运行于多...

33850
来自专栏码洞

如何优雅的关闭Go Channel【译】

不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作。

29240
来自专栏腾讯技术工程官方号的专栏

Ceph 集群整体迁移方案

本文就介绍了一种实现业务不中断的数据迁移方案,并已经在多个生产环境执行。

686120

扫码关注云+社区

领取腾讯云代金券