一些硬件和操作系统架构支持大于默认(通常为4KB)的内存页。这种支持的实际实现取决于底层硬件和操作系统。执行大量内存访问的应用程序可能通过使用大页来提高性能,因为Translation Lookaside Buffer(TLB)miss减少。
在 MySQL 中,大页可以由 InnoDB
使用,以分配缓冲池和附加内存池的内存。
在 MySQL 中,标准的大页使用尝试使用最大的支持大小,高达 4MB。在 Solaris 下,有一个“超大页”功能,启用高达 256MB 的页。这项功能适用于最近的 SPARC 平台,可以使用 --super-large-pages
或 --skip-super-large-pages
选项启用或禁用。
MySQL 还支持 Linux 实现的大页支持(称为 HugeTLB 在 Linux 中)。
在 Linux 上使用大页之前,必须启用内核以支持它们,并配置 HugeTLB 内存池。有关 HugeTBL API 的文档,请参阅 Linux 源代码中的 Documentation/vm/hugetlbpage.txt
文件。
一些最近的系统,如 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
。 -
以系统根用户身份,打开文件
/etc/sysctl.conf
在文本编辑器中,并添加以下行,其中P
是之前步骤中获得的值:vm.nr_hugepages=P
使用之前获得的实际值,该行应如下所示:
vm.nr_huge_pages=64
保存更新的文件。
-
以系统根用户身份,运行以下命令:
$> sudo sysctl -p
Note在某些系统上,大页文件可能以略有不同的名称;例如,一些发行版将其称为
nr_hugepages
。如果 sysctl 返回与文件名相关的错误,请检查/proc/sys/vm
中对应文件的名称,并使用该名称代替。要验证大页配置,请再次检查
/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
-
可选地,您可能希望压缩 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
设置大于大页大小。该变量的默认值为 128M。 -
MySQL 服务器中的大页支持默认情况下是禁用的。要启用它,请使用
--large-pages
启动服务器。您也可以通过将以下行添加到服务器的[mysqld]
部分的my.cnf
文件中来实现:large-pages=ON
启用该选项后,
InnoDB
将自动使用大页来分配缓冲池和附加内存池。如果InnoDB
无法执行此操作,将回退到使用传统内存并将警告写入错误日志:Warning: 使用传统内存池。
您可以通过在重新启动 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