首先使用erlang:memory()确定是哪个部分内存吃紧,根据输出的内容,比对内存占用大小,有针对性地进行分析。在erlang系统里内存的单位为word,通过erlang:system_info(wordsize)接口可以看到一个word占用多少个字节。如32位系统是4字节,64位系统是8字节。

> memory().
[{total,13079568},
{processes,4214248},
{processes_used,4213320},
{system,8865320},
{atom,202481},
{atom_used,189725},
{binary,52800},
{code,4618749},
{ets,263848}]
> erlang:system_info(wordsize).
8

1.进程占用过多内存的情况(processes值较大)

可用etop查找内存占用高的进程,也可以排序所有进程(erlang:processes/0可获得所有进程pid)的内存占用(erlang:process_info(Pid, heap_size)可获得进程内存占用)。

找到目标进程后分析该进程的信息process_info(Pid)进一步发现问题,通常找到目标进程,就能从代码和进程状态中分析出问题。可能的问题有:

是否陷入非尾递归的死循环?(如果一直吃CPU不吃内存则可能是尾递归的死循环导致)

进程的主循环是否没用尾递归,导致调用栈无限增长?

是否存入过多不必要的数据到进程字典中且没有及时erase?

gen_server的state中是否存入过多内容?

etop memory示例:

> spawn(fun() -> etop:start([{sort, memory}]) end).
<0.34.0> ========================================================================================
nonode@nohost 11:50:35
Load: cpu 0 Memory: total 12642 binary 29
procs 28 processes 4076 code 4454
runq 0 atom 198 ets 256 Pid Name or Initial Func Time Reds Memory MsgQ Current Function
----------------------------------------------------------------------------------------
<0.7.0> application_controll '-' 7270 426440 0 gen_server:loop/6
<0.12.0> code_server '-' 98774 142688 0 code_server:loop/1
<0.26.0> erlang:apply/2 '-' 9840 122072 0 shell:get_command1/5
<0.3.0> erl_prim_loader '-' 181804 62856 0 erl_prim_loader:loop
<0.23.0> user_drv '-' 4122 26496 0 user_drv:server_loop
<0.0.0> init '-' 2347 24520 0 init:loop/1
<0.32.0> erlang:apply/2 '-' 1668 21424 0 shell:eval_loop/3
<0.11.0> kernel_sup '-' 1543 12152 0 gen_server:loop/6
<0.25.0> group:server/3 '-' 1613 11864 0 group:more_data/5
<0.6.0> error_logger '-' 227 6904 0 gen_event:fetch_msg/
========================================================================================
>etop:stop().

2.ets表占用过多内存的情况(ets值较大)

排序所有ets表(ets:all/0可获得所有ets表名Tab)的内存占用(ets:info(Tab, memory)可获得内存占用),找出最占内存的ets表进行分析。ets表过大,是因为insert过多内容,却很少delete。分析表的功能,寻求恰当的方式做优化,节源开流。

ets表内存战斗排序示例:

> lists:sublist(lists:reverse(lists:keysort(2,[{T, ets:info(T, memory)} || T <- ets:all()])), 10).
[{1,11220},
{4098,7022},
{ac_tab,942},
{inet_db,497},
{global_locks,302},
{global_names,302},
{global_names_ext,302},
{global_pid_names,302},
{global_pid_ids,302},
{inet_cache,302}]

一些优化的思路:

定期将不常用数据清理出内存

选择更优的数据结构(如选择binary存字符串,而不是list)

优化掉冗余的数据(如相同数据拷贝多份的情况,可以优化成只保存一份数据

PS:本文非权威,仅为个人思考总结

Erlang内存吃紧之解决思路的更多相关文章

  1. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

  2. Erlang服务器内存吃紧的优化解决方法

    问题提出:服务器100万人在线,16G内存快被吃光.玩家进程占用内存偏高 解决方法: 第一步:erlang:system_info(process_count). 查看进程数目是否正常,是否超过了er ...

  3. XCode编译文件过多导致内存吃紧解决方法

    XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

  4. 【java虚拟机】内存溢出解决思路

    转自:https://blog.csdn.net/u013521220/article/details/79523633 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知 ...

  5. Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

    我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

  6. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  7. java高并发解决思路

    一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单,随着互联网业务的不断丰富,网站 ...

  8. 海量数据解决思路之Hash算法

    海量数据解决思路之Hash算法   一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...

  9. [转载]Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

    Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 转载至:https://www.sdnlab.com/17530.html 我们使用Linux作为服务器操作系统时,为了达到高并发处理 ...

随机推荐

  1. 自学Python2.1-基本数据类型-字符串str(object)

    Python str方法总结 class str(object): """ str(object='') -> str str(bytes_or_buffer[, ...

  2. Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.6.RELEASE:repackage failed: Unable to find main class

    异常 [INFO] --- spring-boot-maven-plugin:1.5.6.RELEASE:repackage (default) @ spring-boot-starter-log - ...

  3. MongoDB集群搭建-副本集

    MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...

  4. 你的Excel表格颜色搭配的对么?

    在昨天的文章中,我们讨论了<Excel表格制作的基本九大原则>,今天我们还要继续聊聊,Excel表格的颜色搭配规则. 一个表格的美丑与否,除了基本的格式之外,如何配色也是非常关键的,如果只 ...

  5. VR\AR 使用 SceneKit

    VR\AR 使用 SceneKit http://www.jianshu.com/c/70d63e3941fd

  6. arcgis api for js热力图优化篇-不依赖地图服务

    前面我写过一篇文章,介绍如何实现arcgis api的热力图效果,但是依赖arcgis server发布的地图服务来获取热力图的数据源.实际应用中,很多业务数据来源数据库,并不一定是从地图服务来获取的 ...

  7. Python 项目实践二(下载数据)第四篇

    接着上节继续学习,在本节中,你将下载JSON格式的人口数据,并使用json模块来处理它们.Pygal提供了一个适合初学者使用的地图创建工具,你将使用它来对人口数据进行可视化,以探索全球人口的分布情况. ...

  8. python链接mysql

    1.安装MySQLdb MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 下载地址: ht ...

  9. bat获取系统时间修改系统密码

    @echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...

  10. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...