很容易忽略的ETS表个数限制问题

问题描述

最近经常碰到ets表使用的数目超过系统的限制导致Erlang应用异常的案例。 比如说神锋同学报告说在ssh模块里面,最多只能打开500个左右链接,系统空闲的很,但是无法继续加大链接。 浩庭同学报告说mnesia的事务只能开1千多,多了就上不去了。这些问题看起来没有关联。但是其实和ets都有很大的关系,而且会报**_limit错误。Erlang系统的限制见这里: **://**.erlang.org/doc/efficiency_guide/advanced.html#id215064其中和ets相关的: Ets table 内存消耗 Initially 768 words + the size of each element (6 words + size of Erlang data). The table will grow when necessary. Ets-tables The default is 1400, can be changed with the environment variable ERL_MAX_ETS_TABLES.这个值非常的偏保守,我们通常的服务器都有几十G的内存,因为ETS基本是消耗内存的,所以我们不介意都开大点。回到前面的问题,ssh出问题的原因是它每个链接需要3个ets, 而mnesia一个事务也要消耗1个ets表。知道了问题的本质就很容易解决问题:erl -env ERL_MAX_ETS_TABLES NNNNN就好了。再来顺手**ejabberd的配置文件的说明: # ERL_MAX_ETS_TABLES: Maximum number of ETS and Mnesia tables # # The number of concurrent ETS and Mnesia tables is limited. When the limit is # reached, errors will appear in the logs: # ** Too many db tables ** # You can safely increase this limit when starting ejabberd. It impacts memory # consumption but the difference will be quite small. # # Default: 1400 # #ERL_MAX_ETS_TABLES=1400但是如何知道N设成多**较合适呢?erl shell下按下CTRL+C 再按下i就告诉你现在这些核心资源包括ets的使用情况,具体见以下代码。 你一看用的差不多了,就搞大点。 void info(int to, void *to_arg)02{03 erts_memory(&to, to_arg, NULL, THE_NON_VALUE);04 atom_info(to, to_arg);05 module_info(to, to_arg);06 export_info(to, to_arg);07 register_info(to, to_arg);08 erts_fun_info(to, to_arg);09 erts_node_table_info(to, to_arg);10 erts_dist_table_info(to, to_arg);11 erts_allocated_areas(&to, to_arg, NULL);12 erts_allocator_info(to, to_arg);13}其实还有一个更简单的方法用crashdump viewer**实际系统中有多少进程,每个进程消耗多少port和ets表。我来说下大概的步骤:1. 产生crashdump: 在实际运行的系统中按下CTRL+C再按大写的A,看到系统退出,生成我们系统运行期的快照。2. 运行webtool: webtool:start() 他会告诉我们web地址,打开浏览器,打开该地址。3. 在webtool中打开crashdump viewer模块,加载我们的crashdump文件进行分析,得到系统运行期的友好的解释。4. 在进程这一栏里面可以看到每个进程的状态和使用的资源。根据这些信息稍微估算下系统需要开多少process和port,提前规划好。祝玩的开心!

时间: 2024-11-10 00:15:35

很容易忽略的ETS表个数限制问题的相关文章

很奇怪的数据结构顺序表问题

