对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

针对自管理部署的 TCMalloc 性能优化

在版本8.0中进行了更改。:

从 MongoDB 8.0 开始,MongoDB 使用升级版 TCMalloc,此版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片,并使数据库对高压工作负载更有弹性。

要使用新的 TCMalloc 版本:

对更新的 TCMalloc 的支持取决于 CPU 架构。支持 MongoDB 8.0 的 Linux 系统仅在x86_64ARM64架构上支持更新的 TCMalloc。

无论操作系统版本如何,MongoDB 在 PPC64LEs390x 架构上使用旧版 TCMalloc。如果使用以上架构之一,请禁用 THP。

Windows使用旧版 TCMalloc,不支持更新的 TCMalloc。

透明大页 (THP) 是一种Linux内存管理系统,可减少转换后备缓冲区 (TLB) 查找的开销。 THP 通过组合小页面并使其在应用程序中显示为较大的内存页面来实现此目的。

在MongoDB 8.0及更高版本中,通过为平台的初始化系统创建服务文件,确保在mongod启动之前启用 THP。 如果您使用的是MongoDB 7.0或更早版本,请禁用 THP。

注意

THP 在系统级别运行,因此适用于系统下的所有进程。您无法启用或禁用 THP 每进程级别。

此外,对于使用ktunetuned性能配置文件的RHEL和CentOS系统,您还必须创建自定义tuned配置文件。

要创建启用 THP 的服务文件,请使用平台的内置初始化系统。 最新版本的Linux通常使用systemd ,而后者使用systemctl命令。 旧版本的Linux倾向于使用System V init ,其中使用service命令。 有关更多信息,请参阅操作系统的文档。

使用适合您平台的初始化系统:

1

创建以下文件并将其保存在 /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 文件。

2

要重新加载 systemd 单元文件并使 enable-transparent-huge-pages.service 可供使用,请运行以下命令:

sudo systemctl daemon-reload
3

运行:

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
4

要确保每次操作系统启动时都应用此设置,请运行以下命令:

sudo systemctl enable enable-transparent-huge-pages
5

如果您在RHEL / CentOS上使用tunedktune配置文件,则还必须创建自定义tuned配置文件。

1

创建以下文件并将其保存在 /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
2

运行:

sudo chmod 755 /etc/init.d/enable-transparent-hugepages
3

运行:

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
4

要确保每次启动操作系统时都应用此设置,请为 Linux 发行版运行以下命令:

分发
命令

Ubuntu 和 Debian

sudo update-rc.d enable-transparent-hugepages defaults

SUSE

sudo insserv /etc/init.d/enable-transparent-hugepages

Red Hat、CentOS、Amazon Linux 和衍生产品

sudo chkconfig --add enable-transparent-hugepages
5

如果您在RHEL / CentOS上使用tunedktune配置文件,则还必须创建自定义tuned配置文件。

重要

如果使用tunedktune ,请在创建服务文件后执行本节中的步骤。

tunedktune 是可以影响系统上透明大页设置的内核调优工具。如果您在运行 mongod 时,于您的 RHEL 或 CentOS 系统上使用 tunedktune,则必须创建自定义 tuned 配置文件以确保 THP 保持启用状态。

1

创建一个新目录来存储自定义tuned配置文件。 以下示例继承现有的virtual-guest配置文件,并使用virtual-guest-thp作为新配置文件:

sudo mkdir /etc/tuned/virtual-guest-thp
2

创建和编辑/etc/tuned/virtual-guest-thp/tuned.conf 。 添加以下文本:

[main]
include=virtual-guest
[vm]
transparent_hugepages=always

此示例继承现有的virtual-guest配置文件。 为您的系统选择适当的配置文件。

3

运行:

sudo tuned-adm profile virtual-guest-thp

要验证 TCMalloc 是否运行使用每个 CPU 的缓存运行,请确保:

如果未启用每 CPU 缓存,请确保:

  • 禁用 glibc rseq。

  • 您使用的是Linux内核版本4.18或更高版本。

新的 TCMalloc 需要可重新启动序列 (rseq)来实现每 CPU 缓存。如果另一个应用程序(例如 glibc 库)在 TCMalloc 之前注册 rseq 结构,则 TCMalloc 无法使用 rseq。如果没有 rseq,TCMalloc 将使用按线程缓存,而传统 TCMalloc 版本也会使用该缓存。

要启用每 CPU 缓存,请在启动 mongod 之前设置以下环境变量以禁用 glibc 的 rseq 注册:

GLIBC_TUNABLES=glibc.pthread.rseq=0
export GLIBC_TUNABLES

如果在禁用 glibc rseq 后每 CPU 缓存仍未启用,请验证您使用的是 Linux 内核 4.18 或更高版本:

uname -r