就Linux应用程序而言,使用的都是虚拟地址,当应用程序读写一个指定的虚拟地址时,内存管理单元会自动进行虚拟地址到物理地址的转换。一个虚拟

地址可以映射到多个物理地址,但当前映射到哪一个物理地址取决于当前的页表(Page

Table,一个虚拟地址到物理地址的映射转换表)内容,页表存储在主存储器中,查询速度相对比较慢。为了提高地址转换性能,大多数体系架构都提供一个快

速查找缓冲

要使用HugeTLB特性,当然需要首先打开内核的相关编译选项:

其中:

HugePages_Total:系统当前总共拥有的HugePages数目。

HugePages_Free:系统当前总共拥有的空闲HugePages数目。

HugePages_Rsvd:系统当前总共保留的HugePages数目,更具体点就是指程序已经向系统申请,但是由于程序还没有实质的HugePages读写操作,因此系统尚未实际分配给程序的HugePages数目。

HugePages_Surp:指超过系统设定的常驻HugePages数目的数目。

Hugepagesize:每一页HugePages的大小。

虽然尝试对上面这几个字段解释了一通,但HugePages_Rsvd和HugePages_Surp貌似仍然不够清楚,下面我们以实例数据来看,不过在此之前需要讲解另外几个内核参数:

其中:/proc/sys/vm/nr_hugepages,就是用于设定系统拥有的常驻HugePages数目的/proc接口,可读可写,比如修改常驻HugePages数目为10:

这个值当然并不是echo多少就是多少,它根据系统当前的可用内存来计算,比如如下,2G内存当然不可能会有1000000个HugePages,系统根据当前可用物理内存计算出可以组成的HugePages数目为899:

接口/proc/sys/vm/nr_hugepages_mempolicy和/proc/sys/vm/nr_hugepages的功用类似,

但是它只出现在NUMA系统上,用于更精细的HugePages申请分配。比如,对于一个具有2个NUMA节点的系统,申请100个HugePages页

面(先清0,以便重新生成HugePages页面):

/proc/sys/vm/nr_hugepages接口会按照当前修改nr_hugepages的进程的NUMA策略进行HugePages分

配,当然,默认情况下就是系统当前所有在线NUMA节点平均分配这些HugePages,除非那个NUMA节点本身没有足够的可用连续内存来生成

HugePages,那么此时HugePages将由另外一个NUMA节点生成。

通过/proc/sys/vm/nr_hugepages_mempolicy接口,可以指定HugePages页面具体由哪个NUMA节点生成:

上面先清0,以便系统重新生成HugePages页面,前40个HugePages页面全部在NUMA节点0上生成,而后20个(即

60-40)HugePages页面全部在NUMA节点1上生成,再接下来的20个(即80-60)HugePages页面平均由NUMA节点0和1上生

成,即此时虽然使用的nr_hugepages_mempolicy接口,但由于没有指定NUMA策略,所以默认就是平均分配,最后即便是指定了NUMA

策略,但由于使用的是nr_hugepages接口,所以仍然是平均分配。上面是增加HugePages页面的情况,减少的话也是类似:

第一个是平均减少,各自减少10个,第二个是仅由NUMA节点1减少20个,第三个是仅由NUMA节点0减少25个。当然,系统也提供有直接查看/设置某个NUMA节点上HugePages页面分配的接口:

关于NUMA节点HugePages页面分配以及numactl命令还有更多细节,请参考

编译它为执行程序eg1,eg1使用8M内存,即需要4页HugePages,设定常驻HugePages数为3,可超出常驻HugePages使用数为0,此时执行eg1会提示内存分配失败:

如果设定常驻HugePages数大于等于4,eg1当然可以执行成功,但也可以设定nr_overcommit_hugepages大于等于1同

样也可以让eg1成功执行,即只要nr_hugepages + nr_overcommit_hugepages大于等于4,此处eg1就可成功执行:

回过头来看HugePages_Total、HugePages_Free、HugePages_Rsvd、HugePages_Surp这四个字段:

HugePages_Total大多数情况下等于/proc/sys/vm/nr_hugepages(后面用nr_hugepages表示)的值,但当

/proc/sys/vm/nr_overcommit_hugepages(后面用nr_overcommit_hugepages表示)大于0

