资讯详情

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

页表与MMU

CPU访问的地址是什么(虚拟地址,物理地址)?

MMU如何工作

MMU保护内存

多级页表

一、 内存映射和页表

1. 内存映射

2. 页表

4. 简单的页面工作原理

大页

大内存页面是什么?huge page?

为何使用大内存页?

1. 大页的优点

2. 大页的缺点

适用于大内存页面

3. 大页的分配方法

三、 透明大页

1. 检查是否启用

2. 关闭透明大页

使用大页实例

查看缺页中断统计


作者:bandaoyu 链接:https://blog.csdn.net/bandaoyu/article/details/113352282

页表与MMU

CPU访问的地址是什么(虚拟地址,物理地址)?

其实CPU不管它访问的是物理地址还是虚拟地址,它只访问一个地址,然后从数据线获取数据。

启用MMU时,CPU访问地址为向MMU发送地址,然后从MMU获取数据,虚拟地址通过MMU将其转换为物理地址,以访问外部内存中的数据。

禁用MMU时,CPU访问物理地址。

MMU如何工作

映射.png

是将虚拟地址记录到物理地址映射规则的集合。

内存以4K页面表记录每个物理内存的第一个地址和虚拟地址的映射关系,即只记录上图中的0xC00F3000和0xF3000间映射即可。

MMU是如何将虚拟地址转化为物理地址呢,它会去查询页表。 也就是说,MMU将虚拟地址转换为物理地址,而不是一个接一个地址,是4k单位转换的一页。

MMU有几个概念: PTE:页面项,即特定的转换规则,如0x8405000页映射00x8000物理页。 TLB:MMU中的cache,用于缓存最近用过的PTE

MMU保护内存

mmu的pte转换时按照4k大小页面为单位,32页bit有12个bit这些都没用bit访问权限的属性,如禁止访问、可读、可写、可执行等。

4K(12bit)为单位的MMU映射意味着需要2^20 用于映射4的条目G空间,即占用4M内存(32bit=4byte*2^20 =4byte*1M=4M)。

每个过程的页表都不一样(前3G不同的映射,后1G相同),因此在切换过程中会将过程的页面地址写入MMU从而更新整个MMU映射规则。

为了解决页表项过多的问题,Linux 提供多级页表和大页两种机制(HugePage),我们以大页为重点。

多级页表

从上面可以看出,由于每个过程的映射不同,每个过程必须有一个独立的页面表。

如果系统中有100个过程,则需要4个*100=400M存储页存储页表,这是不可能的。那么你能不能不映射一些页面呢? 不行,4G未知的空间是什么,必须提前预留映射。

如果一个过程需要1000M内存,所以1M只有25个页表项k一个是有用的,利用率是2%,剩下的3.98M页面内存被浪费了。

如果你想节省页表内存,你不能使用4K以4为单位映射M页表只需1K个,占用4K内存。每个页面项指向4M地址,需要第二页,第二页按4k如果是单位映射,每个4M需要1k占用4个页面项k内存。计算上述过程需要1000M内存,第一级页表是4K,二级页面只需25个*4k,所有页面只占104k内存,相比4M节省了大部分内存,仅浪费了3.99K的内存。

可以看出,使用多级页表不仅可以节省每个过程中页表占用的内存,还可以根据不同动态调整页表占用的内存大小。

事实上,在ARM在架构问过程是硬件实现的,但是页表的填充是软件维护的

image.png

彩蛋:说到MMU,有一个问题:为什么Uboot要关掉mmu? kernel启动需要环境,关闭mmu,关掉dcache,icache无所谓

待学习 - 收藏夹 - 知乎

我们通常所说的内存容量是指物理内存。只有核心才能直接访问物理内存,过程不能。

Linux 内核为每个过程提供了一个独立的虚拟地址空间,该地址空间是连续的。这样,过程就可以很容易地访问内存,更准确地说,访问虚拟内存。

虚拟地址空间的内部又被分为内核空间和用户空间两部,不同字长(单个 CPU 指令可以处理数据的最大长度)的处理器,地址空间的范围也不同。比如最常见的 32 位和64 位系统:

