Package: redis-server
Severity: wishlist
Tags: upstream patch

Redis-server runs with its own user and has no builtin way to bypass the
maximum number of opened file descriptors (1024 by default). This
prevents its use in a high concurrency environment.

To override this, a patch has been written so that Redis set its limits,
based on its maxclients configuration :

https://github.com/antirez/redis/commit/58732c23d53d6fc652668a516556ea182b0ed0f8

But it requires Redis to run as root... No way.

Then, I decided to consider the maxclients directive and to run the
appropriate "ulimit -n" directly in the init script.

See the attached patch.

Note :
* The patch has been tested with dash and bash
* The 32 FD offset is explained in the above link
diff -urN redis.orig/debian/control redis/debian/control
--- redis.orig/debian/control	2012-05-12 16:01:58.000000000 +0200
+++ redis/debian/control	2012-05-12 16:03:55.000000000 +0200
@@ -10,7 +10,7 @@
 
 Package: redis-server
 Architecture: any
-Depends: ${misc:Depends}, ${shlibs:Depends}, adduser
+Depends: ${misc:Depends}, ${shlibs:Depends}, adduser, awk
 Description: Persistent key-value database with network interface
  Redis is a key-value database in a similar vein to memcache but the dataset
  is non-volatile. Redis additionally provides native support for atomically
diff -urN redis.orig/debian/redis-server.init redis/debian/redis-server.init
--- redis.orig/debian/redis-server.init	2012-05-12 16:01:58.000000000 +0200
+++ redis/debian/redis-server.init	2012-05-12 16:07:04.000000000 +0200
@@ -25,6 +25,11 @@
 
 set -e
 
+maxclients=$(awk '/^[ \t]*maxclients[ \t]/ { print $2 }' /etc/redis/redis.conf)
+if [ ! -z $maxclients ]  && [ $maxclients -gt 992 ] ; then
+  ulimit -n $((maxclients+32))
+fi
+
 case "$1" in
   start)
 	echo -n "Starting $DESC: "

Reply via email to