it编程 > 前端脚本 > Erlang

Erlang项目内存泄漏分析方法

195人参与 2024-05-15 Erlang

随着项目越来越依赖erlang,碰到的问题也随之增加。前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程。线上系统用的是erlang r16b02版本。

问题描述

有几台线上系统,运行一段时间,内存飙升。系统模型很简单,有网络连接,pool中找新的process进行处理。top命令观察,发现内存都被erlang进程给吃完了,netstat命令查看网络连接数,才区区几k。问题应该是erlang内存泄漏了。

分析方法

erlang系统有个好处,可以直接进入线上系统,在生产现场分析问题。我们系统是通过rebar管理的,可以用不同方法进入线上系统。

本机登录

可以直接登录到线上机器,然后通过以下命令attach到erlang系统里面

通过remote shell

获取erlang系统的cookie

新开一个shell,使用同样的cookie,不同的nodename

用start remote shell进入系统

分析流程

erlang有很多工具,可以分析系统信息,比如appmonwebtool。但是系统内存严重不足,已经没有办法启动这些工具了,幸好还有erlang shell。

erlang shell自带了很多有用的命令,可以用help()方法查看

erlang系统内存消耗情况

top结果显示,是内存问题,所以第一步可以先看看erlang的系统内存消耗情况

memory()可以看到erlang emulator分配的内存,有总的内存,atom消耗的内存,process消耗的内存等等。

erlang process创建数量

线上系统发现主要内存消耗都在process上面,接下来要分析,是process内存泄漏了,还是process创建数量太多导致。

system_info()返回当前系统的一些信息,比如系统process,port的数量。执行上面命令,大吃一惊,只有2,3k的网络连接,结果erlang process已经有10多w了。系统process创建了,但是因为代码或者其它原因,堆积没有释放。

查看单个process的信息

既然是因为process因为某种原因堆积了,只能从process里找原因了

先要获取堆积process的pid

看到有很多process hang在那里,查看具体pid信息,发现message_queue有几条消息没有被处理。下面就用到强大的erlang:process_info()方法,它可以获取进程相当丰富的信息。

查看进程的backtrace时,发现下面的信息

process在处理erlang第三方的日志库lager时,hang住了。

问题原因

查看lager的文档,发现以下信息

原来lager有个配置项,配置message未处理的数量,如果message堆积数超出,则会用 同步 方式处理!

当前系统打开了debug log,洪水般的log把系统给冲垮了。

老外也碰到类似问题,这个thread给我们的分析带来很多帮助,感谢一下。

总结

erlang提供了丰富的工具,可以在线进入系统,现场分析问题,这个非常有助于高效、快速的定位问题。同时,强大的erlang otp让系统有更稳定的保证。我们还会继续挖掘erlang,期待有更多的实践分享。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

05-15

CentOS 6.5源码安装Erlang教程

05-15

Erlang中的注册进程使用实例

05-15

Erlang的一些编程技巧分享

05-15

Erlang分布式节点中的注册进程使用实例

05-15

Erlang实现的百度云推送Android服务端实例

05-15

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论