自管理部署的TCMalloc性能优化
已更改在版本8.0.
从MongoDB 8.0开始,MongoDB使用升级的TCMalloc版本,该版本使用使用每CPU缓存(per-CPU caches),而不是每线程缓存(per-thread caches),以减少内存碎片,并使数据库更能承受高压力的工作负载。
要使用新的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并在进程级别禁用它。如果您在一台机器上运行多个MongoDB进程,请确保8.0版本的进程启用THP,而7.0或更早版本的进程禁用THP。
此外,对于RHEL和CentOS系统,如果使用ktune
和tuned
性能配置文件,您还必须创建自定义的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
的同时使用tuned
或ktune
在RHEL或CentOS系统上,您必须创建一个自定义的tuned
配置文件,以确保THP保持启用状态。
启用每个CPU缓存的设置
为了验证TCMalloc是否以每个CPU缓存运行,请确保
tcmalloc.usingPerCPUCaches
设置为true
。
如果未启用每个CPU缓存,请确保
您已禁用glibc rseq。
您正在使用Linux内核版本4.18或更高版本。
禁用glibc rseq
新的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