【发布时间】:2016-07-19 17:43:12
【问题描述】:
我有一个 erlang gen_server,它异步接收来自客户端的消息(使用强制转换)。在每次消息处理时,服务器将它们插入到有序的 ETS 表中,并根据条件删除其中的一些(由于条件删除,ETS 表中的记录数大部分时间在 5000 左右。但很少有可以将此大小增加到 200k 的场景,从而引入了插入和删除的开销)。
这可以正常工作,直到每秒消息数为 100k,但高于此它会给我进程内存高水位标记并开始消耗大量内存。当我注释掉有序ets的插入和删除部分时,它每秒可以处理超过100k。你能给我一些关于如何解决这个问题的提示吗?
进程可以分配的内存有最大限制吗?我正在使用 35 GB 的内存,并将水印阈值设置为 memsup:set_procmem_high_watermark(0.6)。我还尝试了 gbtree 和有序字典,但它们没有解决内存错误。
【问题讨论】:
-
我觉得消息队列太长,你的gen_server不能快速处理消息。你能分享你的代码吗?
标签: memory-management erlang gen-server