时,HugePages_Total会超过nr_hugepages,但肯定小于等于nr_hugepages +

nr_overcommit_hugepages,即:nr_hugepages <= HugePages_Total <=

nr_hugepages + nr_overcommit_hugepages。

HugePages_Free、HugePages_Rsvd、HugePages_Surp来看实例,先做一些设置:

然后,另开一个shell终端执行eg1程序:

就让eg1程序停在这,此时eg1程序已经执行了init_hugepage_seg();,即已经向系统申请4页HugePages,但还没有进

行实质内存读写操作wr_to_array();/rd_from_array();,回到之前的shell终端看HugePage信息:

此时HugePages_Total值为4,为eg1程序申请的HugePages数;HugePages_Free为4,表示系统尚未把这4页

HugePages分配给eg1程序,所以它们都处于free状态,值得注意的是,虽然它们处于free状态,但已经不能再分配作为他用,要测试的话只需

把前面eg1.c文件拷贝为eg2.c,并修改其中shmget函数的key值为2,然后gcc编译为eg2,在当前这个状态下再执行eg2则会提

示:“shmget error!: Cannot allocate

memory”;HugePages_Rsvd也为4,表示程序eg1已经向系统提出申请但尚未获得实际分配的HugePages

数;HugePages_Surp为1,表示超过系统设定的常驻HugePages数目的数目,即是:HugePages_Total(当前是4)

- nr_hugepages(当前是3)。

回到执行eg1程序的shell终端,按一下键盘让eg1程序进行实际读写操作后再回到之前的shell终端看HugePage信息:

此时eg1程序已经进行了实际读写操作,但是尚未释放HugePages内存:

所以看到的HugePages_Total等于4,HugePages_Free等于0,表示4页HugePages都被eg1程序使用

中;HugePages_Rsvd等于0自然是表示eg1程序已经获得了HugePages内存分配。HugePages_Surp为1,表示当前超过系

统设定的常驻HugePages数目的数目还是1。

eg1程序退出后自然数据又都恢复成初始状态了,注意此时HugePages_Surp归为0了,表示那些非常驻HugePages被实时的释放回系统

了,另外,如果在它们还没有释放回系统此前修改了常驻HugePages数目,那么这些HugePages_Surp的HugePages会优先被选择成

为常驻HugePages:

一般情况下,几个不等式为:

nr_hugepages <= HugePages_Total <= nr_hugepages + nr_overcommit_hugepages

HugePages_Free <= HugePages_Total

HugePages_Rsvd <= HugePages_Free

HugePages_Surp = HugePages_Total - nr_hugepages <= nr_overcommit_hugepages

那么特殊情况下,比如当前nr_hugepages为100,使用中的HugePages数目也为100,如果此时修改nr_hugepages为80,

那么即便当前nr_overcommit_hugepages为0,这多出的使用中的20个HugePages也会被计算在HugePages_Surp

中,同时此时也不再能够申请HugePages内存了,直到满足上面几个不等式为止。

被用作HugePages的内存页是不会被系统交换出去(swapped

out)的,并且由于HugePages需要更大的连续物理内存,所以在系统启动时更容易获得更多的HugePages内存,并且还能尽量保证这些

HugePages内存页连续,通过通过添加对应的boot kernel参数来实现这点:

如上面当前内核boot命令行参数设定HugePages内存页10个(hugepages=10),默认HugePages内存页大小为4M,但

Linux X86-64不支持,所以看到的Hugepagesize仍然只是2M(2048

kB)。/proc/sys/vm/nr_hugepages接口改变的是默认HugePages内存页大小的数目,如果系统支持多种大小的

HugePages,改变它们各自的数目需要/sys接口:

我的系统只有一种大小的HugePages,所以只有一个hugepages-2048kB/目录,如果有多种大小的HugePages,那么自然

就会有多个hugepages-${size}kB/这样的目录。每一个目录下存在同样命名的一些文件,其中有三个可读写,通过这几个可读写的接口便可做

相应的修改设置,其它只读:

