erlang 内存问题

1.生产上的服务器,运行到2天左右就会产生core文件,在家折腾了两天,把一些过程记录下来,

希望能帮上有需要的人。

gdb  /usr/lib64/erlang/xxx/xxx/beam.smp  core.3435

....

gdb) bt

#0  0x0000003b5bc30265 in raise () from /lib64/libc.so.6

#1  0x0000003b5bc31d10 in abort () from /lib64/libc.so.6

#2  0x000000000044f3b0 in erl_exit ()

#3  0x00000000004380a4 in erts_alc_fatal_error ()

#4  0x0000000000438131 in erts_alloc_n_enomem ()

#5  0x000000000051e918 in ?? ()

#6  0x000000000052090f in ?? ()

#7  0x000000000051d8fc in erts_garbage_collect ()

#8  0x00000000004bc3c0 in schedule ()

看到erlang运行时分配内存不足

2. 代码有死循环? or 非法的用户用脚本在刷服务

那就远程看一下在线的服务器运行情况

3. 看日志和内存分配情况

3.1 远程调用

ctrl + G

r ‘[email protected]‘

(或是 erl -name ‘[email protected]‘ -setcookie xxxx  -remsh ‘[email protected])

3.2 查看内存使用情况

erlang:memory(processes).

3788 928 024

erlang:memory(ets).

970 627 328

erlang:memory(total).

4 863 713 656

erlang 系统运行时,内存占了近5个G,用不了24小时,系统肯定会再崩溃,

从上面可以看到ets表占用比较高,进程占用更高,

猜想下,有没有可能,是ets表导致的owner进程 占用了过4G的内存?

3.3 查看ets表的信息

ets:i().

sessions        sessions          set   232182 116713476   xxxx_service      (116713476 words = * 8 = 933 707 808 bytes  ~= 1G  )

sys_dist        sys_dist          set   3      455      net_kernel

发现sessions表有在线用户23W,这个在线用户量,到是在正常范围,但会话会轮询,定期清除闲置的进程用户,

不应该一直保持在23w,一定是那里没有来得急释放。

xxx_service 的代码里找到释放缓存的代码,在本地插入一些用户,测试下,结果释放sessions没有问题。

怎么回事,可以释放,结果没有释放,代码应该没有问题。

往往这时,请再坚持一下,代码可能有问题,接着找吧。

3.4 既然进程占内存那么高,那就看看是那些进程,运行 etop

spawn(fun() ->    etop:start([{output, text}, {interval, 3}, {lines, 20}, {sort, memory}])  end).

Pid            Name or Initial Func    Time    Reds  Memory    MsgQ Current Function

----------------------------------------------------------------------------------------

<14099.124.0>  xxxxxxxxxxx_service          ‘-‘****************       0 gen_server:loop/6

<14099.41.0>   xxxx_server              ‘-‘ 618605525150288       0 gen_server:loop/6

排第一的,内存多少都变*** 号了,这是非常高了才这样的。估计1G应该是有的,而且还一直在执行loop,说明

是什么东西处理不过来。

3.5 查看占用内存最多的进程的信息

Pid = whereis(xxxxxxxxxxx_service).

process_info(Pid) .

