MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果

MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果

ngine to ‘wiredTiger’.
2025-07-22T17:05:20.228+0800 W STORAGE [initandlisten] Recovering data from the last clean checkpoint.
2025-07-22T17:05:20.228+0800 I STORAGE [initandlisten]
2025-07-22T17:05:20.228+0800 I STORAGE [initandlisten] WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-07-22T17:05:20.228+0800 I STORAGE [initandlisten] See Production Notes for Self-Managed Deployments - Database Manual - MongoDB Docs
2025-07-22T17:05:20.228+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=31004M,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),cache_size=25G
2025-07-22T17:05:21.107+0800 W STORAGE [initandlisten] Detected configuration for non-active storage engine mmapv1 when current storage engine is wiredTiger
2025-07-22T17:05:21.107+0800 I CONTROL [initandlisten]
2025-07-22T17:05:21.107+0800 I CONTROL [initandlisten] WARNING: Access control is not enabled for the database.
2025-07-22T17:05:21.107+0800 I CONTROL [initandlisten] Read and write access to data and configuration is unrestricted.
2025-07-22T17:05:21.107+0800 I CONTROL [initandlisten] WARNING: You are running this process as the root user, which is not recommended.

一直研究 从这些更多日志来看问题

MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果_第1张图片

从MongoDB的日志来看,服务器启动正常并成功恢复数据,但存在几个可能导致频繁掉线的警告和问题:

1. 检测到未干净关闭

日志显示MongoDB检测到了未干净的关闭状态:

2025-07-22T17:05:20.217+0800 W -        [initandlisten] Detected unclean shutdown - /data/mongodb/mongod.lock is not empty.

影响:这本身不会直接导致频繁掉线,但可能表示之前的关闭存在问题,数据文件可能处于不一致状态。

解决建议

  • 检查MongoDB是否因系统崩溃、强制终止等原因异常关闭
  • 确保在关闭MongoDB时使用正确的方法(如mongod --shutdown或通过服务管理工具)
  • 检查是否有其他进程在使用MongoDB数据目录

2. 存储引擎配置冲突

日志显示同时配置了wiredTigermmapv1两种存储引擎:

2025-07-22T17:05:21.107+0800 W STORAGE  [initandlisten] Detected configuration for non-active storage engine mmapv1 when current storage engine is wiredTiger

影响:虽然MongoDB会选择使用检测到的数据文件对应的存储引擎(这里是wiredTiger),但这种冲突配置可能导致不稳定。

解决建议

  • 编辑配置文件/opt/mongodb-3.4.0/mongo.conf,移除或注释掉与mmapv1相关的配置,例如:
# mmapv1: { smallFiles: true }

3. 透明大页警告

日志显示透明大页设置为”always”:

2025-07-22T17:05:21.107+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-07-22T17:05:21.107+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

影响:透明大页设置为”always”会导致MongoDB性能下降,可能间接导致连接问题。

解决建议

  • 临时修改(重启后失效):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  • 永久修改:
# 编辑启动脚本或添加系统配置
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.local
chmod +x /etc/rc.local

最终是 临时修改把透明大页改了 成功的,基本上没有再掉线

MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果_第2张图片

4. 文件系统建议

日志提示当前文件系统可能不是最佳选择:

2025-07-22T17:05:20.228+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

影响:虽然这不会直接导致掉线,但使用不推荐的文件系统可能会影响MongoDB的稳定性和性能。

解决建议

  • 如果可能,将MongoDB数据目录所在的文件系统转换为XFS
  • 确保文件系统配置了适当的挂载选项,如noatime

5. 其他警告

日志中还提到了两个安全相关的警告:

  • MongoDB以root用户运行(不推荐)
  • 未启用访问控制(无身份验证)

透明大页(Transparent Huge Pages, THP)对 MongoDB 的影响详解

透明大页是 Linux 内核的一项内存管理优化技术,旨在通过使用更大的内存页(通常为 2MB 或 1GB,而非传统的 4KB)来减少内存管理开销,提高 CPU 缓存命中率。然而,这项技术对 MongoDB 的性能和稳定性可能产生严重负面影响。

1. 透明大页的工作原理

  • 传统内存页:Linux 系统默认使用 4KB 大小的内存页,内存管理单元(MMU)需要维护大量页表项,导致较高的 TLB(Translation Lookaside Buffer)miss 率。
  • 大页机制:通过使用更大的内存页(如 2MB),减少页表项数量,降低 TLB miss 率,从而提升内存访问效率。
  • 透明大页:内核自动将应用程序使用的连续内存区域转换为大页,无需应用程序显式请求,因此称为“透明”。

