Linux大页内存(hugepage)使用

什么是大内存页huge page?

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

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

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

在虚拟内存管理中,内核维护一个将虚拟内存地址映射到物理地址的表,对于每个页面操作,内核都需要加载相关的映射。如果你的内存页很小,那么你需要加载的页就会很多,导致内核会加载更多的映射表。而这会降低性能。

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

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

查看当前大页内存配置信息

[root@develop ~]# grep Huge /proc/meminfo    
AnonHugePages:     14336 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

从上面输出可以看到,每个页的大小为 2MB(Hugepagesize),并且系统中目前有 0 个“大内存页”(HugePages_Total)。这里“大内存页”的大小可以从 2MB 增加到 1GB。

配置“大页内存“

将如下内容添加到/etc/sysctl.conf

vm.nr_hugepages = 100

然后执行sysctl -p命令重新加载配置

[root@develop ~]# sysctl -p
vm.nr_hugepages = 100
[root@develop ~]# grep Huge /proc/meminfo 
AnonHugePages:     14336 kB
HugePages_Total:     100
HugePages_Free:      100
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

使用“大页内存”

以mysql为例:

  1. 设置mysql的max locked memory
[root@develop ~]# vim /etc/security/limits.conf
@mysql            hard    memlock        unlimited
@mysql            soft    memlock         unlimited
  1. 将mysql用户所属组添加到系统内核中
[root@develop ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@develop ~]# vim /etc/sysctl.conf 
vm.hugetlb_shm_group=27
[root@develop ~]# sysctl -p
  1. 配置my.cnf
[root@develop ~]# vim /etc/my.cnf
[mysqld]
large-pages

注意,如果mysql日志中有如下信息说明大页内存不足:

181024 15:10:37 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: HugeTLB: Warning: Failed to allocate 138412032 bytes. errno 12
InnoDB HugeTLB: Warning: Using conventional memory pool

你可能感兴趣的:(Linux大页内存(hugepage)使用)