既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。内存映射,其实就是将虚拟内存地址映射到物理内存地址。

2. 页表

为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,如下图所示:

页的大小只有 4 KB ,导致的另一个问题就是,当物理内存很大时,页表会变得非常大,占用大量物理内存。

4. 页表的简单工作原理

下图是比较简单情况下的示意图,用于描述在32位系统下,页大小为4K时,操作系统如何为进程的虚拟地址和实际物理地址进行转换:

  • 目录表,是用于索引页表的数据结构,其中存储着目录项(共1024个、每个4B,因此目录表共4B*1024=4K ),每个目录项指向一个页表,即可以存储1024个页表。

  • 页表,用来存放物理地址页的起始地址,即页表项(也是共1024个、每个4B,因此一个页表的大小也是4K),由于目录表最多可存1024个页表,因此页表的最大大小是1024*4K=4M。

  • 页表项,每个页表项指向4K的物理内存页,因此页表一共可以指向的物理内存大小为:1024(页表数)*1024(每个页表的页表项数)*4K(一个页表项指向的物理内存大小)=4G

假如一个进程,访问的物理内存有1GB,即262144个内存页,在32位系统中,页表需要262144*4/1024/1024=1MB,而在64位系统下,页表占用的空间增加1倍,即2MB。

对于Linux系统中运行的Oracle数据库,假如数据库的SGA大小12GB,如果一个Oracle Process访问到了所有的SGA内存,其页表大小会是24MB,如果有300个左右的会话,那么这300个连接的页表会达到7200MB,只不过并不是每个进程都会访问到SGA中所有的内存。

页表大小可以通过 /proc/meminfo 的 PageTables部分查看。

Linux 页表、大页与透明大页_Hehuyi_In的博客-CSDN博客_linux 大页

大页

什么是大内存页huge page?

“大内存页”有助于 Linux 系统进行虚拟内存管理。顾名思义,除了标准的 4KB 大小的页面外,它们还能帮助管理内存中的巨大的页面。使用“大内存页”,你最大可以定义 1GB 的页面大小。

在系统启动期间,你能用“大内存页”为应用程序预留一部分内存。这部分内存,它会一直保留其中,除非你修改了配置。这会极大地提高像 Oracle 数据库这样的需要海量内存的应用程序的性能。

为什么使用“大内存页”?

在虚拟内存管理中,内核维护一个将虚拟内存地址映射到物理地址的表,对于每个页面操作,内核都需要加载相关的映射。

使用“大内存页”,意味着所需要的页变少了。从而大大减少由内核加载的映射表的数量。这提高了内核级别的性能最终有利于应用程序的性能。

简而言之,通过启用“大内存页”,系统具只需要处理较少的页面映射表,从而减少访问/维护它们的开销!

Linux大页内存(hugepage)使用_weixin_35664258的博客-CSDN博客_查看大页内存

大页顾名思义,就是比较大的页,通常是2MB。由于页变大了,需要的页表项也就少了,占用物理内存也减少了。

(假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和 Swap)。

为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。)

InnoDB启用大内存页 - yayun - 博客园

  • 要预先分配
  • 不够灵活,需要重启主机生效
  • 如果分配过多,会造成浪费,不能被其他程序使用。

  分配的大页内存被钉住,不能swap出去,那么即使这些内存是空闲的,其他程序也抢不过来。此时即使free -g的buff/cache   available 不为0,其他进程也拿不到这些内存。如果此时free为0就会出现无内存资源可用.  (?待证实)

[SDS_Admin@rdma57 ~]$ free -g
              total        used        free      shared  buff/cache   available
Mem:            125          94           0           0          30          29
Swap:             3           1           2

大页面内存引起的杯具_mseaspring的博客-CSDN博客

大内存页适用范围

大页内存也有适用范围,程序耗费内存很小或者程序的访存局部性很好,大页内存很难获得性能提升。所以,如果你面临的程序优化问题有上述两个特点,请不要考虑大页内存。

