IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Erlang非业余研究 2012-01-29 20:55:01 累计浏览 1,669 次
本机暂存

    原创文章,转载请注明: 转载自Erlang非业余研究

    本文链接地址: 很容易忽略的ETS表个数限制问题

    最近经常碰到ets表使用的数目超过系统的限制导致Erlang应用异常的案例。 比如说神锋同学报告说在ssh模块里面,最多只能打开500个左右链接,系统空闲的很,但是无法继续加大链接。 浩庭同学报告说mnesia的事务只能开1千多,多了就上不去了。这些问题看起来没有关联。但是其实和ets都有很大的关系,而且会报system_limit错误。

    Erlang系统的限制见这里: http://www.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就好了。

    但是如何知道N设成多大比较合适呢?

    erl shell下按下CTRL+C 再按下i就告诉你现在这些核心资源包括ets的使用情况,具体见以下代码。 你一看用的差不多了,就搞大点。

void
info(int to, void *to_arg)
{
    erts_memory(&to, to_arg, NULL, THE_NON_VALUE);
    atom_info(to, to_arg);
    module_info(to, to_arg);
    export_info(to, to_arg);
    register_info(to, to_arg);
    erts_fun_info(to, to_arg);
    erts_node_table_info(to, to_arg);
    erts_dist_table_info(to, to_arg);
    erts_allocated_areas(&to, to_arg, NULL);
    erts_allocator_info(to, to_arg);
}

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. gen_tcp发送进程被挂起起因分析及对策 (累计阅读 37,821)
  2. hbase介绍 (累计阅读 12,367)
  3. HBase技术介绍 (累计阅读 8,076)
  4. gen_tcp发送缓冲区以及水位线问题分析 (累计阅读 6,063)
  5. whatsapp深度使用Erlang有感 (累计阅读 5,829)
  6. Erlang match_spec引擎介绍和应用 (累计阅读 5,638)
  7. 函数式编程很难,这正是你要学习它的原因 (累计阅读 5,421)
  8. php-erlang (累计阅读 5,268)
  9. 基于MySQL的高可用可扩展架构探讨 (累计阅读 5,008)
  10. 转载:cassandra读写性能原理分析 (累计阅读 4,790)