内容简介:前面一部分直接从以前的 blog copy 过来。随着项目越来越依赖Erlang,碰到的问题也随之增加。前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程。线上系统用的是Erlang R16B02版本。有几台线上系统,运行一段时间,内存飙升。系统模型很简单,等待网络新连接,pool中找新可用process进行处理。top命令观察,发现内存都被Erlang进程给吃完了,netstat命令查看网络连接数,才区区几K。问题应该是Erlang内存泄漏了。
前面一部分直接从以前的 blog copy 过来。 http://blog.yunba.io/erlang-memory-leak/
随着项目越来越依赖Erlang,碰到的问题也随之增加。前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程。线上系统用的是Erlang R16B02版本。
问题描述
有几台线上系统,运行一段时间,内存飙升。系统模型很简单,等待网络新连接,pool中找新可用process进行处理。top命令观察,发现内存都被Erlang进程给吃完了,netstat命令查看网络连接数,才区区几K。问题应该是Erlang内存泄漏了。
分析方法
Erlang系统有个好处,可以直接进入线上系统,在生产现场分析问题。我们系统是通过 Rebar 管理的,可以用不同方法进入线上系统。
本机登录
可以直接登录到线上机器,然后通过以下命令attach到Erlang系统里面
$ cd /path/to/project $ rel/xxx/bin/xxx attach (node@host)>
通过remote shell
获取Erlang系统的cookie
$ ps -ef |grep beam %%找到参数 --setcookie
新开一个shell,使用同样的cookie,不同的nodename
$ erl --setcookie cookiename -name test@127.0.0.1
用start remote shell进入系统
Erlang R16B02 (erts-5.10.3) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.3 (abort with ^G) (test1@127.0.0.1)1> net_adm:ping('node@127.0.0.1'). pong (test1@127.0.0.1)2> nodes(). ['node@127.0.0.1'] (test1@127.0.0.1)3> User switch command --> h c [nn] - connect to job i [nn] - interrupt job k [nn] - kill job j - list all jobs s [shell] - start local shell r [node [shell]] - start remote shell q - quit erlang ? | h - this message --> r 'node@127.0.0.1' --> j 1 {shell,start,[init]} 2* {'node@127.0.0.1',shell,start,[]} --> c 2
分析流程
Erlang有很多工具,可以分析系统信息,比如 appmon , webtool 。但是系统内存严重不足,已经没有办法启动这些 工具 了,幸好还有Erlang shell。
Erlang shell自带了很多有用的 命令 ,可以用help()方法查看
> help().
Erlang系统内存消耗情况
top结果显示,是内存问题,所以第一步可以先看看Erlang的系统内存消耗情况
> erlang:memory().
memory() 可以看到Erlang emulator分配的内存,有总的内存,atom消耗的内存,process消耗的内存等等。
用 recon 工具
copy recon beam
$ git clone https://github.com/ferd/recon.git $ cd recon/ $ ./rebar compile # 根据实际情况,使用项目发布的 ebin 路径 $ cp ebin/*.beam /home/yunba/elockaccount/rel/eLockAccount/lib/eLockAccount-1/ebin/
recon 命令
加载 recon
> l(recon). {module,recon} > l(recon_lib). {module,recon_lib} > l(recon_alloc). {module,recon_alloc}
查看使用内存最多的 10 个进程
> recon:proc_count(memory, 10). [{<0.1470.0>,9571192, [eLockAccount_monthly_credit_update_server, {current_function,{gen_server,loop,6}}, {initial_call,{proc_lib,init_p,5}}]}, {<0.1114.0>,8238352, [code_server, {current_function,{code_server,loop,1}}, {initial_call,{erlang,apply,2}}]}, {<0.8173.1>,4720632, [{current_function,{gen_server,loop,6}}, {initial_call,{proc_lib,init_p,5}}]}, {<0.1113.0>,1577592, [kernel_sup, {current_function,{gen_server,loop,6}}, {initial_call,{proc_lib,init_p,5}}]}, {<0.1167.0>,426816, [lager_event, {current_function,{gen_event,fetch_msg,5}}, {initial_call,{proc_lib,init_p,5}}]}, {<0.1108.0>,372464, [error_logger, {current_function,{gen_event,fetch_msg,5}}, {initial_call,{proc_lib,init_p,5}}]}, {<0.1136.0>,318208, [{current_function,{shell,get_command1,5}}, {initial_call,{erlang,apply,2}}]}, {<0.1109.0>,285120, [application_controller, {current_function,{gen_server,loop,6}}, {initial_call,{erlang,apply,2}}]}, {<0.16674.2>,264096, [{current_function,{shell,shell_rep,4}}, {initial_call,{erlang,apply,2}}]}, {<0.1147.0>,196976, [{current_function,{file_io_server,server_loop,1}}, {initial_call,{erlang,apply,2}}]}]
总结
Erlang提供了丰富的工具,可以在线进入系统,现场分析问题,这个非常有助于高效、快速的定位问题。同时,强大的Erlang OTP让系统有更稳定的保证。我们还会继续挖掘Erlang,期待有更多的实践分享。
以上所述就是小编给大家介绍的《用 recon 定位 Erlang 内存泄露问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 定位golang内存泄露
- 认识绝对定位,相对定位
- 移动端页面头部固定定位的绝对定位实现
- webgl(three.js)实现室内定位,楼宇bim、实时定位三维可视化解决方案——第五课
- IP 地址怎么定位?
- # CSS 绝对定位释义
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。