fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40019?usp=email )
Change subject: sctp_{client,server}: set sndbuf/recbuf explicitly ......................................................................
sctp_{client,server}: set sndbuf/recbuf explicitly
For some reason, Erlang/OTP does overwrite the OS-default SO_SNDBUF/SO_RCVBUF values even if the respective socket options are not given to gen_sctp:open/N explicitly. Even worse, the receive buffer size is set to a very low value (1024), resulting in major performance issues when dealing with large packets.
Set both sndbuf/recbuf to 65536 explicitly - this value is used for the sndbuf by default. Allow tuning sndbuf/recbuf via the environment variables.
Change-Id: I66f4a0f6a2441a3c8a4dbd266da8e44a3860b993 Related: SYS#7288 --- M src/osmo_s1gw_sup.erl 1 file changed, 7 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/19/40019/1
diff --git a/src/osmo_s1gw_sup.erl b/src/osmo_s1gw_sup.erl index 67b6f47..92f908b 100644 --- a/src/osmo_s1gw_sup.erl +++ b/src/osmo_s1gw_sup.erl @@ -42,6 +42,7 @@
-define(SERVER, ?MODULE). -define(ENV_APP_NAME, osmo_s1gw). +-define(ENV_DEFAULT_SCTP_BUFSZ, 65536). -define(ENV_DEFAULT_SCTP_NODELAY, true). -define(ENV_DEFAULT_S1GW_BIND_ADDR, "127.0.1.1"). -define(ENV_DEFAULT_S1GW_BIND_PORT, ?S1AP_PORT). @@ -89,7 +90,9 @@
-spec client_cfg() -> sctp_client:cfg(). client_cfg() -> - SockOpts = #{sctp_nodelay => get_env(mme_nodelay, ?ENV_DEFAULT_SCTP_NODELAY)}, + SockOpts = #{sctp_nodelay => get_env(mme_nodelay, ?ENV_DEFAULT_SCTP_NODELAY), + recbuf => get_env(mme_recbuf, ?ENV_DEFAULT_SCTP_BUFSZ), + sndbuf => get_env(mme_sndbuf, ?ENV_DEFAULT_SCTP_BUFSZ)}, #{laddr => get_env(mme_loc_addr, ?ENV_DEFAULT_MME_LOC_ADDR), raddr => get_env(mme_rem_addr, ?ENV_DEFAULT_MME_REM_ADDR), rport => get_env(mme_rem_port, ?ENV_DEFAULT_MME_REM_PORT), @@ -98,7 +101,9 @@
-spec server_cfg() -> sctp_server:cfg(). server_cfg() -> - SockOpts = #{sctp_nodelay => get_env(s1gw_nodelay, ?ENV_DEFAULT_SCTP_NODELAY)}, + SockOpts = #{sctp_nodelay => get_env(s1gw_nodelay, ?ENV_DEFAULT_SCTP_NODELAY), + recbuf => get_env(s1gw_recbuf, ?ENV_DEFAULT_SCTP_BUFSZ), + sndbuf => get_env(s1gw_sndbuf, ?ENV_DEFAULT_SCTP_BUFSZ)}, #{laddr => get_env(s1gw_bind_addr, ?ENV_DEFAULT_S1GW_BIND_ADDR), lport => get_env(s1gw_bind_port, ?ENV_DEFAULT_S1GW_BIND_PORT), sockopts => maps:to_list(SockOpts),