针对自管理部署的 TCMalloc 性能优化
在版本8.0中进行了更改。
从MongoDB 8.0开始, MongoDB使用 TCMalloc 的升级版本,该版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片,并使数据库对高压力工作负载更有弹性。
要使用新的 TCMalloc 版本:
平台支持
支持MongoDB 8.0的操作系统也支持更新的 TCMalloc,但以下操作系统除外:
这些操作系统使用旧版 TCMalloc。 如果您使用这些操作系统,请禁用 THP。
Windows使用旧版 TCMalloc,不支持更新的 TCMalloc。
启用透明大页面 (THP)
透明大页 (THP) 是一种Linux内存管理系统,可减少转换后备缓冲区 (TLB) 查找的开销。 THP 通过组合小页面并使其在应用程序中显示为较大的内存页面来实现此目的。
在MongoDB 8.0及更高版本中,通过为平台的初始化系统创建服务文件,确保在 mongod
启动之前启用 THP。 如果您使用的是MongoDB 7.0或更早版本,请禁用 THP。
注意
您可以在系统级别启用THP,并在进程级别禁用 THP。 如果一台计算机上有多个MongoDB进程,请确保8.0版本上的进程启用THP,而7.0或更早版本上的进程禁用 THP。
此外,对于使用ktune
和tuned
性能配置文件的 RHEL和CentOS系统,您还必须创建自定义tuned
配置文件。
创建服务文件
要创建启用 THP 的服务文件,请使用平台的内置初始化系统。 最新版本的Linux通常使用systemd ,而后者使用systemctl
命令。 旧版本的Linux倾向于使用System V init ,其中使用service
命令。 有关更多信息,请参阅操作系统的文档。
使用适合您平台的初始化系统:
创建systemd
单元文件
创建以下文件并将其保存在 /etc/systemd/system/enable-transparent-huge-pages.service
中:
[Unit] Description=Enable Transparent Hugepages (THP) DefaultDependencies=no After=sysinit.target local-fs.target Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c 'echo always | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' [Install] WantedBy=basic.target
注意
某些版本的 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)对 THP enabled
文件使用不同的路径:
/sys/kernel/mm/redhat_transparent_hugepage/enabled
验证您的系统正在使用哪个路径,并相应地更新 enable-transparent-huge-pages.service
文件。
启动服务
运行:
sudo systemctl start enable-transparent-huge-pages
要验证相关的 THP 设置是否已更改,请运行以下命令:
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
在 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)上,可能需要使用如下命令:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag && cat /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
输出应如下所示:
always defer+madvise 0 1
创建init.d
脚本
创建以下文件并将其保存在 /etc/init.d/enable-transparent-hugepages
中:
!/bin/bash ## BEGIN INIT INFO Provides: enable-transparent-hugepages Required-Start: $local_fs Required-Stop: X-Start-Before: mongod mongodb-mms-automation-agent Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Enable Linux Transparent Hugepages Description: Enable Linux Transparent Hugepages, to improve database performance. ## END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'always' | tee ${thp_path}/enabled > /dev/null && echo defer+madvise | tee ${thp_path}/defrag > /dev/null && echo 0 | tee ${thp_path}/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' unset thp_path ;; esac
运行脚本
运行:
sudo /etc/init.d/enable-transparent-hugepages start
要验证相关的 THP 设置是否已更改,请运行以下命令:
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
在 Red Hat Enterprise Linux(可能还包括基于 Red Hat 的其他衍生产品)上,可能需要使用如下命令:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
输出应如下所示:
always defer+madvise 0 1
使用tuned
和ktune
重要
如果使用tuned
或ktune
,请在创建服务文件后执行本节中的步骤。
tuned
和ktune
是内核调优实用程序,可以影响系统上的透明大页设置。 如果您在运行mongod
时在RHEL或CentOS系统上使用tuned
或ktune
,则必须创建自定义tuned
配置文件以确保 THP 保持启用状态。
启用 Per-CPU 缓存
要验证 TCMalloc 是否运行使用每个 CPU 的缓存运行,请确保:
如果未启用每 CPU 缓存,请确保:
禁用 glibc rseq。
您使用的是Linux内核版本4.18或更高版本。
禁用 glibc rseq
新的 TCMalloc 需要可重新启动 序列 (rseq) 来实现每 CPU 缓存。如果另一个应用程序(例如 glibc 库)在 TCMalloc 之前注册 rseq 结构,则 TCMalloc 无法使用 rseq。 如果没有 rseq,TCMalloc 将使用按线程缓存,而传统 TCMalloc 版本也会使用该缓存。
要确保 TCMalloc 可以使用 rseq启用每 CPU 缓存,您可以禁用 glibc 注册 rseq 结构。 要禁用 glibc rseq,请在启动mongod
之前设立以下环境变量:
GLIBC_TUNABLES=glibc.pthread.rseq=0 export GLIBC_TUNABLES
检查内核版本
如果已禁用 glibc rseq 并且仍未启用每 CPU 缓存,请确保您使用的是Linux内核版本4.18或更高版本。 要检查内核版本,请运行以下命令:
uname -r