linux针对每一个node的每个zone的每个order,都有一个碎片指数来描述当前的碎片程度,也就是

extfrag_index 参数:
extfrag_index这个要展示出来,需要内核编译了两个选项,即:

#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION)
否则不会生成这个文件。
[root@localhost ~]#    grep CONFIG_DEBUG_FS /boot/config-3.10.0-693.5.2.el7.x86_64
CONFIG_DEBUG_FS=y
[root@localhost ~]# grep CONFIG_COMPACTION /boot/config-3.10.0-693.5.2.el7.x86_64
CONFIG_COMPACTION=y

如果确定已经编译进入内核,但是也看不到/sys/kernel/debug/下的数据,那说明没有挂载,或者挂载的路径不是/sys/kernel/debug/,如果没有挂载则需要挂载一下:

mount -t debugfs none  /sys/kernel/debug

然后,在linux里面展示如下:

[root@localhost ~]# cat /sys/kernel/debug/extfrag/extfrag_index
Node , 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 , zone DMA32 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.995 0.998
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.988 0.994 0.997

那这些数据怎么理解呢?

我们先来看一下打印这些数据的函数:

static void extfrag_show_print(struct seq_file *m,
pg_data_t *pgdat, struct zone *zone)
{
unsigned int order;
int index; /* Alloc on stack as interrupts are disabled for zone walk */
struct contig_page_info info; seq_printf(m, "Node %d, zone %8s ",
pgdat->node_id,
zone->name);
for (order = ; order < MAX_ORDER; ++order) {
fill_contig_page_info(zone, order, &info);
index = __fragmentation_index(order, &info);
seq_printf(m, "%d.%03d ", index / , index % );------------可以看出,"."前面是__fragmentation_index返回值的除数,后面是余数
}
seq_putc(m, '\n');
}

如下就是计算碎片指数的函数:

static int __fragmentation_index(unsigned int order, struct contig_page_info *info)
{
unsigned long requested = 1UL << order; if (!info->free_blocks_total)------------没有内存,返回0,都没有内存,谈何碎片
return 0; /* Fragmentation index only makes sense when a request would fail */
if (info->free_blocks_suitable)------------返回-1000,也就是展示的是-1.000,那么这个时候没有意义,因为内存充足,不关心碎片指数,碎片指数只在申请内存失败的时候有意义
return -1000; /*
* Index is between 0 and 1 so return within 3 decimal places
*
* 0 => allocation would fail due to lack of memory
* 1 => allocation would fail due to fragmentation
*/
return 1000 - div_u64( (1000+(div_u64(info->free_pages * 1000ULL, requested))), info->free_blocks_total);
}

可以看出,越靠近1000,则碎片越严重,很容易分配失败。-1000表示内存充足,不需要关心碎片指数。为0代表压根就没free内存了,也不需要关心碎片指数。这两个极端都不需要考虑。

我们来看具体的数据:

[root@localhost ~]# cat /proc/buddyinfo
Node , zone DMA
Node , zone DMA32
Node , zone Normal
Node , zone Normal
[root@localhost ~]# cat /sys/kernel/debug/extfrag/extfrag_index
Node , 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 , zone DMA32 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.995 0.998
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.988 0.994 0.997

然后迁移合并一下内存:

[root@localhost ~]# echo  >/proc/sys/vm/compact_memory
[root@localhost ~]# cat /proc/buddyinfo
Node , zone DMA
Node , zone DMA32
Node , zone Normal
Node , zone Normal
[root@localhost ~]# cat /sys/kernel/debug/extfrag/extfrag_index
Node , 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 , zone DMA32 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000
Node , zone Normal -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 -1.000 0.993
总的来看,当有最后一个大页的内存的时候,即4k*2的10次方,也就是4M的连续页面的时候,问题都不大,因为可以拆分页面。

所以如果需要脚本判断当前系统的碎片程度,可以看最后4列的值,如果都为-1.000,没问题,否则多少存在碎片,如果值越大,则越碎。

