Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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:

  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_huge_pages=64

    保存更新后的文件。

  3. 以系统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
  4. optionally,您可能想compact 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设置大于huge page size。该变量的默认值为128M。

  6. 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