FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
#####表现:#####
- 用100W条数据循环使用redis库建立索引(zadd)并初始化数据(hmset),到70万左右时速度急剧下降,最后内存溢出,在整个过程中node进程内存一直上升。
#####可能原因:#####
- 每次循环都去redis建立索引并插入数据,并用multi提交,猜想是node事件(回调)太多,redis并没有处理完,一直在等待返回.
- 按我的机器配置,将循环数据量降到10W内就不会出错,内存也不会一直暴涨
有谁使用过redis的nodejs库,并有类似的使用场景嘛?
24 回复
@sumory 只有当脚本进入空闲的时候,才会执行callback脚本。如果你真的需要加入100W行数据,尝试通过setTimeout将插入操作分段,这样node才能执行callback过程,否则callback会始终积压,必然造成溢出
其实我现在也遇到了和你差不多的问题,我这边是一个在线互动游戏,当用户数量达到一定数量的时候,有时会出现process out of memory的情况。我估计也是由于在socket.io接收到客户端请求的时候,后后台做了一些异步的操作(比如记录文本日志、调用webservice进行业务处理),导致nodejs一直没有时间去处理异步回调。
我想了一下,就算使用nextTip把异步调用推迟到下一次事件循环再处理。但还是避免不了这个问题啊,因为问题的产生是由于整个异步调用的过程被分为**‘调用’和‘回调’**2个步骤。其中‘回调’这个步骤只有nodejs线程‘有空’的时候才会来处理,换句话说,即使我们把‘调用’的时机推迟了,但是他执行完‘调用’后,仍然会去接着处理其他的请求,而导致有很多的‘回调’在堆栈中积压啊