[root@localhost ~]# cat /proc/meminfo | grep -i huge AnonHugePages:  47708160 kB   //透明页/proc/meminfo之谜 | Linux Performance HugePages_Total:       0 HugePages_Free:        0 HugePages_Rsvd:        0 HugePages_Surp:        0 Hugepagesize:       2048 kB [root@localhost ~]#

Hugepagesize有值,说明系统支持large pages(如不支持,系统需要重新编译来支持)

HugePages Total表示系统中配置的大页数。

HugePages Free表示没有访问过的大页数,free容易引起误解,稍后会解释。

HugePages Rsvd表示已经分配但是还未使用的页面数。

Hugepagesize表示支持的大页size,这里为2MB,在有的内核配置中可能为4MB。

HugePages_Surp  is short for "surplus," and is the number of huge pages in
                the pool above the value in /proc/sys/vm/nr_hugepages. The
                maximum number of surplus huge pages is controlled by
                /proc/sys/vm/nr_overcommit_hugepages.

(更详细的参数说明:https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt)

解释:

比如HugePages总计11GB,orcale程序的SGA_MAX_SIZE为10GB,SGA_TARGET为8GB。那么数据库启动后,会根据SGA_MAX_SIZE占用10GB内存,真正Free的HugePage内存为11-10=1G。但是SGA_TARGET只有8GB,那么会有2GB不会被访问到,则HugePage_Free为2+1=3GB,HugePage_Rsvd内存有2GB。这里实际上可以给其他实例使用的只有1GB,也就是真正意义上的Free只有1GB。

红帽说明:

14.3. Sizing Big Pages and Huge Pages Red Hat Enterprise Linux 5 | Red Hat Customer Portal

14.7. Configuring Huge Pages in Red Hat Enterprise Linux 4 or 5 Red Hat Enterprise Linux 5 | Red Hat Customer Portal

到目前为止,大页只能用于共享内存段等少量类型的内存。

通常将大页用作Oracle数据库的SGA,那么大页数量:HugePages_Total=ceil(需要的内存<SGA_MAX_SIZE>/Hugepagesize)+N

比如,为数据库设置的SGA_MAX_SIZE为18GB,那么页面数可以为ceil(18*1024/2)+2=9218。加N是需要将HugePage空间设置得比SGA_MAX_SIZE稍大,通常为1~2即可。

我们通过ipcs -m命令查看共享内存段的大小,可以看到共享内存段的大小实际上比SGA_MAX_SIZE略大。如果服务器上有多个Oracle实例,需要为每个实例考虑共享内存段多出的部分,即N值会更大。另外,Oracle数据库要么全部使用大内存页,要么完全不使用大内存页,因此不合适的HugePages_Total将造成内存的浪费。

除了使用SGA_MAX_SIZE计算,也可以通过ipcs -m所获取的共享内存段大小计算出更准确的HugePages_Total

HugePages_Total=sum(ceil(share_segment_size/Hugepagesize))

  • 修改/etc/sysctl.conf文件,增加:vm.nr_hugepages=9218,执行sysctl -p命令

然后检查/proc/meminfo,如果HugePages_Total小于设置的数量,表明没有足够的连续物理内存用于这些大内存页,需要重启服务器。

在/etc/security/limits.conf文件中增加如下行,设定oracle用户可以锁定内存的大小 ,以KB为单位,将memlock配置为unlimited也可以。
oracle soft memlock 18878464
oracle hard memlock 18878464

然后重新以oracle用户连接到数据库服务器,使用ulimit -a命令,可以看到:

max lockedmemory       (kbytes, -l) 18878464

改为AUTO方式方式管理SGA
将SGA_TARGET_SIZE设为大于0的值。对于11g,由于HugePage只能用于共享内存,不能用于PGA,所以不能使用AMM,只能分别设置SGA和PGA,SGA同样只能是AUTO方式管理。

最后启动数据库,检查大页使用情况
检查/proc/meminfo中查看HugePages_Free是否已经减少。如果已经减少,表明已经使用到HugePage Memory。

