Linuxカーネルの調整
システムがより多くの同時接続をサポートできるようにするために、イベント拡張をインストールする必要があります。さらに、Linuxカーネルの最適化も非常に重要です。以下の各最適化項目は非常に重要なので、必ず逐一完了してください。
パラメータ説明:
max-file: システム全体で開くことができるファイルハンドルの数を示します。ユーザーごとではなく、OS全体を対象としています。
ulimit -n: プロセスレベルで開くことができるファイルハンドルの数を制御します。現在の
shell
の現在のユーザーおよびその起動したプロセスの利用可能なファイルハンドルを制御します。
システム全体で開くことができるファイルハンドルの数を確認する: cat /proc/sys/fs/file-max
ファイル/etc/sysctl.confを開き、以下の設定を追加してください。
#このパラメータはTIME_WAITの数を設定し、デフォルト値を超える場合に即座にクリアされます。
net.ipv4.tcp_max_tw_buckets = 20000
#システムでの各ポートの最大のリッスン待ちキューの長さを定義する、これはグローバルなパラメータです。
net.core.somaxconn = 65535
#相手からの確認を得ていない接続要求に対し、キューに保持できる最大数
net.ipv4.tcp_max_syn_backlog = 262144
#ネットワークインターフェースごとに、カーネルが処理するパケットよりも速くデータパケットを受け取ることを許可するキューに送ることができるパケットの最大数
net.core.netdev_max_backlog = 30000
#NATネットワークにあるクライアントがタイムアウトすることを引き起こします。0を推奨します。Linux 4.12カーネルからはtcp_tw_recycle構成が削除されました。"No such file or directory"というエラーが表示された場合は無視してください。
net.ipv4.tcp_tw_recycle = 0
#システム全体のプロセスが開くことのできるファイルの数
fs.file-max = 6815744
#ファイアウォールの追跡表のサイズ。注意:ファイアウォールがオフの場合にはエラーが表示されますが、無視してください
net.netfilter.nf_conntrack_max = 2621440
net.ipv4.ip_local_port_range = 10240 65000
sysctl -p
を実行して、すぐに有効にしてください。
注意:
/etc/sysctl.confでは多くのオプションを設定できます。他のオプションは必要に応じて環境に合わせて設定してください。
ファイル数を開く
システムのファイルオープン数設定を変更して、高負荷時のtoo many open files
の問題を解決します。このオプションは直接プロセスが保持できるクライアント接続数に影響を与えます。
Soft open filesはLinuxシステムのパラメータであり、プロセスが保持できる最大のファイルハンドル数に影響を与えます。この値は、長時間の接続を保持するアプリケーションに影響を及ぼし、たとえばチャットアプリでは1つのプロセスが維持できるユーザー接続数に影響します。ulimit -n
を実行すると、このパラメータの値を確認できます。例えば1024の場合、1つのプロセスが同時に最大1024個の接続を維持できます(他のファイルハンドルが開かれているため、実際はもっと少ないかもしれません)。4つのプロセスを起動してユーザー接続を維持すれば、アプリ全体で維持できる接続数は4*1024を超えることはありません。つまり、最大で4x1024のユーザーがオンラインできます。この設定を増やすことで、サービスがより多くのTCP接続を維持できるようになります。
Soft open filesを変更する3つの方法:
- 最初の方法:ターミナルで直接
ulimit -HSn 102400
を実行し、その後workermanを再起動します。
これは現在のターミナルでのみ有効であり、終了するとopen filesはデフォルト値に戻ります。
-
2番目の方法:
/etc/profile
ファイルの末尾にulimit -HSn 102400
という行を追加します。これにより、ターミナルにログインするたびに自動的に実行されます。変更後にworkermanを再起動する必要があります。 -
3番目の方法:open filesの値を永続的に変更するには、
/etc/security/limits.conf
ファイルを変更する必要があります。ファイルに次の行を追加します。
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
この方法は、サーバーを再起動して有効にする必要があります。