首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
混部之殇-论云原生资源隔离技术之CPU隔离(一)
2
腾讯TencentOS 十年云原生的迭代演进之路
5
一次内核hung task分析
7
NFSv4客户端hung住的BUG,您解决了吗?
8
nfs不同版本的挂载与解析
9
(好文重发)朴英敏:用crash工具分析Linux内核死锁的一次实战
10
内核问题解决方法记录
11
blocked for more than 120 seconds
12
记一次Linux主机内存脏数据引发的NameNode故障
13
​[linux][memory]cgroup回收内存对虚拟机的影响分析
14
docker cgroup 技术之memory(首篇)
15
[linux][memory] 内存回收
16
Linux内核理解 Memory barrier(内存屏障)
17
Linux内核27-优化和内存屏障
18
谢宝友:深入理解 Linux RCU 从硬件说起之内存屏障
19
谢宝友:深入理解 RCU 之概念
20
聊聊 Linux 上软件实现的“交换机” - Bridge!
21
谈谈 Linux 假死现象
22
宋宝华: 数据库为什么有可能喜欢Linux AIO(异步I/O)?
23
深入理解Linux内核之脏页跟踪
24
Iowait的成因、对系统影响及对策
25
打通IO栈:一次编译服务器性能优化实战
26
浅谈Linux dirty data配置
27
write文件一个字节后何时发起写磁盘IO?
28
深入理解 Linux的 I/O 系统
29
深入理解Linux 的Page Cache
30
深入理解Linux文件系统之文件系统挂载(上)
31
深入理解Linux文件系统之文件系统挂载(下)
32
【线上故障】通过系统日志分析和定位
33
实战案例分享:根据 JVM crash 日志定位和分析问题
34
Linux系统安全 | Linux日志分析和管理
35
如何快速处理线上故障
36
面试-线上故障如何排查
37
Linux内核Crash分析
38
内核timer crash debug思路
39
一次解决Linux内核内存泄漏实战全过程
40
Linux Kernel模块内存泄露的一种查找思路
41
linux系统奔溃之vmcore:kdump 的亲密战友 crash
42
crash浅析tasklist_lock与进程释放
43
Linux OOM机制分析
44
cgroup oom引发Pod重建问题分析
45
workqueue相关数据结构在内核crash分析中的实战应用
46
Linux设备驱动workqueue(工作队列)案例实现
47
Linux内核中的软中断、tasklet和工作队列具体解释
48
扒开 Linux 中断的底裤之 workqueue
49
Linux系统驱动之GIC驱动程序对中断的处理流程
50
Linux系统驱动之链式中断控制器驱动程序编写

​[linux][memory]cgroup回收内存对虚拟机的影响分析

前言: 在虚拟化场景下,libvirt会为每个qemu进程,也就是一台虚拟机,创建对应的cgroup,用来限制这台虚拟机的资源使用。这章讨论一下cgroup对内存的限制、回收能力对虚拟机的影响。 Centos7使用Linux 3.10。Ubuntu1604使用Linux 4.4。这章主要分析这两个版本的kernel的能力对比。 分析: 1,使用场景 在内存复用的场景下,会使用到cgroup的内存限制能力。举例来说,Host上有内存32G,每台Guest分配4G,那么可以启动8台Guest。如果内存超分配25%,那么大约有40G内存,则可以创建10台Guest。每台Guest的物理内存用cgroup现在3.2G左右。当Guest使用的内存超过3.2G的时候,这台Guest之前使用的不活跃的内存会被swap,或者有一部分内存被KSM/UKSM合并掉。实际上,在复用比例不是很高的情况下,性能几乎没太多影响。当然,极端情况下,就会看到系统抖动了,影响就会比较大了。 那么,内存复用的结果就是降低了物理硬件成本。 2,memory.limit_in_bytes 找到对应的Guest的cgroup。例如/sys/fs/cgroup/memory/machine/qemu-3-ubuntu.libvirt-qemu/memory.limit_in_bytes。 这个数值就是限制Guest的物理内存的最大使用量的。 对于增加这个数值的情况,那么只需要改大就行了。 对于减少这个数值的情况,在linux 3.10和4.4上就有了不同的逻辑。 3,linux 3.10 linux-3.10/mm/memcontrol.c中,mem_cgroup_resize_limit函数:

res_counter_set_limit的返回值决定了是否可以正确执行,继续分析res_counter_set_limit函数: 如果当前的使用量大于limit,那么就会返回-EBUSY。 没错,如果在修改limit_in_bytes的时候,返回了-EBUSY,那么就是这个地方的逻辑没有走通导致的! 4,linux 4.4 linux-4.4/mm/memcontrol.c中,mem_cgroup_resize_limit函数:

改小limit的逻辑中,会尽量尝试回收内存。当然,是有retry的次数限制的。 return前的语句也是重点,回收失败就意味着OOM了~ 5,cgroup reclaiming VS kswapd reclaiming 总体来看,Linux也是在进步的。在虚拟化这种场景下,使用cgroup reclaiming明显更好一些。 如果想减小Guest的cgroup限制,在Linux 3.10上需要做很复杂的工作。有一种简单的方案就是:想办法让Guest中的很多page变的不活跃,就会在kswapd回收的时候回收掉,就会降低当前的cgroup的物理内存使用量,那么赶紧把limit_in_bytes改小,一点一点的往复修改到预期的值。那么如何让Guest中的部分page变的不活跃呢?答案是memory balloon。使用memory balloon,让Guest OS来shrink自己的内存使用量,Guest OS长时间不使用的那些page(对应的就是qemu进程很长时间都没有访问一部分page),就会被kswapd回收。前提是Guest OS支持memory balloon,并且为Guest配置了memory balloon设备。 后记: 我讲的意思,不是我要钦点cgroup,你问我支持不支持?我说支持,我就明确告诉你,你们呀,我感觉你们用户态程序也要学习,你们非常熟悉修limit_in_bytes一套的,你们毕竟是Too Young,明白这意思吗?

下一篇
举报
领券