CentOS:Redis 最大客户端连接数限制

CentOS:Redis 最大客户端连接数限制

我在 CentOS 上使用 Redis 缓存服务器,其中 Redis 在配置的侦听 TCP 端口上接受客户端连接。我试图找出操作系统对 Redis 单个配置端口允许的连接数的限制。

正在使用的用户root如图所示:

[root@server-001]# ps -ef | grep -i redis 
root     19595     1  9 Jun26 ?        09:43:07 /usr/local/bin/redis-server 0.0.0.0:6379

现在我被多个因素所欺骗:

第一:file-max的值为:

[root@server-001]# cat /proc/sys/fs/file-max
6518496

第二: 的值limits.conf

[root@server-001]# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

第三:文件描述符的软限制和硬限制:

[root@server-001]# ulimit -Hn
4096
[root@server-001]# ulimit -Sn
1024

现在,知道限制单个端口连接的真正因素是文件描述符,我必须更改哪一个才能确保 redis 服务器接受尽可能多的客户端?

答案1

maxclients 4096在 redis.conf 上使用

void adjustOpenFilesLimit(void) {
rlim_t maxfiles = server.maxclients+CONFIG_MIN_RESERVED_FDS;
struct rlimit limit;

if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {
    serverLog(LL_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.",
        strerror(errno));
    server.maxclients = 1024-CONFIG_MIN_RESERVED_FDS;
} else {
    rlim_t oldlimit = limit.rlim_cur;

    /* Set the max number of files if the current limit is not enough
     * for our needs. */
    if (oldlimit < maxfiles) {
        rlim_t bestlimit;
        int setrlimit_error = 0;

        /* Try to set the file limit to match 'maxfiles' or at least
         * to the higher value supported less than maxfiles. */
        bestlimit = maxfiles;
        while(bestlimit > oldlimit) {
            rlim_t decr_step = 16;

            limit.rlim_cur = bestlimit;
            limit.rlim_max = bestlimit;
            if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
            setrlimit_error = errno;

            /* We failed to set file limit to 'bestlimit'. Try with a
             * smaller limit decrementing by a few FDs per iteration. */
            if (bestlimit < decr_step) break;
            bestlimit -= decr_step;
        }

        /* Assume that the limit we get initially is still valid if
         * our last try was even lower. */
        if (bestlimit < oldlimit) bestlimit = oldlimit;

        if (bestlimit < maxfiles) {
            unsigned int old_maxclients = server.maxclients;
            server.maxclients = bestlimit-CONFIG_MIN_RESERVED_FDS;
            /* maxclients is unsigned so may overflow: in order
             * to check if maxclients is now logically less than 1
             * we test indirectly via bestlimit. */
            if (bestlimit <= CONFIG_MIN_RESERVED_FDS) {
                serverLog(LL_WARNING,"Your current 'ulimit -n' "
                    "of %llu is not enough for the server to start. "
                    "Please increase your open file limit to at least "
                    "%llu. Exiting.",
                    (unsigned long long) oldlimit,
                    (unsigned long long) maxfiles);
                exit(1);
            }
            serverLog(LL_WARNING,"You requested maxclients of %d "
                "requiring at least %llu max file descriptors.",
                old_maxclients,
                (unsigned long long) maxfiles);
            serverLog(LL_WARNING,"Server can't set maximum open files "
                "to %llu because of OS error: %s.",
                (unsigned long long) maxfiles, strerror(setrlimit_error));
            serverLog(LL_WARNING,"Current maximum open files is %llu. "
                "maxclients has been reduced to %d to compensate for "
                "low ulimit. "
                "If you need higher maxclients increase 'ulimit -n'.",
                (unsigned long long) bestlimit, server.maxclients);
        } else {
            serverLog(LL_NOTICE,"Increased maximum number of open files "
                "to %llu (it was originally set to %llu).",
                (unsigned long long) maxfiles,
                (unsigned long long) oldlimit);
        }
    }
}

}

相关内容