[erlang-questions] 'ssl_otp_session_cache' ets table

Bogdan Andu bog495@REDACTED
Wed Nov 5 13:08:22 CET 2014


Hi,

I performed a series of test regarding the an Erlang SSL server.

In this setup a major role is played by the table called
'ssl_otp_session_cache', and of course the processes using it.

The problem is that the size of table increases constantly and, because an
ets table does not automatically deallocate memory unless the object are
deleted from that table, the size of table remains the same even if there
no ssl connections to server.

For example, with a single client running 'ad infinitum' the table
increases at a rate of 5 MBytes/hour. In 12 hours there are allocate around
60 MB of memory only for this table.

Some info about this:
$ erl -sname console@REDACTED -remsh n1@REDACTED -setcookie operator
Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:2:2] [async-threads:10]
[kernel-poll:false]

Eshell V6.2  (abort with ^G)


(n1@REDACTED)1> ets:i().
 id              name              type  size   mem      owner
 ----------------------------------------------------------------------------
 12              cookies           set   0      291      auth
 4111            code              set   410    26132    code_server
 8208            code_names        set   58     7459     code_server
 12307           httpc_manager__session_cookie_db bag   0      291
httpc_manager
 16404           ssl_otp_cacertificate_db set   0      291      ssl_manager
 20501           ssl_otp_ca_file_ref set   0      291      ssl_manager
 24598           ssl_otp_pem_cache set   3      360      ssl_manager
* 28695           ssl_otp_session_cache ordered_set 138057 8421893
ssl_manager*
 32797           dets              duplicate_bag 2      308      dets
 40990           ign_requests      set   0      291      inet_gethost_native
 45087           ign_req_index     set   0      291      inet_gethost_native
 2261635104      shell_records     ordered_set 0      81       <0.30638.37>
 ac_tab          ac_tab            set   33     2216
application_controller
 code_map        code_map          set   100    2791     <0.72.0>
 config          config            set   12     892      <0.72.0>
 dets_owners     dets_owners       set   1      298      dets
 dets_registry   dets_registry     set   1      299      dets
 file_io_servers file_io_servers   set   1      344      file_server_2
 global_locks    global_locks      set   0      291      global_name_server
 global_names    global_names      set   0      291      global_name_server
 global_names_ext global_names_ext  set   0      291      global_name_server
 global_pid_ids  global_pid_ids    bag   0      291      global_name_server
 global_pid_names global_pid_names  bag   0      291      global_name_server
 httpc_manager__handler_db httpc_manager__handler_db set   0      291
httpc_manager
 httpc_manager__session_db httpc_manager__session_db set   0      291
httpc_manager
 inet_cache      inet_cache        bag   0      291      inet_db
 inet_db         inet_db           set   29     600      inet_db
 inet_hosts_byaddr inet_hosts_byaddr bag   0      291      inet_db
 inet_hosts_byname inet_hosts_byname bag   0      291      inet_db
 inet_hosts_file_byaddr inet_hosts_file_byaddr bag   0      291      inet_db
 inet_hosts_file_byname inet_hosts_file_byname bag   0      291      inet_db
 models          models            set   3      28952    <0.72.0>
 sys_dist        sys_dist          set   1      334      net_kernel
ok
(n1@REDACTED)5> ets:info(ssl_otp_session_cache).
undefined
(n1@REDACTED)7> (8421893*8)/1024.
65796.0390625
(n1@REDACTED)8> memory().
[{total,92699464},
 {processes,8964000},
 {processes_used,8963152},
 {system,83735464},
 {atom,429569},
 {atom_used,421768},
 {binary,199040},
 {code,10411520},
 {ets,69163032}]

The memory allocated to table 'ssl_otp_session_cache' is roughly 64 MB in
12 hours.

On an OpenBSD platform such process gets killed immediately it hits some
memory and/or CPU limits.

To make this test on OpenBSD I had to put 'infinit' to memory, otherwise
the Erlang VM would be killed.

How can one control , tweak or configure this table such that it does not
accumulate such data at such high rate.

I seems the table being created private, and there is no way to
ets:delete_all_objects/1 from table manually.

I know that this table caches some SSL data related to clients, but the
client has the same IP address,
and I wonder why is neccesary to store a lot of SSL connection info about
the same client when only the ephemeral peer port
differs?

How the size of this table can be held in reasonable limits and the rate
it's size increases ?

Please if somebody shed some light on these issues.

Thank you,

Bogdan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20141105/533bad44/attachment.htm>


More information about the erlang-questions mailing list