Linux性能优化-关于Linux内存管理
关于linux内存管理
1. free命令
$ free -g
2. Slab介绍
Slab Allocation 是Linux 2.2之后引入的一个内存管理机制,专门用于缓存内核的数据对象,可以理解为一个内核专用的 对象池 ,可以提高系统性能并减少内存碎片。(Linux 2.6.23之后, SLUB 成为了默认的allocator。)
查看Slab缓存
$ cat /proc/meminfo
查看slab相关的数据
Slab: 154212 kB
SReclaimable: 87980 kB
SUnreclaim: 66232 kB
SReclaimable(Linux 2.6.19+)都是clean的缓存,随时可以释放。
SUnreclaim为不可回收的缓存。
查看Slab缓存的具体使用情况
$ cat /proc/slabinfo
$ slabtop
3. 内存回收
要想多清一点缓存,可以在写drop_caches文件之前运行sync指令,将脏数据落盘变成干净的缓存;
$ sync && sync
清理 page cache
$ echo 1 > /proc/sys/vm/drop_caches
释放Slab中clean的缓存(包括inode和dentry的缓存)
$ echo 2 > /proc/sys/vm/drop_caches
清理 page cache、dentries 和 inodes
$ echo 3 > /proc/sys/vm/drop_caches
/proc/meminfo中的”Cached”表示page cache所占用的内存大小;
“Slab”表示内核Slab所占用的内存大小,slab有的可回收有的不可回收,其中可回收的通过”SReclaimable”表示,不可回收的通过”SUnreclaim”表示。
即便仅考虑page cache (对应于 /proc/meminfo 的”Cached”),也并不是所有的页面都可以回收的:
首先,drop_caches只回收clean pages,不回收dirty pages,参见https://www.kernel.org/doc/Documentation/sysctl/vm.txt
所以如果想回收更多的cache,应该在drop_caches之前先执行”sync”命令,把dirty pages变成clean pages。
4. 调整系统vm配置
风险预警: 调整以下系统配置可能会对系统性能造成负面影响,请仔细测试并谨慎操作。
/etc/sysctl.conf里有几个对内存管理影响比较大的配置,以下配置项的文档见 vm.txt 。
vm.vfs_cache_pressure
系统在进行 内存回收 时,会先回收 page cache , inode cache, dentry cache和 swap cache 。vfs_cache_pressure越大,每次回收时,inode cache和dentry cache所占比例越大_[3]_。
vfs_cache_pressure默认是100,值越大inode cache和dentry cache的回收速度会越快,越小则回收越慢,为0的时候完全不回收( OOM !)。
vm.min_free_kbytes
系统的”保留内存”的大小,”保留内存”用于低内存状态下的”atomic memory allocation requests”(eg. kmalloc + GFP_ATOMIC),该参数也被用于计算开始 内存回收 的阀值,默认在开机的时候根据当前的内存计算所得,越大则表示系统会越早开始 内存回收 。
min_free_kbytes过大可能会导致 OOM ,太小可能会导致系统出现死锁等问题。
vm.swappiness
该配置用于控制系统将内存 swap out 到交换空间的积极性,取值范围是[0, 100]。swappiness越大,系统的交换积极性越高,默认是60,如果为0则不会进行交换。
5. 一些案例分析
为什么容器内存占用居高不下,频频 OOM
为什么手工DROP_CACHES之后CACHE值并未减少
Linux内存回收之drop cache
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)