概述
服务环境
CentOS Linux release 7.9.2009 (Core)
kernel: Linux xxxx 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
内存碎片检查方法
检测linux碎片,这里介绍buddyinfo工具,来进行内存碎片分析。
buddyinfo是linuxbuddy系统管理物理内存的debug信息。在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内存,以2的幂次方的形式,分成11个块链表,分别对应为1、2、4、8、16、32、64、128、256、512、1024个页块。而Linux支持NUMA技术,对于NUMA设备,NUMA系统的结点通常是由一组CPU和本地内存组成,每一个节点都有相应的本地内存,因此buddyinfo 中的Node0表示节点ID;而每一个节点下的内存设备,又可以划分为多个内存区域(zone),因此下面的显示中,对于Node0的内存,又划分类DMA、Normal区域。
而buddyinfo,又可以使用extfrag_index和unusable_index工具进行细致分析。
使用extfrag_index分析内存碎片
extfrag_index文件中显示的数值是除以1000后的结果,当数值越接近1则表示碎片越多,数值越接近-1则表示碎片越少;
第1列>第11列分别标识2^0 * page_size > 2^10 * page_size的可用数量;从左到右看,最右边数字越大,说明内存空间越连续;
# 查看内存页
cat /sys/kernel/debug/extfrag/extfrag_index
显示结果为
Node 0, zone DMA -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
Node 0, zone DMA32 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.996
Node 0, zone Normal -1.000 -1.000 0.748 0.874 0.937 0.969 0.985 0.993 0.996 0.998 0.999
Node 1, zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.983 0.992 0.996 0.998
上述结果中,以Node 0, zone Normal为例,从第三列开始内存被大量使用,意味着大部分4个pagesize的空间开始出现了不连续,存在较多内存碎片。
使用unusable_index分析内存碎片
/sys/kernel/debug/extfrag/unusable_index
的思路和extfrag_index基本一样,只是unusable_index是从内存快的视角分析。这里不进行赘述,如果有需要了解的,请在留言区给我留言,进行补充。
内存碎片清理方法
使用
# 被动清理内存
echo 1 >/proc/sys/vm/compact_memory
!!!此操作只有在内核配置
CONFIG_COMPACTION=y
时有效,具体操作间补充内容
使用drop_caches清理内存(生产慎用)
# 同步内存内容到磁盘(内存和swap使用空间越大,执行时间越长,可忽略)
sync
# 清空所有cache/buffer/memory 1-清空内存页,2-清空slabe,3-清空1+2
echo 3 > /proc/sys/vm/drop_caches
补充内容
除了可以通过上述的方式查看内存碎片外,也可以直接使用cat /proc/buddyinfo
进行查看。
extfrag_index这个要展示出来,需要内核编译了两个选项分别是CONFIG_DEBUG_FS和CONFIG_COMPACTION
内核配置文件位于/boot/config-{内核版本}
,内核版本通过uname -a
查看,完整路径为
/boot/config-`uname -a | awk -F ' ' '{print $3}'`
修改对应的值后,重启服务器后生效。
最后
以上就是眯眯眼冥王星为你收集整理的【小工具】 - linux内存碎片检查和清理的全部内容,希望文章能够帮你解决【小工具】 - linux内存碎片检查和清理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复