在一些Linux系统中,transparent hugepage被默认开启,它允许大页做动态的分配,而不是系统启动后就分配好,根据Oracle MOS DOC:1557478.1,transparent hugepage导致了很多的问题,建议将其关闭。

LInux 标准大页和透明大页_Data & Analysis-CSDN博客_透明大页

在 Linux 中大页分为两种: Huge pages ( 标准大页 ) 和  Transparent Huge pages( 透明大页 ) 。

内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K 。 1MB 内存等于 256 页; 1GB 内存等于 256000 页。

CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候, CPU 需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。

Huge Pages

Huge pages  是从 Linux Kernel 2.6 后被引入的,目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。

Huge pages  有两种格式大小: 2MB  和  1GB , 2MB 页块大小适合用于 GB 大小的内存, 1GB 页块大小适合用于 TB 级别的内存; 2MB 是默认的页大小。

Transparent Huge Pages

Transparent Huge Pages  缩写  THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。

由于 Huge pages 很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此 RHEL 6 开始引入了 Transparent Huge Pages ( THP ), 

THP 为系统管理员和开发人员减少了很多使用传统大页的复杂性 ,  因为 THP 的目标是改进性能 ,  因此其它开发人员  ( 来自社区和红帽 )  已在各种系统、配置、应用程序和负载中对  THP  进行了测试和优化。这样可让  THP  的默认设置改进大多数系统配置性能。但是 ,  不建议对数据库工作负载使用  THP 。

这两者最大的区别在于 :  标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

标准大页的页面大小

[root@localhost ~]# grep Hugepagesize /proc/meminfo Hugepagesize: 2048 kB

1. 查看是否启用

cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]  #未启用应该看到[never]

[always] madvise never  #启用应该看到[always]

如果这个文件不存在,则检查

如果2个文件都不存在,说明系统内核中移除了THP,例如OEL 7。

2. 关闭透明大页

大页(huge pages) 系列四 ---Transparent HugePages_Lixora's DB Home-CSDN博客_[always] madvise never

How to check and disable transparent hugepages ( CentOS / RHEL 7 )

  • Redhat & Centos

# 重启后失效

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 开机时设置never到以上文件中

vim /etc/rc.d/rc.local

echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled

chmod +x /etc/rc.d/rc.local

  • SUSE Linux(区别在于开机设置never需要配置到的文件不同)

# 重启后失效

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 开机时设置never到以上文件中

vim /etc/init.d/boot.local

添加

echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled

chmod +x /etc/init.d/boot.local

参考

Oracle Memory Management and HugePage (连载二)_ITPUB博客

Oracle Memory Management and HugePage (连载三) _ITPUB博客

【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage) - ^_^小麦苗^_^ - 博客园

《Linux性能优化实战》笔记(八)—— 内存是怎么工作的_Hehuyi_In的博客-CSDN博客

Linux之关闭大页【即关闭透明大页】_LawsonAbs's Spiritual Home-CSDN博客_关闭大页内存

HugePages on Oracle Linux 64-bit (文档 ID 361468.1)

使用大页实例

Mysql 大页配置与性能测试 - 墨天轮

1.大页的作用

简单地说,linux的内存默认页大小是4K,大内存页是2M(或其他),Linux 操作系统上运行内存需求量较大的应用程序时,那么,cpu在对内存寻址的时候会寻多次地址找到所有的内存页,如果使用大内存页就会减少这种寻址次数,减少 TLB Miss 和缺页中断。如果使用大内存页就会减少这种寻址次数,比如在理想情况下,使用4KB页,cpu一次寻址2G的数据,如果是一般内存页,会寻1024*1024/2(2*1024*1024KB/4KB)次,如果是大内存页2M,会寻址1024次,前者是后者的516倍。当操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。

2.大页的设置方法

查看操作系统是否支持大页

grep -i huge /proc/meminfo

hugepagesize的大小表示系统支持的大内存页的大小

