文档菜单
文档首页
/
MongoDB 手册
/ / /

自管理部署的TCMalloc性能优化

本页内容

  • 平台支持
  • 启用透明大页面(THP)
  • 启用每CPU缓存
  • 了解更多

已更改在版本8.0.

从MongoDB 8.0开始,MongoDB使用升级的TCMalloc版本,该版本使用使用每CPU缓存(per-CPU caches),而不是每线程缓存(per-thread caches),以减少内存碎片,并使数据库更能承受高压力的工作负载。

要使用新的TCMalloc版本

  • 使用支持的操作系统.

  • 启用THP.

  • 启用每CPU缓存.

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

  • RHEL 8 / CentOS 8 / Oracle 8 在 PPC64LEs390x 架构上

  • RHEL 9 / CentOS 9 / Oracle 9 在 PPC64LE 架构上

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

Windows使用传统的TCMalloc版本,并且不支持更新的TCMalloc。

透明大页(THP)是Linux内存管理系统,它可以减少转换后备缓冲区(TLB)查找的开销。THP通过合并小页面,使它们在应用程序中看起来像更大的内存页面来实现这一点。

在MongoDB 8.0及更高版本中,在启动mongod之前,请确保THP已启用。如果您使用的是MongoDB 7.0或更早版本,请禁用THP。

注意

您可以在系统级别启用THP并在进程级别禁用它。如果您在一台机器上运行多个MongoDB进程,请确保8.0版本的进程启用THP,而7.0或更早版本的进程禁用THP。

此外,对于RHEL和CentOS系统,如果使用ktunetuned性能配置文件,您还必须创建自定义的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的同时使用tunedktune在RHEL或CentOS系统上,您必须创建一个自定义的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的缓存,您可以在启动mongod之前禁用glibc的rseq结构注册。要禁用glibc rseq,请在启动前设置以下环境变量

GLIBC_TUNABLES=glibc.pthread.rseq=0
export GLIBC_TUNABLES

如果您已禁用glibc rseq,但每个CPU的缓存仍未启用,请确保您使用的是Linux内核版本4.18或更高版本。要检查内核版本,请运行以下命令

uname -r

返回

性能