MongoDB性能优化:禁用透明大页(THP)
透明大页(Transparent Huge Pages,简称THP)是Linux内核中的一种内存管理机制。它通过将多个小页面合并为一个大页面来减少TLB(Translation Lookaside Buffer)的访问次数,从而提高某些工作负载的性能。
然而,在运行MongoDB 7.0及更早版本时,建议禁用THP以避免性能下降。因为这些版本的MongoDB通常采用非连续内存访问模式,启用THP反而会导致性能问题。
需要注意的是,从MongoDB 8.0开始,由于引入了升级版的TCMalloc(基于每个CPU缓存而非线程缓存),启用THP可能有助于提升性能。因此,在进行THP优化前,请务必确认当前使用的MongoDB版本。
以下是通过创建systemd服务文件来禁用THP的具体步骤:
1. 创建systemd单元文件
将以下内容保存为 /etc/systemd/system/disable-thp.service:
[Unit]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
注意:不同系统版本下,路径可能有所不同(例如某些系统使用/sys/kernel/mm/redhat_transparent_hugepage/enabled)。请根据实际情况调整路径。
2. 重新加载systemd配置
执行以下命令刷新systemd服务列表:
sudo systemctl daemon-reload
3. 启动服务并验证
启动新创建的服务:
sudo systemctl start disable-thp
验证THP是否已成功禁用:
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
如果输出均为never,则表示禁用成功。
4. 设置开机自启
运行以下命令确保服务在系统启动时自动运行:
sudo systemctl enable disable-thp
此外,如果MongoDB版本小于等于4.4且未禁用THP,启动日志中可能会出现类似以下警告:
{"t":{"$date":"2025-12-08T16:37:20.604+08:00"},"s":"W", "c":"CONTROL", "id":22178, "ctx":"initandlisten","msg":"/sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'","tags":["startupWarnings"]}
{"t":{"$date":"2025-12-08T16:37:20.604+08:00"},"s":"W", "c":"CONTROL", "id":22181, "ctx":"initandlisten","msg":"/sys/kernel/mm/transparent_hugepage/defrag is 'always'. We suggest setting it to 'never'","tags":["startupWarnings"]}
禁用成功后,这些警告信息将不再显示。