mirror of
https://github.com/fluencelabs/redis
synced 2025-03-31 14:51:04 +00:00
maxclients configuration is now implemented dealing with the actual process rlimits. Setting maxclients to 0 no longer makes sense and is now invalid, the new default is 10000.
See issue #162 for more information.
This commit is contained in:
parent
1eceb85ebc
commit
58732c23d5
11
redis.conf
11
redis.conf
@ -168,13 +168,16 @@ slave-serve-stale-data yes
|
|||||||
|
|
||||||
################################### LIMITS ####################################
|
################################### LIMITS ####################################
|
||||||
|
|
||||||
# Set the max number of connected clients at the same time. By default there
|
# Set the max number of connected clients at the same time. By default
|
||||||
# is no limit, and it's up to the number of file descriptors the Redis process
|
# this limit is set to 10000 clients, however if the Redis server is not
|
||||||
# is able to open. The special value '0' means no limits.
|
# able ot configure the process file limit to allow for the specified limit
|
||||||
|
# the max number of allowed clients is set to the current file limit
|
||||||
|
# minus 32 (as Redis reserves a few file descriptors for internal uses).
|
||||||
|
#
|
||||||
# Once the limit is reached Redis will close all the new connections sending
|
# Once the limit is reached Redis will close all the new connections sending
|
||||||
# an error 'max number of clients reached'.
|
# an error 'max number of clients reached'.
|
||||||
#
|
#
|
||||||
# maxclients 128
|
# maxclients 10000
|
||||||
|
|
||||||
# Don't use more memory than the specified amount of bytes.
|
# Don't use more memory than the specified amount of bytes.
|
||||||
# When the memory limit is reached Redis will try to remove keys with an
|
# When the memory limit is reached Redis will try to remove keys with an
|
||||||
|
@ -412,7 +412,7 @@ static void acceptCommonHandler(int fd) {
|
|||||||
* connection. Note that we create the client instead to check before
|
* connection. Note that we create the client instead to check before
|
||||||
* for this condition, since now the socket is already set in nonblocking
|
* for this condition, since now the socket is already set in nonblocking
|
||||||
* mode and we can send an error for free using the Kernel I/O */
|
* mode and we can send an error for free using the Kernel I/O */
|
||||||
if (server.maxclients && listLength(server.clients) > server.maxclients) {
|
if (listLength(server.clients) > server.maxclients) {
|
||||||
char *err = "-ERR max number of clients reached\r\n";
|
char *err = "-ERR max number of clients reached\r\n";
|
||||||
|
|
||||||
/* That's a best effort error message, don't check write errors */
|
/* That's a best effort error message, don't check write errors */
|
||||||
|
35
src/redis.c
35
src/redis.c
@ -856,7 +856,7 @@ void initServerConfig() {
|
|||||||
server.requirepass = NULL;
|
server.requirepass = NULL;
|
||||||
server.rdbcompression = 1;
|
server.rdbcompression = 1;
|
||||||
server.activerehashing = 1;
|
server.activerehashing = 1;
|
||||||
server.maxclients = 0;
|
server.maxclients = REDIS_MAX_CLIENTS;
|
||||||
server.bpop_blocked_clients = 0;
|
server.bpop_blocked_clients = 0;
|
||||||
server.maxmemory = 0;
|
server.maxmemory = 0;
|
||||||
server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;
|
server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;
|
||||||
@ -1000,6 +1000,39 @@ void initServer() {
|
|||||||
slowlogInit();
|
slowlogInit();
|
||||||
bioInit();
|
bioInit();
|
||||||
srand(time(NULL)^getpid());
|
srand(time(NULL)^getpid());
|
||||||
|
|
||||||
|
/* Try to raise the max number of open files accordingly to the
|
||||||
|
* configured max number of clients. Also account for 32 additional
|
||||||
|
* file descriptors as we need a few more for persistence, listening
|
||||||
|
* sockets, log files and so forth. */
|
||||||
|
{
|
||||||
|
rlim_t maxfiles = server.maxclients+32;
|
||||||
|
struct rlimit limit;
|
||||||
|
|
||||||
|
if (maxfiles < 1024) maxfiles = 1024;
|
||||||
|
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.",
|
||||||
|
strerror(errno));
|
||||||
|
server.maxclients = 1024-32;
|
||||||
|
} 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) {
|
||||||
|
limit.rlim_cur = maxfiles;
|
||||||
|
limit.rlim_max = maxfiles;
|
||||||
|
if (setrlimit(RLIMIT_NOFILE,&limit) == -1) {
|
||||||
|
server.maxclients = oldlimit-32;
|
||||||
|
redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.",
|
||||||
|
(int) maxfiles, strerror(errno), (int) server.maxclients);
|
||||||
|
} else {
|
||||||
|
redisLog(REDIS_NOTICE,"Max number of open files set to %d",
|
||||||
|
(int) maxfiles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Populates the Redis Command Table starting from the hard coded list
|
/* Populates the Redis Command Table starting from the hard coded list
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#define REDIS_AUTO_AOFREWRITE_MIN_SIZE (1024*1024)
|
#define REDIS_AUTO_AOFREWRITE_MIN_SIZE (1024*1024)
|
||||||
#define REDIS_SLOWLOG_LOG_SLOWER_THAN 10000
|
#define REDIS_SLOWLOG_LOG_SLOWER_THAN 10000
|
||||||
#define REDIS_SLOWLOG_MAX_LEN 64
|
#define REDIS_SLOWLOG_MAX_LEN 64
|
||||||
|
#define REDIS_MAX_CLIENTS 10000
|
||||||
|
|
||||||
/* 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% */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user