linux 大叶内存,hugepages大叶内存相关推荐

  1. 【内存】Linux 页表、大页与透明大页|大页内存

    目录 页表与MMU CPU访问的是什么地址(虚拟地址,物理地址)? MMU如何工作 MMU对内存的保护 多级页表 一. 内存映射与页表 1. 内存映射 2. 页表 4. 页表的简单工作原理 大页 什么 ...

  2. kubevirt(七)HugePages大页内存

    一.HugePages大页内存 1.1 物理内存与虚拟内存 物理内存 也称为实际内存或硬件内存,是计算机中实际安装的内存条的容量. 虚拟内存 是一种利用硬盘空间来扩展物理内存的技术,它允许计算机将暂时 ...

  3. linux系统最大支持多大硬盘容量,LINUX操作系统对硬件支持有上限么?最大多少内存?多大硬盘容量?...

    32位的Linux的内存最大支持到4GB,64位的Linux的最大支持内存在TB级别上. (实际上最大支持多大的内容跟操作系统的种类无关,而是跟操作系统是几位的.还有CPU是几位的有关.) DOS是1 ...

  4. linux 系统日志 查看被杀掉的进程(占用内存过大)

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  5. 大页内存(HugePages)

    原文转载自:http://blog.csdn.net/yutianzuijin/article/details/41912871 今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePag ...

  6. linux怎么看系统内存多大内存频率,linux 系统管理中的查看内存插槽数最大容量和频率...

    Linux 查看内存的插槽数,已经使用多少插槽.每条内存多大,已使用内存多大 1.dmidecode|grep -P -A5 "Memory\s+Device"|grep Size ...

  7. 大页内存(HugePages)在通用程序优化中的应用

    在介绍之前需要强调一点,大页内存也有适用范围,程序耗费内存很小或者程序的访存局部性很好,大页内存很难获得性能提升.所以,如果你面临的程序优化问题有上述两个特点,请不要考虑大页内存.后面会详细解释为啥具 ...

  8. 文件服务器的内存要多少,文件服务器内存要多大

    文件服务器内存要多大 内容精选 换一换 Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1GB,而不是与源端服务器C盘的已用空间一致, ...

  9. 【Git学习】解决GitLab内存消耗大的问题

    一.问题描述 今天有提示反馈Gitlab服务器push不上去,让我看看是不是Gitlab服务器出了什么问题. 我查看了下gitlab在线的信息 这台服务器消耗了31.3GB内存. 然后我11:14分尝 ...

最新文章

  1. Eclipse新建Work set管理工程
  2. 大学mysql教程_MYSQL教程:新手该看的MYSQL操作
  3. 程序员,你恐慌的到底是什么?
  4. 一份深度学习相关的面试题
  5. 靠谱测试人员需具备业务分析能力
  6. sql 跨数据库 连表
  7. 最详细 Spring Boot 入门(-)
  8. 笔记 | 如何在Python下调用Linux的Shell命令?
  9. 目前找到的对龙枪最清晰的介绍。
  10. 基于STM32和阿里云的智能家居
  11. 计算机课程word教学,浅谈计算机Word表格的制作课程教学
  12. 微信公众号举报能封号吗
  13. android+获取电池信息,Delphi XE5 Android应用程序获取电池信息
  14. 外卖CPS用抖音高权重号评论引流,日引万粉
  15. 如何判断是不是一个网段
  16. 在图片上做标签,图片可放大缩小
  17. 计算机丢失libjcc dll,libjcc.dll 64位
  18. php顺丰bsp订单跟踪,顺丰BSP接口PHP开发注意事项
  19. 使用 PoseNet 和实时深度学习项目进行姿势检测
  20. 狼性团队五要素:沟通+信任+慎重+换位+快乐

热门文章

  1. 一个简单的SSM框架实例(IDEA)
  2. 嘿,里边请,看看这几位
  3. DM8达梦数据库体系结构详解
  4. Java实验 21点扑克牌游戏
  5. 微信小程序 textarea输入框内文字,从中间删除快的时候,光标会从中间跳到最后位置
  6. 乐视网:将于6月28日召开2018年度股东大会
  7. VM ware虚拟机、Ubuntu系统、Ros安装教程
  8. maven mybatis generator自动生成代码
  9. R语言acres92 region_R语言学习笔记(四)
  10. describe和corr的用法详解