Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Enabling Large Page Support

10.12.3.3 启用大页支持

一些硬件和操作系统架构支持大于默认(通常为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 使用:

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

  2. 以系统根用户身份,打开文件 /etc/sysctl.conf 在文本编辑器中,并添加以下行,其中 P 是之前步骤中获得的值:

    vm.nr_hugepages=P

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

    vm.nr_huge_pages=64

    保存更新的文件。

  3. 以系统根用户身份,运行以下命令:

    $> 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
  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 启动服务器。您也可以通过将以下行添加到服务器的 [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