提交 3b54ee6e 编写于 作者: M Matt Stancliff

Add REDIS_MIN_RESERVED_FDS define for open fds

Also update the original REDIS_EVENTLOOP_FDSET_INCR to
include REDIS_MIN_RESERVED_FDS. REDIS_EVENTLOOP_FDSET_INCR
exists to make sure more than (maxclients+RESERVED) entries
are allocated, but we can only guarantee that if we include
the current value of REDIS_MIN_RESERVED_FDS as a minimum
for the INCR size.
上级 90b84421
...@@ -1491,20 +1491,20 @@ void initServerConfig() { ...@@ -1491,20 +1491,20 @@ void initServerConfig() {
/* This function will try to raise the max number of open files accordingly to /* This function will try to raise the max number of open files accordingly to
* the configured max number of clients. It also reserves a number of file * the configured max number of clients. It also reserves a number of file
* descriptors (REDIS_EVENTLOOP_FDSET_INCR) for extra operations of * descriptors (REDIS_MIN_RESERVED_FDS) for extra operations of
* persistence, listening sockets, log files and so forth. * persistence, listening sockets, log files and so forth.
* *
* If it will not be possible to set the limit accordingly to the configured * If it will not be possible to set the limit accordingly to the configured
* max number of clients, the function will do the reverse setting * max number of clients, the function will do the reverse setting
* server.maxclients to the value that we can actually handle. */ * server.maxclients to the value that we can actually handle. */
void adjustOpenFilesLimit(void) { void adjustOpenFilesLimit(void) {
rlim_t maxfiles = server.maxclients+REDIS_EVENTLOOP_FDSET_INCR; rlim_t maxfiles = server.maxclients+REDIS_MIN_RESERVED_FDS;
struct rlimit limit; struct rlimit limit;
if (getrlimit(RLIMIT_NOFILE,&limit) == -1) { if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {
redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.", redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.",
strerror(errno)); strerror(errno));
server.maxclients = 1024-REDIS_EVENTLOOP_FDSET_INCR; server.maxclients = 1024-REDIS_MIN_RESERVED_FDS;
} else { } else {
rlim_t oldlimit = limit.rlim_cur; rlim_t oldlimit = limit.rlim_cur;
...@@ -1518,7 +1518,7 @@ void adjustOpenFilesLimit(void) { ...@@ -1518,7 +1518,7 @@ void adjustOpenFilesLimit(void) {
limit.rlim_cur = f; limit.rlim_cur = f;
limit.rlim_max = f; limit.rlim_max = f;
if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break; if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
f -= REDIS_EVENTLOOP_FDSET_INCR; f -= REDIS_MIN_RESERVED_FDS;
if (f > limit.rlim_cur) { if (f > limit.rlim_cur) {
/* Instead of getting smaller, f just got bigger. /* Instead of getting smaller, f just got bigger.
* That means it wrapped around its unsigned floor * That means it wrapped around its unsigned floor
...@@ -1534,7 +1534,7 @@ void adjustOpenFilesLimit(void) { ...@@ -1534,7 +1534,7 @@ void adjustOpenFilesLimit(void) {
if (f < oldlimit) f = oldlimit; if (f < oldlimit) f = oldlimit;
if (f != maxfiles) { if (f != maxfiles) {
int old_maxclients = server.maxclients; int old_maxclients = server.maxclients;
server.maxclients = f-REDIS_EVENTLOOP_FDSET_INCR; server.maxclients = f-REDIS_MIN_RESERVED_FDS;
if (server.maxclients < 1) { if (server.maxclients < 1) {
redisLog(REDIS_WARNING,"Your current 'ulimit -n' " redisLog(REDIS_WARNING,"Your current 'ulimit -n' "
"of %llu is not enough for Redis to start. " "of %llu is not enough for Redis to start. "
......
...@@ -123,6 +123,7 @@ ...@@ -123,6 +123,7 @@
#define REDIS_IP_STR_LEN INET6_ADDRSTRLEN #define REDIS_IP_STR_LEN INET6_ADDRSTRLEN
#define REDIS_PEER_ID_LEN (REDIS_IP_STR_LEN+32) /* Must be enough for ip:port */ #define REDIS_PEER_ID_LEN (REDIS_IP_STR_LEN+32) /* Must be enough for ip:port */
#define REDIS_BINDADDR_MAX 16 #define REDIS_BINDADDR_MAX 16
#define REDIS_MIN_RESERVED_FDS 32
#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */ #define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20 /* Loopkups per loop. */
#define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000 /* Microseconds */ #define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000 /* Microseconds */
...@@ -139,9 +140,9 @@ ...@@ -139,9 +140,9 @@
#define REDIS_LONGSTR_SIZE 21 /* Bytes needed for long -> str */ #define REDIS_LONGSTR_SIZE 21 /* Bytes needed for long -> str */
#define REDIS_AOF_AUTOSYNC_BYTES (1024*1024*32) /* fdatasync every 32MB */ #define REDIS_AOF_AUTOSYNC_BYTES (1024*1024*32) /* fdatasync every 32MB */
/* When configuring the Redis eventloop, we setup it so that the total number /* When configuring the Redis eventloop, we setup it so that the total number
* of file descriptors we can handle are server.maxclients + FDSET_INCR * of file descriptors we can handle are server.maxclients + RESERVED_FDS + FDSET_INCR
* that is our safety margin. */ * that is our safety margin. */
#define REDIS_EVENTLOOP_FDSET_INCR 128 #define REDIS_EVENTLOOP_FDSET_INCR (REDIS_MIN_RESERVED_FDS+96)
/* Hash table parameters */ /* Hash table parameters */
#define REDIS_HT_MINFILL 10 /* Minimal hash table fill 10% */ #define REDIS_HT_MINFILL 10 /* Minimal hash table fill 10% */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册