web-dev-qa-db-ja.com

すべてのプロセスのオープンファイル制限を増やす:ソフト/ハード制限を設定する必要がありますか?

ゲームサーバーを実行して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)の制限はどうですか?

ありがとう!

2
SJ19

sysctlで設定した制限は、システム全体に適用されるシステム設定です。個々のプロセスに適用される制限ではありません。

各プロセスはN個以下のファイルを開くことができます。NはプロセスのNOFILEソフト制限であり、独自のソフト制限をハード制限以下に変更できます。 rootとして実行されているプロセスのみがハード制限を引き上げることができます。プロセスは親の制限を継承します。

単一のサービスの制限を変更する方法(これを行う必要があります)は、initシステムによって異なります。

  • SysVinit(CentOS≤6)の場合:サービスの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に変更されます。

1
manifestor

ファイル/etc/security/limits.confで制限の数を変更できます(特定のユーザーまたはすべてのユーザー向け)次のように追加する必要があります。

username               soft    nofile          4096
username               hard    nofile          5120

これにより、開いているファイルの数が4096(ソフト制限)に設定され、5120がトップとして設定されます

この編集後、サービスを再ログインおよび再起動してこれを管理する必要があります。

私が覚えている限り、ulimitは、このユーザーからログアウトするまで変更を行います

0
Romeo Ninov