<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">The default maximum number of ets
      tables is 2053.<br>
      <br>
      I don't know the rationale behind this magic number but is has
      been like this at least since R13B03 where my git history ends.<br>
      This is also the minimum limit, i.e you can not force a lower
      limit than this.<br>
      <br>
      So, the documentation is wrong or at least misleading when it says
      "approximately 1400 tables".<br>
      <br>
      /Sverker, Erlang/OTP<br>
      <br>
      <br>
      On 04/21/2014 08:40 PM, Charles Zilm wrote:<br>
    </div>
    <blockquote
cite="mid:CAOn8tt-D-6Bt-k5tePLmixJX62raoxMfH4VwjQ-K3jOYh32_bw@mail.gmail.com"
      type="cite">
      <pre wrap="">All,

I'm currently debugging a system that uses mnesia as a data cache layer to
store the state of client processes. Each client process represents a
single TCP connection to the application, there may be thousands of
connections. When a connection is lost the client process is alerted and
the mnesia cache is updated. Similarly when a new connection is made a
client process is spawned and the mnesia cache is updated to reflect the
new connection.

Testing has shown that losing thousands of connections at once can cause
the application to crash due to ets table exhaustion. This makes perfect
sense, thousands of transactions being spawned in short order is likely to
exhaust the pool. What does not make sense is that the transactions spawned
by the client processes never trigger the system_limit error. That is
always triggered by a separate timer triggered transaction that just
happens to run while the client process transactions are processing.

Tracing calls to ets:new and printing out length(ets:all()) after each call
revealed that prior to crash our system reports using more ets tables than
is should be allowed to.

So a few questions,

1) How does ets determine if it can create a new table? length(ets:all())
returning 1800 when the system limit is 1400 is confusing.

2) Why could it be that only the timer triggered transaction crashes due to
ets table exhaustion? With the number of terminating connections I'd expect
to see a number of client processes terminating for this same reason. Log
verification shows all client processes terminated with the expected reason.

Any insights would be most appreciated.

Thanks,

Charles

</pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
erlang-questions mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>