10.12.3.3启用大页面支持
一些硬件和操作系统架构支持大于默认值(通常为4KB)的内存页。实际实现的支持取决于底层硬件和操作系统。执行大量内存访问的应用程序可能通过使用大页面获得性能改进,因为TLB misses减少。
在 MySQL 中,大页面可以由InnoDB
用于分配缓冲池和额外内存池的内存。
MySQL 的标准大页面使用尝试使用支持的最大大小,直到4MB。Solaris 中的“超大页面”功能启用了对256MB大小的页面的使用。这一特性适用于最新的SPARC平台,可以通过--super-large-pages
或--skip-super-large-pages
选项启用或禁用。
MySQL还支持 Linux 实现的大页面支持(称为 HugeTLB 在 Linux 中)。
在使用大页面之前,Linux 内核必须被启用以支持它们,并且需要配置 HugeTLB 内存池。参考 Linux 源代码中的Documentation/vm/hugetlbpage.txt
文件,以了解 HugeTBL API 的文档。
某些最新的系统,如Red Hat Enterprise Linux,可能默认启用了大页特性。要检查您的内核是否启用了该特性,请使用以下命令,并查找包含“huge”的输出行:
$> grep -i huge /proc/meminfo
AnonHugePages: 2658304 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
非空命令输出表明存在大页支持,但零值表明没有配置任何页面用于使用。
如果您的内核需要重新配置以支持大页,请参阅hugetlbpage.txt
文件中的指令。
假设您的Linux内核已经启用了大页支持,使用以下步骤将其用于MySQL:
-
确定需要的大页数量。这是InnoDB缓冲池大小除以大页大小,我们可以通过计算
innodb_buffer_pool_size
/Hugepagesize
来获得。假设innodb_buffer_pool_size
的默认值为128MB,并使用从/proc/meminfo
获取的Hugepagesize
值(2MB),这将是128MB / 2MB,或者64 Huge Pages。我们称其为P
。 -
以系统root身份,打开文件
/etc/sysctl.conf
,并添加以下行,其中P
是之前步骤中获得的大页数量:vm.nr_hugepages=P
使用实际值,追加行将如下所示:
vm.nr_huge_pages=64
保存更新后的文件。
-
以系统root身份,运行以下命令:
$> sudo sysctl -p
Note在某些系统上,large pages 文件可能以略微不同的名称存在;例如,一些发行版将其命名为
nr_hugepages
。如果sysctl返回与文件名相关的错误,请检查/proc/sys/vm
中的对应文件名称,并使用该名称。验证large page配置,可以再次查看
/proc/meminfo
,按照之前描述进行操作。现在,您应该在输出中看到一些非零值,类似于以下内容:$> grep -i huge /proc/meminfo AnonHugePages: 2686976 kB ShmemHugePages: 0 kB HugePages_Total: 233 HugePages_Free: 233 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 477184 kB
-
optionally,您可能想compact Linux VM。您可以使用一系列命令,可能在脚本文件中,类似于以下内容:
sync sync sync echo 3 > /proc/sys/vm/drop_caches echo 1 > /proc/sys/vm/compact_memory
请查看您的操作平台文档,以了解如何执行此操作。
-
检查服务器使用的配置文件,如
my.cnf
,确保innodb_buffer_pool_chunk_size
设置大于huge page size。该变量的默认值为128M。 -
MySQL 服务器中的large page支持默认disabled。要启用它,请使用
--large- pages
启动服务器。您也可以在服务器my.cnf
文件的[mysqld]部分添加以下行:large-pages=ON
启用该选项后,
InnoDB
将自动使用large pages来分配缓冲池和额外内存池。如果InnoDB
无法执行此操作,它将回退到传统内存的使用,并在错误日志中写入警告:Warning: Using conventional memory pool。
您可以通过重新启动mysqld后,检查/proc/meminfo
以验证MySQL现在是否使用大页。例如:
$> grep -i huge /proc/meminfo
AnonHugePages: 2516992 kB
ShmemHugePages: 0 kB
HugePages_Total: 233
HugePages_Free: 222
HugePages_Rsvd: 55
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 477184 kB