Erlang内存吃紧之解决思路
首先使用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内存吃紧之解决思路的更多相关文章
- java内存溢出的解决思路
原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...
- Erlang服务器内存吃紧的优化解决方法
问题提出:服务器100万人在线,16G内存快被吃光.玩家进程占用内存偏高 解决方法: 第一步:erlang:system_info(process_count). 查看进程数目是否正常,是否超过了er ...
- XCode编译文件过多导致内存吃紧解决方法
XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧
- 【java虚拟机】内存溢出解决思路
转自:https://blog.csdn.net/u013521220/article/details/79523633 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知 ...
- Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...
- java高并发解决思路
一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单,随着互联网业务的不断丰富,网站 ...
- 海量数据解决思路之Hash算法
海量数据解决思路之Hash算法 一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...
- [转载]Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 转载至:https://www.sdnlab.com/17530.html 我们使用Linux作为服务器操作系统时,为了达到高并发处理 ...
随机推荐
- iOS白名单设置
在做分享.支付的时候需要跳转到对应的app,这里有需要设置的白名单列表<key>LSApplicationQueriesSchemes</key> <array> ...
- 【python】字符串格式化
- Eclipse 问题整理
新建servlet报错,提示找不到javax.servlet包 解决的方法:把tomcat安装包里的lib目录下的servlet-api.jar拷贝一份到工程文件夹下的web目录下的WEB-INF目录 ...
- Mybatis-----优化配置文件,基于注解CR
这篇主要写配置文件的优化,例如 jdbc.properties 配置文件 ,引入数据库的文件,例如driver,url,username,password 等,然后在 SqlMapConfig.x ...
- 搭建lnmp教程
LNMP指的是一个基于CentOS/Debian 上安装Nginx.PHP.MySQL.php.可以在独立主机上轻松的安装LNMP生产环境. 1 安装nginx 如果是一台新的服务器可直接安装(若以前 ...
- 关于MAX()函数的一点思考
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/103 考虑如下表和sql: CREATE TABLE `ikno ...
- 《Linux系统编程手册》读书笔记——第2章基本概念
操作系统的核心--内核 内核的职责 进程调度:Linux属于抢占式多任务操作系统,多个进程可同时驻留于内存,且每个进程都能获得对CPU的使用权.哪些进程获得对CPU的使用,以及每个进程能使用多长时间 ...
- nova创建虚拟机源码系列分析之二 wsgi模型
openstack nova启动时首先通过命令行或者dashborad填写创建信息,然后通过restful api的方式调用openstack服务去创建虚拟机.数据信息从客户端到达openstack服 ...
- git正确的删除远程仓库的文件并用.gitignore忽略提交此文件
我向远程仓库提交了如下文件src/ pom.xml target/ WebContent/,发现没必要提交target目录. 于是做了如下操作: git rm -r --cached target g ...
- 原来你是这样的JAVA[02]-包、传参、构造器
一.包(package) 在java程序中,一个java源文件称为编译单元,以.java后缀命名.编译单元内可以有一个public类,类名必须与文件名相同.注意:每个编译单元只能有一个public类. ...