可以通过配置cat /proc/sys/vm/extfrag_threshold来缓解碎片的问题。这个值默认是500.
如果超过了extfrag_threshold这个值, kswapd就会触发memory compaction . 所以, 这个值设置接近1000, 说明系统在内存碎片的处理倾向于把旧的页换出, 以符合申请的需要; 而设置接近0, 表示系统在内存碎片的处理倾向于做memory compaction,迁移合并及时的话,就可以缓解碎片。但迁移合并是耗性能的,所以可以将其配置为200左右。

关于linux 内存碎片指数的更多相关文章

  1. linux内存碎片防治技术

    Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这 ...

  2. linux内存碎片的概念

    一般在内核术语中的“碎片”都是基于物理内存而言的,我没有太看懂你得出碎片是针对地址空间这个结论的逻辑.但我认为,既然你知道了malloc是用户空间调用的,那么你所谓的碎片也是从用户空间的视角而言的,但 ...

  3. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  4. linux kernel内存碎片防治技术

    Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这 ...

  5. linux socket高性能服务器处理框架

    这个博客很多东西 http://blog.csdn.net/luozhonghua2014/article/details/37041765   思考一种高性能的服务器处理框架 1.首先需要一个内存池 ...

  6. 嵌入式Linux C笔试题积累(转)

    http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...

  7. linux内存基础知识和相关调优方案

    内存是计算机中重要的部件之中的一个.它是与CPU进行沟通的桥梁. 计算机中全部程序的执行都是在内存中进行的.因此内存的性能对计算机的影响很大.内存作用是用于临时存放CPU中的运算数据,以及与硬盘等外部 ...

  8. 伙伴系统之伙伴系统概述--Linux内存管理(十五)

    在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, ...

  9. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?

    作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

随机推荐

  1. vue todolist待办事项完整

    <template> <div id="app"> <input type="text" v-model='todo' @keyd ...

  2. 2012 - AD GC全局编录服务器(Global Catalog)

    普通域控制器只记录本域对象的信息,而GC全局编录服务器则不仅记录本域所有对象的只读信息,还记录林中所有其他域中部分域对象的只读信息.   GC全局编录服务器作用: 1,存储对象信息副本,提高搜索性能: ...

  3. Redis进阶实践之十四 Redis-cli命令行工具使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html 一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redi ...

  4. MySQL5.7修改默认密码、随机密码

    mysql5.7以后默认生成随机密码,修改root用户密码 1.修改配置参数Linux: /etc/my.cnf Windows:  C:\ProgramData\MySQL\MySQL Server ...

  5. remmina从linux远程桌面连接windows失败解决方法

    删除如下文件,重新连接 rm ~/.freerdp/known_hosts

  6. 分享微信开发Html5轻游戏中的几个坑

    这段时间团队一直在做微信端的一些产品设计和开发,当然也包含一定的运营工作.做过的东西也不少,微名片.微抢票.微活动.微招聘等一些小case. 今天想说的是我们在微信中被玩的最活跃的轻游戏--微刮奖,这 ...

  7. 各种波形文件VCD,VPD,SHM,FSDB生成的方法

    转载---http://www.cnblogs.com/zeushuang/archive/2012/11/14/2769640.html 仿真是IC设计不可或缺的重要步骤,仿真后一般需要记录下波形文 ...

  8. JMeter性能(压力)测试--使用解锁

    1. 首先去官网下载JMeter:  http://jmeter.apache.org/download_jmeter.cgi 2. 解压缩后到目录 \apache-jmeter-5.0\bin 下找 ...

  9. Docker使用札记 - Dockerfile指令

    ARG ARG跟ENV都可以定义变量,不同在于ARG在构建期结束时是销毁,而ENV定义的是系统中的环境变量,不会在构建结束时销毁,在以后的构建中直接使用. 当ARG和ENV定义相同名称的变量时,ENV ...

  10. 2014年第五届蓝桥杯JavaB组省赛试题解析

    题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 ...