CeleryでのRedis最大接続数の設定

redis_max_connections は result backend での Redis コネクションプールへの最大接続数です(デフォルトは無制限)。

broker 側では、broker_transport_options にコネクションプールの最大接続数を設定することができます。

broker_transport_options = {'max_connections': 10}

Redisクライアント接続の最大数

Redis サーバーはソケットを介してクライアントの接続を受け付けます。クライアントの接続が受け付けられるたびに、ファイルイベントが作成されます。クライアントが初期化された後、Redis は同時接続数が制限数に達しているかどうかをチェックします。

同時に接続できるクライアントの最大数は maxclients によって制限されます。 デフォルトでは 10000 に設定されますが、redis-cliconfig get maxclients で実際の値を確認できます。

クライアントの最大数を設定するには、

  1. CONFIG SET コマンドを使用する:config set maxclients 20000
  2. Redisサーバーを起動する時にクライアントの数を指定する。
    redis-server --maxclients 20000
    
  3. redis.conf で maxclients の値を設定する。

しかし、クライアントの最大数はファイルディスクリプタ数によって制限されています。

ulimit -a あるいは $ cat /proc/<pid>/limits でリソースの制限を確認できます。ulimit -a のデフォルト出力はソフト制限、-H フラグを付けたらハード制限が出力されます。

ulimit -n <value> あるいは /etc/security/limits.conf ファイルにファイルディスクリプタへの制限数を設定することができます。

Redis プロセスのファイルディスクリプタの上限値を確認すると、デフォルト値として設定されていません。

$ pid=`sudo cat /run/redis/redis-server.pid` && cat /proc/$pid/limits | grep "Max open files"
Max open files            65535                65535                files 

実は、この上限値は Systemd サービスでリソースの制限値の設定によって制限されています。Redis のユニットファイル /etc/systemd/system/redis-server.serviceLimitNOFILE ディレクティブの値を変更する必要があります。 あと、Redis が内部用にファイルディスクリプタを予約しているため、maxclients の値は Systemd で設定した LimitNOFILE の値から 32 を引いた値に設定する必要があります。 例えば、maxclients の値を 100000 に設定したい場合、Systemd サービスでの制限を LimitNOFILE=100032 に設定します。

設定完了後、すべてのユニットファイルをリロードし、Redis サーバを再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart redis