有一个小型(4 个副本)mongodb 集群(副本集)。每个节点有 24GB RAM,Wiredtiger 缓存大小为 8GB。
集群被许多(大约 100 个)应用程序使用,这些应用程序每秒处理几百个请求。大多数查询都经过了优化。
有时(每隔几个月),主节点会被 oomkiller 杀死,然后辅助节点也会被杀死(可能是应用程序重复了相同的请求),然后就会恢复正常。
首先 - 问题发生在 mongodb 3.6 上,然后将 mongodb 集群升级到 4.4 但问题仍然存在。
从图表上可以看出,在崩溃前大约一分钟,mongodb 的内存使用量开始增加,在崩溃前几秒,它接近极限,然后崩溃。
如何找到触发问题的请求?日志和分析器中只有已完成请求的信息,问题可能出在未完成的请求上。是否可以在完成前几秒记录每个正在运行的请求?我考虑每隔几秒将 db.currentOp() 转储到文件中 - 我认为它可以找到崩溃前发生的情况 - 但这不是很好的解决方案,尤其是没有关于内存的信息。
或者 - 也许有另一种方法来终止占用超过一定内存或时间的请求?