MongoDB故障码1100在WiredTiger存储引擎路径中并不罕见,它往往表示一次内存页状态读取或写入阶段的异常等待。故障码出现时,应用程序可能只是表现为慢查询或批量写入排队,但底层已经出现明显的内存分配延迟。若宿主机的透明大页处于开启状态,内核会尝试将连续的小页合并成大页,或者在有内存压力时拆分大页,这个动作恰好发生在MongoDB频繁改写缓存页的时刻,容易把原本微秒级的页操作拉长到毫秒级,最终触发存储层错误。

故障码1100背后的透明大页机制
透明大页是Linux内核的内存管理特性,目标是通过使用2MB甚至1GB的大页来减少页表项数量,降低TLB缺失。对于连续大块内存访问的应用,这个设计能带来收益。但MongoDB的WiredTiger引擎采用B树和缓存页机制,数据页通常很小,写入和更新频繁随机,内核为了维护透明大页,需要不断扫描可合并的页,进行页拆分和迁移。这种额外开销并不会体现在常规内存统计里,却能显著增加单次内存分配时间。
故障码1100之所以和透明大页相关,是因为WiredTiger在缓存驱逐、检查点和事务提交时会对内部页进行操作。如果此时内核正在合并或拆分大页,可能导致获取页锁的时间变长,或者页表映射被短暂打断。MongoDB日志中常伴随出现透明的页合并失败、页缓存不足等提示。很多生产案例里,只要把透明大页关闭,故障码1100和相关性能尖刺就会同步消失。
# 查看当前透明大页状态 cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag
如何确认透明大页正在拖累MongoDB
判断透明大页是否影响实例,不能只看mongod日志,还要结合系统层指标。首先查看透明大页的启用状态,如果输出中包含[always],说明当前系统会在后台主动合并大页。对于MongoDB这类负载,推荐状态是[never]。同时检查defrag状态,如果也是always,说明碎片整理会与数据库的内存访问互相争抢资源。
其次观察mongod日志中是否出现类似故障码1100的记录,以及是否伴随长时间的写锁等待、检查点耗时突增。还可以用vmstat或sar观察内存分配时的CPU抖动,如果si/so不高但系统CPU使用率异常,往往是透明大页在后台做页迁移。直接对比关闭透明大页前后同一批写入任务耗时,通常能看到明显差异。
# 统计内存页拆分情况 grep -E 'thp_|compact' /proc/vmstat | head -20 # 查看mongod日志中故障码1100的出现次数 grep -c '1100' /var/log/mongodb/mongod.log
彻底关闭透明大页的正确方式
临时关闭透明大页可以通过sysfs接口完成,但重启后会失效。对于数据库服务器,需要同时修改内核启动参数或创建systemd服务,确保开机自动关闭。临时命令如下,执行后立刻生效,但要注意如果正在处理高负载,建议在低峰期执行,因为关闭过程会触发一次页表调整。
# 临时关闭透明大页 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久关闭可以通过systemd服务实现。创建一个独立的服务,将其设置为在mongod启动前运行,每次开机把never写入sysfs接口。也可以修改grub启动参数,在GRUB_CMDLINE_LINUX中添加transparent_hugepage=never,这样更底层,但需要更新grub并重启系统。
[Unit] Description=Disable Transparent Huge Pages before MongoDB starts Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag' RemainAfterExit=yes [Install] WantedBy=multi-user.target
关闭透明大页后的性能巩固与参数调整
透明大页关闭后,故障码1100通常不再高频出现,但要让MongoDB性能更稳定,还需要检查WiredTiger缓存和readahead配置。WiredTiger缓存大小应当接近物理内存的一半,避免设置过大导致操作系统换页。其他存储相关参数,例如readahead过大会让内核预读大量无用数据,同样会造成内存浪费和延迟,建议将数据卷的readahead调小,通常在8到64之间比较合适,具体取决于磁盘类型。
对于NUMA架构主机,MongoDB官方建议使用numactl以interleave策略启动mongod,避免单个内存节点被耗尽。可以把这些调整和透明大页关闭服务放在一起,形成数据库启动前的统一优化步骤。调完后重新跑一次写入压测,关注P99延迟和错误码1100是否归零。
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 16
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
setParameter:
wiredTigerConcurrentReadTransactions: 128
wiredTigerConcurrentWriteTransactions: 128实际环境中,不同MongoDB版本对透明大页的敏感度略有差异,但总体原则一致:数据库负载不适合使用透明大页的自动合并机制。把透明大页置为never,再配合合理的WiredTiger缓存与readahead设置,可以有效减少故障码1100产生的概率,保证复制集在高并发写入时不会因为内核内存管理动作而出现偶发抖动。
MongoDB故障码1100透明大页性能优化修改时间:2026-09-29 20:55:57