问题描述 很奇怪的数据结构顺序表问题 用c++写了一个顺序表的程序,如下 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED using namespace std; template <class T> class seqList { private: T * data; int maxSize; int last; public: seqList(int sz = 2); ~seqList(); bool Insert(int i,

sql-频繁查询一张不会变(很少变)的表,有什么办法提高效率,表中数据较多,大约千万条以上

问题描述 频繁查询一张不会变(很少变)的表,有什么办法提高效率,表中数据较多,大约千万条以上 如题,对于频繁查询一张不会变(很少变)的表,有什么办法提高效率,即使变了,也不需要即时数据,就像缓存一样定期更新一下都行,表中数据较多,大约千万条级别,求思路,对SQL只了解皮毛 解决方案 看你怎么查询,是统计还是取得某个条件的数据,还是根据id找某个数据. 可以采用的方式,索引,创建冗余的临时表和临时字段,存储过程 解决方案二: 另外,sql server 2014/2016数据库,支持内存表,只要你

做产品很容易忽略掉产品和用户的那个“接触点”

摘要: 写这篇文章,主要是因为WISE1.0大会第二天中午我和城觅的创始人琪缘约着吃饭,吃着吃着就聊到对第一天下午demo项目的看法,聊完之后觉得还挺受启发的,所以把一些只言片语的聊天 写这篇文章,主要是因为WISE1.0大会第二天中午我和城觅的创始人琪缘约着吃饭,吃着吃着就聊到对第一天下午demo项目的看法,聊完之后觉得还挺受启发的,所以把一些只言片语的聊天笔记贴在这里,分享给大家. 总体来说,琪缘比较喜欢享借和敢玩这两个项目,喜欢的原因也比较简单,享借是他觉得这个产品可以激发人们内心光明的一

怎么样写一段高效,安全的sql查询代码---(很基础,但是大家很容易忽略的)

安全 看一看这段代码,让我们来看看主要存在的问题 //设置SQL语句            insertstr="insert into userinfo(name,password,email,phone,mobile,post,address) VALUES('";            insertstr +=  this._name.Trim() + "','";            insertstr +=  this._password.Trim()

win8/win8.1系统怎么添加excel工作表个数

  具体方法如下: 1.打开excel2013,这个时候可以看到工作簿只含有一个工作表,单击"文件"标签; 2.选择"选项"命令; 3.在弹出的"excel选项"对话框中切换至"常规"选项面板; 4.在"新建工作簿时"区域设置"包含的工作表数"数值3(我选择3个工作表)单击"确定 "按钮; 5.新建一个空白工作簿,可以看到界面底部显示sheet1.sheet2和she

很可爱的输入框_表单特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

《数据结构与算法:Python语言描述》一3.2顺序表的实现

3.2顺序表的实现 顺序表的基本实现方式很简单:表中元素顺序存放在一片足够大的连续存储区里,首元素(第一个元素)存入存储区的开始位置,其余元素依次顺序存放.元素之间的逻辑顺序关系通过元素在存储区里的物理位置表示(隐式表示元素间的关系). 3.2.1基本实现方式 最常见情况是一个表里保存的元素类型相同,因此存储每个表元素所需的存储量相同,可以在表里等距安排同样大小的存储位置.这种安排可以直接映射到计算机内存和单元,表中任何元素位置的计算非常简单,存取操作可以在O(1) 时间内完成. 设有一个顺序表

监控和管理Oracle UNDO表空间的使用

    对Oracle数据库UNDO表空间的监控和管理是我们日常最重要的工作之一,UNDO表空间通常都是Oracle自动化管理(通过undo_management初始化参数确定):UNDO表空间是用于存储DML操作的前镜像数据,它是实例恢复,数据回滚,一致性查询功能的重要组件:我们常常会忽略对它的监控,这会导致UNDO表空间可能出现以下问题:1).空间使用率100%,导致DML操作无法进行.2).告警日志中出现大量的ORA-01555告警错误.3).实例恢复失败,数据库无法正常打开. 一.对Or

c语言-编程算法 - 最小的k个数 代码(C)

问题描述 编程算法 - 最小的k个数 代码(C) 请解释一下在c语言中怎样编写在输入的N个数中找到k个最小的数 解决方案 排序吧,再输出前k个数 解决方案二: 遍历,找出MAX,移除MAX,循环K遍 解决方案三: 我觉得你的问题是怎么将输入的数保存下来,你可以先定义一个vector. vector vec;int iNUm = 0;while(cin>>iNum)//需要结束的时候输入ctrl+z;{ vec.push_back(iNum);}//最后对整个vec进行排序,取得最小的值 解决方