内存碎片是指系统内存被分割成许多小块而无法满足较大内存请求的情况,分为: - 外部碎片:内存块之间的小块空闲内存 - 内部碎片:分配的内存块内部未被使用的部分
/proc/buddyinfo
cat /proc/buddyinfo
显示不同阶(2^n页)的空闲内存块数量,数值越小表示碎片越严重
vmstat
vmstat -s
查看内存统计信息
slabtop
slabtop
查看内核slab分配器使用情况
/proc/meminfo
cat /proc/meminfo | grep -E 'MemFree|MemAvailable'
查看可用内存情况
# 增加内存回收阈值
echo 100 > /proc/sys/vm/min_free_kbytes
# 调整内存回收积极性
echo 10 > /proc/sys/vm/swappiness
# 调整透明大页(THP)设置
echo "madvise" > /sys/kernel/mm/transparent_hugepage/enabled
# 手动触发内存回收
echo 1 > /proc/sys/vm/drop_caches # 释放页缓存
echo 2 > /proc/sys/vm/drop_caches # 释放dentries和inodes
echo 3 > /proc/sys/vm/drop_caches # 释放所有缓存
# 创建清理脚本
echo '#!/bin/sh
sync; echo 1 > /proc/sys/vm/drop_caches' > /usr/local/bin/clearcache
chmod +x /usr/local/bin/clearcache
# 添加到cron
(crontab -l ; echo "0 3 * * * /usr/local/bin/clearcache") | crontab -
# 创建cgroup
cgcreate -g memory:myapp_group
# 设置内存限制
cgset -r memory.limit_in_bytes=2G myapp_group
# 将进程加入cgroup
cgclassify -g memory:myapp_group <pid>
通过以上方法的组合使用,可以有效缓解和预防Linux系统中的内存碎片问题。