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 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 -1.000
Node 0, 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 1, 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 = 0; order < MAX_ORDER; ++order) {fill_contig_page_info(zone, order, &info);index = __fragmentation_index(order, &info);seq_printf(m, "%d.%03d ", index / 1000, index % 1000);------------可以看出,"."前面是__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 0, zone      DMA      0      1      1      1      1      1      1      0      1      1      3
Node 0, zone    DMA32    187    276    194    232    133     43      7      6      2      2    178
Node 0, zone   Normal 108231  75779  17645   6950   3437   1991   1100    297      1      0      0
Node 1, zone   Normal  77511  40265   9424   7355   4124   2210    950      2      0      0      0
[root@localhost ~]# 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 -1.000
Node 0, 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 1, 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 1 >/proc/sys/vm/compact_memory
[root@localhost ~]# cat /proc/buddyinfo
Node 0, zone      DMA      0      1      1      1      1      1      1      0      1      1      3
Node 0, zone    DMA32    563    489    286    211    100     39      7      6      2      1    178
Node 0, zone   Normal  19109   8235   5752   6181   3805   2486   1572    704    266    127     42
Node 1, zone   Normal  22730  11342   7692   8589   5944   3296   1300     93     26      5      0
[root@localhost ~]# 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 -1.000
Node 0, 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 1, 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左右。

转载于:https://www.cnblogs.com/10087622blog/p/8543792.html

关于linux 内存碎片指数相关推荐

  1. 图文深度解析Linux内存碎片整理实现机制以及源码

    图文深度解析Linux内存碎片整理实现机制以及源码. 物理内存是以页为单位进行管理的,每个内存页大小默认是4K(大页除外).申请物理内存时,一般都是按顺序分配的,但释放内存的行为是随机的.随着系统运行 ...

  2. Linux内存碎片化

    Linux内存碎片化主要由于内存的分配和释放不均匀导致,会降低内存利用效率.可以通过以下方法对Linux内存进行碎片整理: 执行sync命令:该命令会强制将内存中的脏数据写回磁盘,释放内存.这可以腾出 ...

  3. 一篇图解Linux内存碎片整理

    我们知道物理内存是以页为单位进行管理的,每个内存页大小默认是4K(大页除外).申请物理内存时,一般都是按顺序分配的,但释放内存的行为是随机的.随着系统运行时间变长后,将会出现以下情况: 要解决这个问题 ...

  4. linux内存碎片malloc,linux_ptmalloc下malloc()的过程:有 ptmalloc 源码

    文章描述 本文将尽量详细地给出 ptmalloc 下调用 malloc() 进行内存分配的实现过程 __libc_malloc() 和 _int_malloc() 实际上,在glibc中没有 mall ...

  5. 使用 /sys 文件系统访问 Linux 内核

    使用 /sys 文件系统访问 Linux 内核 sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径: 2.6内核要求 sysfs 总是挂载在 /sys 目录上: sysfs ...

  6. [内核内存] [arm64] 内存规整1---memory-compaction详解

    文章目录 1.memory-compaction简介 2.memory-compaction调用流程 3.memory-compaction源码分析 3.1内存规整关键数据结构 3.2struct z ...

  7. 我们为什么要禁用 THP

    前言 我们之前在生产环境上遇到过很多起由操作系统的某些特征引起的性能抖动案例,其中 THP 作案次数较多,因此本文将和大家分享 THP 引起性能抖动的原因.典型的现象,分析方法等,在文章的最后给出使用 ...

  8. 十一在家都逛哪些技术网站?(程序员必备58个网站汇总)

    来源|cnblogs.com/three-fighter/p/13641835.html 整理来自:CodeSheep 众所周知,程序员是一个需要不断学习的职业,而幸运的是,在这个互联网时代,知识就在 ...

  9. 交公粮了:国庆在家我都逛哪些技术网站?

    来源|cnblogs.com/three-fighter/p/13641835.html 在这个互联网时代,知识就在那里,等着我们去获取. 作为一个 收藏从未停止,学习从未开始 的博主 :(doge, ...

最新文章

  1. getGeneratedKeys自动获取主键的方法
  2. 【转蝈蝈俊.net 】SQL Server 2005 配置发送邮件
  3. linux 下 c++ clock 函数理解
  4. WinPcap笔记(3):获取已安装设备的详细信息
  5. 前端学习(3304):函数组件组件父组件子组件forwarRef聚焦
  6. 蓝牙鼠标windows linux,Ubuntu下使用蓝牙无线鼠标[图]
  7. 精心整理的十个必须要知道CSS+DIV技巧
  8. Google 推荐和鼓励的 13 条代码审查标准,建议收藏!
  9. 极光推送JPush使用Java SDK开发
  10. Win10:fastboot驱动问题解决方案
  11. 通过 DataEase 获取 API 数据完成项目周报分享
  12. 11gR2数据库RMAN完全恢复数据库
  13. 十分钟django后台 simpleui -含自定义后台首页
  14. 计算机网络 数字签名
  15. 泛泰 A870 TWRP Recovery En英/Cn简/Tw繁
  16. 边境的悍匪—机器学习实战:第七章 集成学习和随机森林
  17. 有效破解行业难点 专家称区块链+医疗发展还需找准应用场景
  18. dcdc低压升压直流稳压高压负电压输出12v24v转-50V100V110V150V200V250V300V350V400V500V
  19. eclipse 的RSE插件不错
  20. 运维工程师与php,php新手入门的基础内容①

热门文章

  1. 使用Jodd简化邮件服务的开发
  2. eclipse 工程复制
  3. 转:小结datatable的使用
  4. 使用MyBatis简化枚举类值的存储和读取
  5. win8+ubuntu,ubuntu中打开NTFS文件
  6. 解决docker pull镜像速度慢的问题
  7. Poj(2488),按照字典序深搜
  8. flash build 4.6 不能debug 报错 C:\WINDOWS\system32\...
  9. (转)一个古老的编程游戏:Python Challenge全通攻略
  10. Sharepoint 2007 定制Feature和卸载Feature