diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 285bb37a8..b455459bd 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1475,12 +1475,36 @@ int SrsConfig::check_config() // check max connections of system limits if (true) { + int nb_consumed_fds = (int)get_listen().size(); + if (get_http_api_listen() > 0) { + nb_consumed_fds++; + } + if (get_http_stream_listen() > 0) { + nb_consumed_fds++; + } + if (get_log_tank_file()) { + nb_consumed_fds++; + } + // 0, 1, 2 for stdin, stdout and stderr. + nb_consumed_fds += 3; + + int nb_connections = get_max_connections(); + int nb_total = nb_connections + nb_consumed_fds; + int max_open_files = sysconf(_SC_OPEN_MAX); - if (get_max_connections() > max_open_files) { + int nb_canbe = max_open_files - nb_consumed_fds - 1; + + // for each play connections, we open a pipe(2fds) to convert SrsConsumver to io, + // refine performance, @see: https://github.com/winlinvip/simple-rtmp-server/issues/194 + if (nb_total >= max_open_files) { ret = ERROR_SYSTEM_CONFIG_INVALID; - srs_error("invalid max_connections=%d, system limit to %d, ret=%d. " - "you can login as root and set the limit: ulimit -HSn %d", get_max_connections(), max_open_files, - ret, get_max_connections()); + srs_error("invalid max_connections=%d, required=%d, system limit to %d, " + "total=%d(max_connections=%d, nb_consumed_fds=%d), ret=%d. " + "you can change max_connections from %d to %d, or " + "you can login as root and set the limit: ulimit -HSn %d", + nb_connections, nb_total, max_open_files, + nb_total, nb_connections, nb_consumed_fds, + ret, nb_connections, nb_canbe, nb_total); return ret; } }