※ Couchbase Mobile(Couchbase Lite, Syncgateway)に関する記事について、こちらも、参照ください。
概要
Sync Gatewayで使用可能なファイルディスクリプタの最大数を増やすことは、Sync Gatewayが開くことができるソケットの最大数、したがってSync Gatewayがサポートできるエンドポイントの最大数に直接影響します。
これには、(Sync Gatewayの設定のみではなく)OSのパラメーターを調整する必要があります。
※ここでの説明は、OSとしてCentOSを前提としています。
ここでの設定は単なる例であり、ユースケースに合わせて調整する必要があります。
OSのファイルディスクリプタ制限変更
ここでは、すべてのプロセスで使用できるファイルディスクリプタの最大数を増やす方法を紹介します。
/etc/sysctl.confファイルを編集します。次の行を追加します。
fs.file-max = 500000
次のコマンドを実行して、変更を適用します。
$ sysctl -p
-p
オプションにより、再起動後も変更が持続します
Sync Gateway設定のファイルディスクリプタ制限変更
Sync Gatewayのファイルディスクリプタの最大数を構成します。
構成ファイルのmaxFileDescriptors
プロパティを変更します。
{
"maxFileDescriptors": 250000,
"databases": {
"todo": { ... }
}
}
Sync Gatewayサービスのファイルディスクリプタ制限変更
systemd設定の場合
/usr/lib/systemd/system/sync_gateway.service
には、LimitNOFILE=65535
というハードコードされた制限が指定されています。
これを増やすには、sync_gateway.serviceファイルを目的の値に編集して、サービスを再起動します。
プロセスのファイルディスクリプタ制限変更
systemdの外部でSync Gatewayを実行している場合は、次の手順を使用します。
- 1つのプロセスで使用できるファイルディスクリプタの最大数の
ulimit
設定を増やします。
$ ulimit -n 250000
- 再起動後もulimitの変更を保持するには、
/etc/security/limits.conf
に次の行を追加します。
* soft nofile 250000
* hard nofile 250000
- 次のコマンドを実行して、変更を確認します。
$ cat /proc/sys/fs/file-max
$ ulimit -n
上記の両方のコマンドの出力値は「250000」になるはずです。
OSのTCPキープアライブ設定変更
Sync Gatewayで使用可能なファイルディスクリプタの最大数を増やしても、「too many open files (開いているファイルが多すぎます)」というエラーが表示される場合は、TCPキープアライブパラメーターを調整する必要があります。
問題を理解する
モバイルエンドポイントとの接続においては、クライアントが接続を閉じることなく、ネットワークから突然切断される場合があります。
デフォルトでは、これらの接続は、Sync Gatewayプロセスのtcp/ipスタックによってデッドであることが検出され、約7200秒(2時間)後にクリーンアップされます。このような接続が蓄積されると、Sync Gatewayで「開いているファイルが多すぎます」というエラーが表示される可能性があります。
影響関係を確認する
エラーが表示された場合に、次のコマンドを使用して、Sync Gatewayとの間に確立された接続の数を数えることができます。
$ lsof -p <sync_gw_pid> | grep -i established | wc -l
上記の方法で確認した値がファイルディスクリプタの最大制限に近い場合は、ファイルディスクリプタの最大制限をさらに高くするか、TCPキープアライブパラメータを調整して、デッドピアがソケットを開いたままにする時間を短縮します。
TCPキープアライブ設定の調整には欠点がないわけではなく、tcp/ipスタックがより頻繁にキープアライブパケットを送信するため、システム全体のネットワークトラフィックの量が増加することに注意が必要です。
TCPキープアライブ設定変更手順
TCPキープアライブ設定を調整するためには、次の行を/etc/sysctl.confファイルに追加します。
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 20
これは次のように解釈されます。
- キープアライブルーチンは、最初のキープアライブプローブを送信する前に、最初に10分(600秒)待機します。
- プローブを1分(60秒)ごとに再送信します。
- ACK応答が20回連続して受信されない場合、接続は切断済みとしてマークされます。
この例では、デッドピア接続がハングアップする時間が(デフォルトの約2時間から)約30分に短縮されます。
さらに時間を短縮するために、tcp_retries2
の値を減らすことができます。次の行を/etc/sysctl.confファイルに追加します。
net.ipv4.tcp_retries2 = 8
変更をアクティブにして再起動後も保持するには、次のコマンドを実行します。
$ sysctl -p
関連情報
参照:Glass Onion Blog - Increasing ulimit and file descriptors limit on Linux