查看大页尺寸及状态(未开启): >cat /proc/meminfo | grep -i huge AnonHugePages:   1265664 kB HugePages_Total:       0 HugePages_Free:        0 HugePages_Rsvd:        0 HugePages_Surp:        0 Hugepagesize:       2048 kB 打开大页需要在操作系统上更改配置。

更改系统配置: vi /etc/security/limits.conf 添加: # HugePage up limit * soft memlock  816521216        --778GB,物理主机1T内存 * hard memlock  816521216        --778GB

或指定哪个OS用户可以使用大页 # HugePage up limit oracle    soft    memlock    5242880    --5G,物理主机8G内存 oracle    hard    memlock    5242880 memlock以K为单位的,可以让它的值稍微比系统的物理内存小就可以了。 查看oracle或mysql OS账户对应的group id,用对应账号登录linux,输入:

>id uid=1036(mysql) gid=1038(mysql) groups=1038(mysql),500(oinstall) vi /etc/sysctl.conf vm.hugetlb_shm_group = 500    

#使用mysql所在组ID vm.nr_hugepages = 256885 #分配大页内存为 256885*2048KB=501GB,值略小于memlock kernel.shmmax = 540938977280 --503GB配置了最大的内存segment的大小,这个设置应该比数据库定义使用的内存大小大一些。 kernel.shmall = 105652145 --单位为默认页大小4KB,shmall是全部允许使用的共享内存大小,shmmax是单个段允许使用的大小。shmall的大小为 105652145*4k/1024/1024=403GB 执行下面的命令 使上面的设置立即生效 /sbin/sysctl -p 对于内存为4G的服务器设置如下:

vi etc/security/limits.conf # HugePage up limit,--3.5G mysql    soft    memlock    3670016     mysql    hard    memlock    3670016 vi etc/sysctl.conf vm.hugetlb_shm_group = 500 vm.nr_hugepages = 1024 在mysql配置my.cnf中添加large-pages启动大页 [mysqld] large-pages 确认大页已被使用: >cat /proc/meminfo | grep -i huge AnonHugePages:    776192 kB HugePages_Total:    1024 HugePages_Free:     1010 HugePages_Rsvd:      118 HugePages_Surp:        0 Hugepagesize:       2048 kB

1. 未开hugepage >cat /proc/meminfo | grep -i huge AnonHugePages:    546816 kB HugePages_Total:    1024 HugePages_Free:     1024 HugePages_Rsvd:        0 HugePages_Surp:        0 Hugepagesize:       2048 kB

2. 启动大页: vi ./db1.cnf [mysqld] large-pages >cat proc/meminfo | grep -i huge AnonHugePages:    339968 kB HugePages_Total:    1024 HugePages_Free:      983 HugePages_Rsvd:      949 HugePages_Surp:        0 Hugepagesize:       2048 kB

可以看到性能有着明显的提升。

1.大页的作用

简单地说,linux的内存默认页大小是4K,大内存页是2M(或其他),当内存使用较高,那么,cpu在对内存寻址的时候会寻多次地址找到所有的内存页,如果使用大内存页就会减少这种寻址次数,

如果使用大内存页就会减少这种寻址次数,比如在理想情况下,使用4KB页,cpu一次寻址2G的数据,如果是一般内存页,会寻1024*1024/2(2*1024*1024KB/4KB)次,如果是大内存页2M,会寻址1024次,前者是后者的516倍,所以在业务量较大时,大页会提高服务器性能。

2.大页的设置方法

查看操作系统是否支持大页

grep -i huge /proc/meminfo

hugepagesize的大小表示系统支持的大内存页的大小

如果大页为2M,要设置的SGA(SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓.)为1.2G,页数=1.2*1024/2=918.2

实际页数应比这个稍大,在/etc/sysctl.conf中添加行

vm.nr_hugepages = 980

sysctl –p 生效

在/etc/security/limits.conf中添加行,memlock值应比大页值大,我这里设置的是3G

oracle hard    memlock  3145728

oracle soft    memlock  3145728

