【问题标题】:aws kernel is killing my node appaws 内核正在杀死我的节点应用程序
【发布时间】:2017-07-30 12:27:31
【问题描述】:

问题:

我正在执行我的 mongoose 查询测试,但内核因 OutOfMemory 原因杀死了我的节点应用程序。

流程场景:针对单个请求

/GET REQUEST -> READ document of user(eg.schema) [This schema has ref : user schema with its fields] -> COMPILE/REARRANGE 从 mongodb 读取的查询输出 [这涉及过滤和循环data] 根据客户要求的响应格式。 -> 更新此文档的一个字段并再次将其保存回 mongoDB -> 更新 REDIS -> 将响应 [上面编译的响应] 发送回请求的客户端

** 当 100 个并发客户执行相同操作时,上述操作失败... MEM - 非常低(98%)

我能弄清楚的是读写发生的速率,它通过排队所有请求来阻塞 mongodb,从而延迟 nodejs,从而导致如此剧烈的 CPU 和 MEM 值,最终应用程序被内核杀死。

请建议我如何继续在此类流程中实现并发......

【问题讨论】:

    标签: node.js mongodb amazon-web-services redis database


    【解决方案1】:

    您现在遇到了Linux OOM Killer。基本上,所有 linux 内核(不仅仅是 Amazon 的)都需要在 RAM 用完时采取行动,因此他们需要找到一个进程来杀死。通常,这是请求最多内存的进程。

    您的 3 个主要选项是:

    1. 添加交换空间。如果根磁盘有足够的空间,您可以在根磁盘上创建一个交换文件,或者创建一个小的 EBS 卷,将其附加到实例,然后将其配置为交换。
    2. 移至具有更多 RAM 的实例类型。
    3. 通过停止/终止未使用的进程或重新配置您的应用来减少实例上的内存使用量。

    选项 1 可能是最简单的短期调试。对于生产性能,您需要考虑优化应用的内存使用或获得具有更多 RAM 的实例。

    【讨论】:

    • 你觉得加redis就够了
    • 只要 redis 不在同一个实例上运行(否则它只会占用更多你没有的内存)并且配置正确。不过,如果不了解您的应用设计,我无法确定。
    • 但是,如果您仍在尝试将更多数据加载到应用程序中,而不是实例内存可以容纳的数据,那么 Redis 将无济于事。数据库和应用程序之间的缓存层不会改变这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多