1日2日ほどゲームサーバーを実行した後、以下のようなエラーが発生することを解決しようとします。
2017/12/13 12:08:35 http: Accept error: accept tcp [::]:8081: accept4: too many open files; retrying in 1s
/etc/sysctl.confに「fs.file-max=2000000」を追加して実行しました。
sysctl -w fs.file-max=2000000
sysctl -p
これでグローバル制限は更新されましたが(再起動する必要がありますか?)、ソフト制限とハード制限はまだ1024と4096です。
また、root ユーザーの「ファイルを開く」を確認するときは、次のコマンドを使用します。
su - root -c 'ulimit -aHS' -s '/bin/bash'
私も1024を受け取りました。
ソフト制限とハード制限の機能は何ですか?グローバル制限を適用するにはこれを変更する必要がありますか?ユーザー(ルート)の制限はどうですか?
ありがとうございます!
答え1
設定した制限は、sysctl
システム全体に適用されるシステム設定です。これは単一プロセスに適用される制限ではありません。
各プロセスは最大N個のファイルを開くことができます。ここで、NはプロセスのNOFILE
ソフト制限であり、ハード制限を超えないように独自のソフト制限を変更できます。ルートとして実行されるプロセスのみがハード制限を増やすことができます。プロセスは親プロセスの制限を継承します。
個々のサービスの制限を変更する方法(ユーザーが実行する必要がある作業)は、初期化システムによって異なります。
/etc/rc.d/init.d
SysVinit(CentOS 6以下):デーモンを実行する前に呼び出されるようにサービスの初期化スクリプト(通常は常駐する場所)を編集し、ulimit
サービスを再起動します。Systemd(CentOS ≥7)の場合:編集サービス単位ファイル
/etc/systemd/system/my_game_server.service
そしてディレクティブを追加してくださいLimitNOFILE=16384
次に、実行
systemctl daemon-reload
して設定を再ロードし、サービスを再起動します。
答え2
で制限を変更できます/etc/security/limits.conf
。適用するには、ログアウトして再度ログインしてください。
Hardlimit:特定のユーザーの境界 - 実行時にユーザーを増やすことはできず、減少のみが可能ですulimit -Hu 2000
。ハード制限リスト:ulimit -Ha
ソフト制限:ユーザーが実行時に変更できるハード制限内の「ソフト」境界:ulimit -Su 10000
ソフト制限リスト:ulimit -Sa
実行中のプロセスのulimitを変更しますprlimit -p $$ --nproc=1200:
。これにより、現在のシェルのプロセス数が1200に変わります$$
。
答え3
次のように追加する必要があるファイルの制限番号/etc/security/limits.conf
(特定のユーザーまたは全員)を変更できます。
username soft nofile 4096
username hard nofile 5120
これにより、開いているファイルの数が4096(ソフトリミット)に設定され、最大5120に設定されます。
この編集を行った後は、再度ログインしてサービスを再起動する必要があります。
私が覚えている限り、ulimit
そのユーザーからログアウトするまで変更は適用されません。