2. MongoDB 与透明大页的冲突

MongoDB 在设计上依赖操作系统的内存管理机制(如内存映射文件,mmap),而透明大页会干扰这一过程:

性能问题
  • 内存碎片化:THP 的动态分配和回收会导致内存碎片化,使 MongoDB 更频繁地触发交换(swap),甚至导致 Out of Memory(OOM)异常。
  • 写放大:THP 的 Copy-on-Write(COW)机制在写入操作时会导致整个 2MB 页被复制,而非传统的 4KB 页,显著增加写入开销。
  • 锁争用:THP 的管理涉及内核全局锁,高并发写入时会加剧锁争用,降低吞吐量。
稳定性问题
  • 延迟尖峰:THP 的动态分配和回收过程可能导致 MongoDB 出现不可预测的延迟尖峰,影响响应时间。
  • 启动缓慢:启用 THP 时,MongoDB 启动时需要分配大量大页,可能导致启动时间显著延长。

3. 为什么关闭 THP 后统计功能不实时?

关闭 THP 本身不会直接导致统计功能失效,但可能与以下因素相关:

1. 内存分配变化
  • 关闭 THP 后,系统使用传统小页,内存分配模式改变,可能影响缓存命中率。
  • 统计功能通常依赖内存中的聚合计算,若数据未完全加载到内存,可能导致延迟。
2. 监控工具兼容性
  • 某些监控工具(如 MongoDB 自带的 db.serverStatus() 或第三方监控)可能依赖 THP 提供的内存统计信息。
  • 关闭 THP 后,这些工具的统计方式可能需要调整。
3. 缓存刷新机制
  • MongoDB 的统计信息可能缓存于内存中,关闭 THP 后,内存管理方式变化可能导致缓存刷新不及时。

4. 如何平衡 THP 的关闭与功能需求?

1. 验证统计功能问题的根本原因
  • 检查 MongoDB 查询日志,确认统计查询是否存在性能问题。
  • 使用 db.currentOp() 监控长时间运行的查询。
  • 检查系统资源使用情况(如内存、CPU、磁盘 I/O)。
2. 优化统计查询
  • 为统计查询创建适当的索引,减少全表扫描。
  • 使用聚合管道(Aggregation Pipeline)预计算统计结果,并存入汇总表。
  • 调整统计查询的频率,避免过于频繁的实时计算。
3. 部分启用 THP(谨慎操作)
  • 若统计功能对 THP 依赖较强,可考虑在 MongoDB 进程外的特定应用中部分启用 THP。
  • 例如,通过 sysctl 为特定进程设置 THP:
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled

这种模式下,只有主动请求大页的应用程序才会使用 THP。

4. 升级 MongoDB 版本
  • 较新版本的 MongoDB(如 4.4+)对内存管理进行了优化,可能减轻 THP 的影响。

MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果_第3张图片

综合考虑下来 必须抛弃THP

5. 生产环境建议

  1. 优先关闭 THP:对于大多数 MongoDB 生产环境,关闭 THP 是必要的优化措施,可显著提高稳定性和性能。
  2. 优化统计功能:通过索引、聚合和缓存机制弥补统计实时性的损失。
  3. 监控与调优
    • 使用 tophtopatop 监控系统内存使用。
    • 通过 vmstat 观察内存交换情况。
    • 配置 MongoDB 的慢查询日志(slowms)捕获性能问题。
  1. 考虑替代方案:若统计功能对业务至关重要,可考虑使用专门的分析数据库(如 MongoDB Analytics 或 Elasticsearch)处理统计需求,与主 MongoDB 分离。

总结

透明大页虽然旨在优化内存使用,但与 MongoDB 的内存管理模型存在根本冲突,可能导致严重的性能和稳定性问题。关闭 THP 是 MongoDB 生产环境的标准推荐配置。统计功能的实时性问题通常可通过查询优化、架构调整或技术选型解决,不应以牺牲整体稳定性为代价保留 THP。

MongoDB中的THP是什么-核心解决频繁断线居然是关闭THP-THP原理以及MongoDB版本号的关系-卓伊凡|糖果_第4张图片

整体情况直接变好了,也没有在内存溢出,总之 要是我们版本是4.4以上可能根本不会有这个问题,按道理我们配置已经不低了 16核心,64GB内存真不算低配置了。

但是 核心解决方案还是 升级 版本,升级是一件很大的事情,但只有升级改造才是最佳方案,痛是必须痛的。

你可能感兴趣的:(数据库开发相关知识专栏,mongodb,数据库)