问题描述:
服务器测试时,在正常运行2-3天之后直接挂掉了.
解决过程:
工作一年多了,之前遇到的都是一些报错和数据错误的bug,然后erlang就自动将那个进程重启了.erlang本身容错就做的很好,像这种服务器直接挂掉了的情况还没遇到过.吓得我赶紧百度一波导致erlang 挂掉的原因.
网上学习一波之后还是有点感觉,至少不像一开始一样一点思路都没有(http://blog.sina.com.cn/s/blog_96b8a1540100zn1q.html)
然后在日志里看到:
eheap_alloc: Cannot allocate 529782288 bytes of memory (of type “heap”).
serial read: Broken pipe
那么假如是内存耗尽了该怎么处理呢?
这里有篇博客:http://erlangdisplay.iteye.com/blog/1214167
因为测试的地方只有局域网,我这边也没办法去现场,就在util模块里添加几个方法,方便现场的直接进行运行:
spawn(fun() -> etop:start([{output, text}, {interval, 10}, {lines, 20}, {sort, memory}]) end).
这段代码会在终端每10秒一次,以memory大小排序显示.在现场运行的时候,发现里面有个MsgQ一直在增加,数字大的吓人,因为这个进程的信箱嘛,那么应该就是这个原因了:mailbox耗尽了系统的内存.
问题找到了,那么是什么导致的这个问题呢,这边就用到了eprof这个分析工具:
erlang 服务器崩溃bug
最新推荐文章于 2024-08-16 09:26:57 发布
在服务器测试中,Erlang服务器在运行2-3天后崩溃。通过分析日志和使用工具,发现由于MsgQ信箱内存耗尽导致问题。使用eprof定位到低效代码,通过改进避免了内存问题。然而,随后出现的timeout错误经排查发现与C程序内存泄露有关,问题最终转交C同事解决。这次经历强调了不断学习和利用资源解决问题的重要性。
摘要由CSDN通过智能技术生成