grid   hard    memlock  3145728

grid   soft    memlock  3145728

3 如何判断大页是否设置成功

grep -i huge /proc/meminfo

hugepagetotal的值=刚才设置的vm.nr_hugepages就可以了

4设置大页应注意的问题

1.数据库中use_large_page为true

2.设置了内存大页后不能使用AMM,只能用 ASMM,PGA自动管理,或者手动管理数据库内存

2.1 Hugepages

Hugepages在/proc/meminfo中是被独立统计的,与其它统计项不重叠,既不计入进程的RSS/PSS中,又不计入LRU Active/Inactive,也不会计入cache/buffer。如果进程使用了Hugepages,它的RSS/PSS不会增加。

注:不要把 Transparent HugePages (THP)跟 Hugepages 搞混了,THP的统计值是/proc/meminfo中的”AnonHugePages”,在/proc/<pid>/smaps中也有单个进程的统计,这个统计值与进程的RSS/PSS是有重叠的,如果用户进程用到了THP,进程的RSS/PSS也会相应增加,这与Hugepages是不同的。

在/proc/meminfo中与Hugepages有关的统计值如下:

1

2

3

4

5

6

7

MemFree: 570736 kB

...

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

HugePages_Total 对应内核参数 vm.nr_hugepages,也可以在运行中的系统上直接修改 /proc/sys/vm/nr_hugepages,修改的结果会立即影响空闲内存 MemFree的大小,因为HugePages在内核中独立管理,只要一经定义,无论是否被使用,都不再属于free memory。在下例中我们设置256MB(128页)Hugepages,可以立即看到Memfree立即减少了262144kB(即256MB):

1

2

3

4

5

6

7

8

9

10

# echo 128 > /proc/sys/vm/nr_hugepages

# cat /proc/meminfo

...

MemFree: 308592 kB

...

HugePages_Total: 128

HugePages_Free: 128

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

使用Hugepages有三种方式: (详见 https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt)

  1. mount一个特殊的 hugetlbfs 文件系统,在上面创建文件,然后用mmap() 进行访问,如果要用 read() 访问也是可以的,但是 write() 不行。
  2. 通过shmget/shmat也可以使用Hugepages,调用shmget申请共享内存时要加上 SHM_HUGETLB 标志。
  3. 通过 mmap(),调用时指定MAP_HUGETLB 标志也可以使用Huagepages。

用户程序在申请Hugepages的时候,其实是reserve了一块内存,并未真正使用,此时/proc/meminfo中的 HugePages_Rsvd 会增加,而 HugePages_Free 不会减少。

1

2

3

4

5

HugePages_Total: 128

HugePages_Free: 128

HugePages_Rsvd: 128

HugePages_Surp: 0

Hugepagesize: 2048 kB

等到用户程序真正读写Hugepages的时候,它才被消耗掉了,此时HugePages_Free会减少,HugePages_Rsvd也会减少。

1

2

3

4

5

HugePages_Total: 128

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

/proc/meminfo之谜 | Linux Performance

《程序性能优化提升方法之-内存大页》程序性能优化提升方法之-内存大页-qgx2009-ChinaUnix博客

查看缺页中断统计

可通过以下命令查看缺页中断信息  ps -o majflt,minflt -C <program_name>  ps -o majflt,minflt -p <pid>  其中:

          majflt代表major fault,中文名叫大错误,

        minflt代表minor fault,中文名叫小错误。

          这两个数值表示一个进程自启动以来所发生的缺页中断的次数。

发成缺页中断后,执行了那些操作?

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:  1、检查要访问的虚拟地址是否合法  2、查找/分配一个物理页  3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)  4、建立映射关系(虚拟地址到物理地址)  重新执行发生缺页中断的那条指令  如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。

linux内存分配机制:Linux内存分配小结--malloc、brk、mmap_gfgdsg的专栏-CSDN博客_mmap分配内存(malloc和free是如何分配和释放内存?)

                                 Linux内存分配机制 - 莘莘学子 - 博客园

标签: 104k400vcbb电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台