ゲームサーバーを実行して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も取得しています。
ソフトリミットとハードリミットは何をしますか。グローバルリミットを有効にするには、これらを変更する必要がありますか?そして、ユーザー(root)の制限はどうですか?
ありがとう!
sysctl
で設定した制限は、システム全体に適用されるシステム設定です。個々のプロセスに適用される制限ではありません。
各プロセスはN個以下のファイルを開くことができます。NはプロセスのNOFILE
ソフト制限であり、独自のソフト制限をハード制限以下に変更できます。 rootとして実行されているプロセスのみがハード制限を引き上げることができます。プロセスは親の制限を継承します。
単一のサービスの制限を変更する方法(これを行う必要があります)は、initシステムによって異なります。
/etc/rc.d/init.d
にあります)を編集して、デーモンを実行する前にulimit
を呼び出し、サービスを再起動します。Systemd(CentOS≥7)の場合: サービスのユニットファイル/etc/systemd/system/my_game_server.service
を編集し、ディレクティブを追加します
LimitNOFILE=16384
次に、systemctl daemon-reload
を実行して構成を再読み込みし、サービスを再起動します。
/etc/security/limits.conf
で制限を変更できます。ログアウトしてから有効にしてください。
ハードリミット:特定のユーザーの境界-実行時にそのユーザーがインクリメントすることはできません。減少するのはulimit -Hu 2000
だけです。ハード制限のリスト:ulimit -Ha
ソフト制限:ハード制限内の「ソフト」境界。実行時にユーザーが変更できます:ulimit -Su 10000
。ソフト制限のリスト:ulimit -Sa
実行中のプロセスのulimitを変更します:prlimit -p $$ --nproc=1200:
。これにより、現在のシェル$$
のプロセス数(softlimit)が1200に変更されます。
ファイル/etc/security/limits.conf
で制限の数を変更できます(特定のユーザーまたはすべてのユーザー向け)次のように追加する必要があります。
username soft nofile 4096
username hard nofile 5120
これにより、開いているファイルの数が4096(ソフト制限)に設定され、5120がトップとして設定されます
この編集後、サービスを再ログインおよび再起動してこれを管理する必要があります。
私が覚えている限り、ulimit
は、このユーザーからログアウトするまで変更を行います