From 572e50e0a241054f95dd45fe35b9794e054bbd36 Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 13 Feb 2023 17:55:03 +0100 Subject: [PATCH] perf: add TLS config hibernate_after, reduce memory footprint --- apps/emqx/i18n/emqx_schema_i18n.conf | 11 ++++++++ apps/emqx/src/emqx_schema.erl | 10 +++++++ apps/emqx/test/emqx_listeners_SUITE.erl | 35 +++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/apps/emqx/i18n/emqx_schema_i18n.conf b/apps/emqx/i18n/emqx_schema_i18n.conf index 2ba5e7f52..6faa0c511 100644 --- a/apps/emqx/i18n/emqx_schema_i18n.conf +++ b/apps/emqx/i18n/emqx_schema_i18n.conf @@ -1495,6 +1495,17 @@ In case PSK cipher suites are intended, make sure to configure } } +common_ssl_opts_schema_hibernate_after { + desc { + en: """ Hibernate the SSL process after idling for amount of time reducing its memory footprint. """ + zh: """ 在闲置一定时间后休眠 SSL 进程,减少其内存占用。""" + } + label: { + en: "hibernate after" + zh: "闲置多久后休眠" + } +} + ciphers_schema_common { desc { en: """This config holds TLS cipher suite names separated by comma, diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index ba813d2c8..a75c3a968 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -1929,6 +1929,16 @@ common_ssl_opts_schema(Defaults) -> default => Df("secure_renegotiate", true), desc => ?DESC(common_ssl_opts_schema_secure_renegotiate) } + )}, + + {"hibernate_after", + sc( + duration(), + #{ + default => undefined, + required => false, + desc => ?DESC(common_ssl_opts_schema_hibernate_after) + } )} ]. diff --git a/apps/emqx/test/emqx_listeners_SUITE.erl b/apps/emqx/test/emqx_listeners_SUITE.erl index 6a7cd2791..8c69e7fda 100644 --- a/apps/emqx/test/emqx_listeners_SUITE.erl +++ b/apps/emqx/test/emqx_listeners_SUITE.erl @@ -138,6 +138,41 @@ t_restart_listeners(_) -> ok = emqx_listeners:restart(), ok = emqx_listeners:stop(). +t_restart_listeners_with_hibernate_after_disabled(Config) -> + OldLConf = emqx_config:get([listeners]), + maps:foreach( + fun(LType, Listeners) -> + maps:foreach( + fun(Name, Opts) -> + case maps:is_key(ssl_options, Opts) of + true -> + emqx_config:put( + [ + listeners, + LType, + Name, + ssl_options, + hibernate_after + ], + 5000 + ); + _ -> + skip + end + end, + Listeners + ) + end, + OldLConf + ), + ok = emqx_listeners:start(), + ok = emqx_listeners:stop(), + %% flakyness: eaddrinuse + timer:sleep(timer:seconds(2)), + ok = emqx_listeners:restart(), + ok = emqx_listeners:stop(), + emqx_config:put([listeners], OldLConf). + t_max_conns_tcp(_) -> %% Note: Using a string representation for the bind address like %% "127.0.0.1" does not work