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作为服务器操作系统时,为了达到高并发处理 ...
随机推荐
- 自学Zabbix3.5.6-监控项item-Value mapping值映射
zabbix为了显示更人性化的数据,在使用过程中,我们可以将获取到得数据映射为一个字符串.比如,我们写脚本监控MySQL是否在运行中, 一般返回0表示数据库挂了,1表示数据库正常,还有各种各样的监控都 ...
- 【java设计模式】【创建模式Creational Pattern】简单工厂模式Simple Factory Pattern(静态工厂方法模式Static Factory Method Pattern)
public class Test { public static void main(String[] args){ try{ Factory.factory("A").doSt ...
- iOS 字体设置,字体类型展示
字体设置: [UIFont fontWithName:@"Helvetica" size:17.0]]; 字体名字,如图 UIFont fontWithName 后不知道字体的名字 ...
- iOS cocos2d游戏引擎的了解之一
ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...
- 浅谈,html\css脱离标准文档流相关
(个人知识有限,难免有误,请见谅) 标准文档流,顾名思义,是要按照一定规矩排列的,默认的就是元素会从左至右,从上至下排列,块级会独占一行,行内元素会和小伙伴们共享一行. 本来在标准文档流下,各个元素相 ...
- Xamarin Android自定义文本框
xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...
- [C#]使用Redis来存储键值对(Key-Value Pair)
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.5及以 ...
- 统计nginx单个IP访问日志并获取IP来源
#!/usr/bin/env python #coding=utf-8 import requests from urllib2 import urlopen # import lxml.html f ...
- Python中range()和len()
- CSS3背景渐变。。。
CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用 CSS3 G ...