前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[linux][memory]balloon技术分析

[linux][memory]balloon技术分析

作者头像
皮振伟
发布2018-04-09 10:56:07
3.1K0
发布2018-04-09 10:56:07
举报
文章被收录于专栏:皮振伟的专栏皮振伟的专栏

前言: 我大天朝人觉得什么东西含量不够,叫做有“水份”。内存的含量不足,叫“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吧~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档