{

{total_heap_size,456131400},

{heap_size,228065700},

{stack_size,9}

456131400 * 8  = 3.6G 内存  (words * 8 ,64位系统)

基本可以肯定问题出在了这个进程。

这个进程很有可能是在操作ETS时,出的问题,应该找该模块与ets相关的代码。

3.6  找是找到了,ets相关的操作,但测试还是可以清除,也没有生产的问题。

猜想,是不是测试时用户的量没有达到。

再看看那段代码,有一个select的操作,是查找某段时间内,所有sessions,

然后对sessions进行持久化操作,然后清除,

当23W 用户同时进行持久,这个进程会不会阻塞?

3.7  分批次进次持久和清除操作,花了半天的时间,开发好,测试没问题了,

但感觉还有点不爽快,因为效率不高啊。

3.8  持久的清除解藕。

4. 上线12小时后,再查看线上服务的结果

11768  103  7.6 1110136 612668

物理内存只存7.6,

再看sessions 只有2W左右

这样,码农的心情变好了点........

5.谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 01:36:45

erlang 内存问题的相关文章

Erlang 内存泄漏分析

随着项目越来越依赖Erlang,碰到的问题也随之增加.前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程.线上系统用的是Erlang R16B02版本. 问题描述 有几台线上系统,运行一段时间,内存飙升.系统模型很简单,有网络连接,pool中找新的process进行处理.top命令观察,发现内存都被Erlang进程给吃完了,netstat命令查看网络连接数,才区区几K.问题应该是Erlang内存泄漏了. 分析方法 Erlang系统有个好处,可以直接进入线上系统,

Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)

Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-factory.com/conference/show/conference-6/home/#lukas-larsson 在这里可以下载slides和观看视频(为了方便不方便科学上网的同学,我把视频搬运到了 http://v.youku.com/v_show/id_XNzA1MjA0OTEy.html )

Erlang C1500K长连接推送服务-性能

Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界.毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响太大,再者就是没有多线接入,每个机房都得扔那么几台机器吧,所以1M就能满足要求. Erlang 作为长连接网关有着天生的优势: - 擅长与IO密集型业务,也要求将网关设计尽量简单,认证完后,简单解析报头,就直接将请求转发给后端服务处理 - 网络层有beam c 实现得非常高效 ,erlang 代码只

Linux下多核环境Erlang的SMP测试

目标 (1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响: (2)       Erlang虚拟机的内存增加机理: (3)       Erlang进程的调度情况: (4)       Linux下监控cpu的使用状况 实验环境 联想小型机:操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本:Linux server1 2.6.32-358.el6.x86_64#1 SMP CPU型号

Erlang基础 -- 介绍 -- Erlang特点

前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言,函数式是一种编程模型,将计算机中的运算看做是数学中的函数计算,可以避免状态以及变量的概念. 对象是面向对象的第一型,函数式编程语言也是一样,函数是函数式编程的第一型.函数是Erlang编程语言的基本单位,在Erlang里,函数是第一型,函数几乎会被用作一切,包括最简单的计算.所有的概念都是由函数表

Archive for the ‘Erlang’ Category 《Erlang编程指南》读后感

http://timyang.net/category/erlang/ 在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注. 按:此为客座文章,投稿人为新浪微博基础研发工程师赵鹏城(http://weibo.com/iamzpc),以下为原文.在对一个分布式KV存储系统的研究过程中,我有幸遇到了Erlang语言.因此,我研究工作的第一目标就是快速入门Erlang语言并在实际研究过程中进一步深入理解Erlang的精髓.在

Linux下多核环境Erlang的SMP測试

目标 (1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响: (2)       Erlang虚拟机的内存添加机理: (3)       Erlang进程的调度情况: (4)       Linux下监控cpu的使用状况 实验环境 联想小型机:操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本号:Linux server1 2.6.32-358.el6.x86_64#1 SMP CPU型

[Erlang 0122] Erlang Resources 2014年1月~6月资讯合集

虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ 1月   114 RR Elixir with José Valim by CHARLES MAX WOOD on JULY 17, 2013 http://rubyrogues.com/114-rr-elixir-with-jose-valim/ "The Erlang Runtime System"

Erlang垃圾回收机制的二三事

声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转载请注明出处. Erlang需要解决的重要问题之一就是为实现极高响应能力的软实时系统创建平台.这样的系统需要一个快速的垃圾回收机制,而这个机制不会阻止系统及时的响应.另一方面,当我们把Erlang看作一种用无损更新属性的不可改变语言时,这个垃圾回收机制就显得更加重要了,因为这种语言有很高的几率产生垃