问题:
我正在对我的Mongoose查询执行测试,但内核出于内存不足的原因杀死了我的节点应用程序。
流程场景:针对单个请求
/获取请求->读取用户文档(如schema)[此schema有ref:user schema及其一个字段]]>根据客户端要求的响应格式编译/重新排列从MongoDB读取的查询输出[这涉及数据的过滤和循环]。->更新此文档的一个字段并再次将其保存回MongoDB->更新Redis->将响应[上述编译的响应]发送回请求的客户端
**当100个并发客户执行相同操作时,上述操作失败…
内存-非常低(CPU-最大值(>98%)
我能计算出的是读写发生的速率,它通过将所有请求排队从而延迟nodejs而阻塞了mongodb,nodejs导致如此剧烈的cpu和mem值,最后app被内核杀死。
请建议如何在这样的流中实现并发…

最佳答案

你现在遇到了Linux OOM Killer。基本上,所有的linux内核(不仅仅是amazon的)都需要在ram用完时采取行动,所以他们需要找到一个进程来终止。一般来说,这是一个需要最多记忆的过程。
您的三个主要选项是:
添加交换空间。如果根磁盘有足够的空间,可以在其上创建交换文件,或者创建一个小的ebs卷,将其附加到实例,并将其配置为交换。
移动到具有更多RAM的实例类型。
通过停止/终止未使用的进程或重新配置应用程序,减少实例上的内存使用量。
对于短期调试来说,选项1可能是最简单的。对于生产性能,您需要考虑优化应用程序的内存使用或获取具有更多RAM的实例。

09-05 14:07
查看更多