文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  启用大页面支持

10.12.3.3 启用大页面支持

某些硬件和操作系统体系结构支持大于默认值(通常为 4KB)的内存页面。这种支持的实际实现取决于底层硬件和操作系统。由于减少了转换后备缓冲区 (TLB) 未命中,执行大量内存访问的应用程序可以通过使用大页面来获得性能提升。

在 MySQL 中,InnoDB可以使用大页面为其缓冲池和附加内存池分配内存。

MySQL 中大页面的标准使用尝试使用支持的最大大小,最大为 4MB。在 Solaris 下,超级大页面功能允许使用最大 256MB 的页面。此功能适用于最新的 SPARC 平台。可以使用 --super-large-pages--skip-super-large-pages 选项启用或禁用此功能。

MySQL 还支持大页面支持的 Linux 实现(在 Linux 中称为 HugeTLB)。

在 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 使用

  1. 确定所需的大页面数量。这是 InnoDB 缓冲池的大小除以大页面大小,我们可以将其计算为 innodb_buffer_pool_size / Hugepagesize。假设 innodb_buffer_pool_size 的默认值为 128MB,并且使用从 /proc/meminfo 获取的 Hugepagesize 值(2MB),则为 128MB / 2MB,即 64 个 Huge Pages。我们将此值称为 P

  2. 以系统 root 身份,在文本编辑器中打开文件 /etc/sysctl.conf,并添加此处显示的行,其中 P 是在上一步中获得的大页面数量

    vm.nr_hugepages=P

    使用之前获得的实际值,添加的行应如下所示

    vm.nr_hugepages=66

    保存更新后的文件。

  3. 以系统 root 身份,运行以下命令

    $> sudo sysctl -p
    注意

    在某些系统上,大页面文件的名称可能略有不同;例如,某些发行版将其称为 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
  4. (可选)您可能希望压缩 Linux VM。您可以使用一系列命令来完成此操作,这些命令可能位于脚本文件中,类似于此处所示的内容

    sync
    sync
    sync
    echo 3 > /proc/sys/vm/drop_caches
    echo 1 > /proc/sys/vm/compact_memory

    有关如何执行此操作的更多信息,请参阅您的操作系统平台文档。

  5. 检查服务器使用的任何配置文件(例如 my.cnf),并确保 innodb_buffer_pool_chunk_size 设置为大于大页面大小。此变量的默认值为 128M。

  6. 默认情况下,MySQL 服务器中的大页面支持处于禁用状态。要启用它,请使用 --large-pages 启动服务器。您也可以通过将以下行添加到服务器 my.cnf 文件的 [mysqld] 部分来实现此目的

    large-pages=ON

    如果启用此选项,InnoDB 会自动为其缓冲池和附加内存池使用大页面。如果 InnoDB 无法执行此操作,它将回退到使用传统内存,并在错误日志中写入警告:警告:使用传统内存池

您可以通过在重新启动 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