Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

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

在此页面上

  • 平台支持
  • 启用透明大页面 (THP)
  • 启用 Per-CPU 缓存
  • 了解详情

在版本8.0中进行了更改

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

要使用新的 TCMalloc 版本:

  • 使用支持的操作系统。

  • 启用 THP。

  • 启用每 CPU 缓存。

支持MongoDB 8.0的操作系统也支持更新的 TCMalloc,以下操作系统除外:

这些操作系统使用旧版 TCMalloc。 如果您使用这些操作系统,请禁用 THP。

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

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

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

注意

您可以在系统级别启用THP,并在进程级别禁用 THP。 如果一台计算机上有多个MongoDB进程,请确保8.0版本上的进程启用THP,而7.0或更早版本上的进程禁用 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
1

要从现有配置文件创建新配置文件,请复制相关目录。 以下示例以virtual-guest配置文件为基础,并使用virtual-guest-thp作为新配置文件:

sudo cp -r /etc/tune-profiles/virtual-guest /etc/tune-profiles/virtual-guest-thp
2

编辑/etc/tune-profiles/virtual-guest-thp/ktune.sh并更改set_transparent_hugepages设置,如下所示:

set_transparent_hugepages always
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 版本也会使用该缓存。

要确保 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

后退

性能