Too many open files in systemと表示されサーバにログインできない

Linux

私が携わったことのある現場で、急にサーバにログインできなくなったことがありました。その時ターミナル上に表示されていたエラーは「~Too many open files in system」といったものでした。これはカーネルパラメータの「fs.file-max」のリソースが枯渇した際に表示されます。

カーネルパラメータは、OSの動作を調整する設定項目のことです。パラメータの設定値を誤ってしまうと、サーバにログインできなくなる可能性があります。

この記事では「~Too many open files in system」のエラーに対して、どんな不備が原因でどんな対応を行ったのかについて紹介していきます。

表示されたエラー

私の方で表示された内容は下記のとおりです。

bash: start _pipeline: pgrp pipe: Too many open files in system 

サーバにSSHログインを行った後にメッセージが表示され、コマンドの入力が行えない状態でした。また、このメッセージが出ている間は、他のサーバからSSHでのコマンド実行も受け付けない状態でした。

原因

サーバ内で開けるファイル数の制限に達してしまうと表示されます。サーバ上で今まで開いていたファイル数や、OS側での最大ファイルオープン数を調べられるコマンドは下記のとおりです。

[root@server ~]# cat /proc/sys/fs/file-nr
10656 2651 10400

上記のコマンドについて、読み方を解説すると下記のようになります。

出力結果の見方
  • 左:今まで開いていた過去最大ファイルオープン数
  • 中央:コマンド実行時現在のファイルオープン数
  • 右:OSの最大ファイルオープン数(OSの設定値)

実行例の場合だと、OSの設定値が10400に対して、実際に開いているファイル数は10656です。このため、リソースが枯渇してしまい、エラーが表示されると言った流れです。

対処方法

カーネルパラメータの「fs.file-max」の設定値を変更することで改善されました。手順は下記のとおりです。

  1. OSの設定値の確認
  2. 設定値の変更
  3. 変更内容をOSに反映

1つずつ見ていきます。

1. OSの設定値の確認

まずは、OSの設定値を改めて確認します。下記のコマンドを実行することで確認が行えます。

[root@server ~]# sysctl -a | grep file.max
fs.file-max = 10400

実行後に表示された値がOSの「fs.file-max」の設定値です。

2. 設定値の変更

確認が終えたら、OS側の「fs.file-max」の設定値を変更します。設定値を変更する際は「/etc/sysctl.conf」に記載を行います。変更手順の一例は下記のとおりです。

# 設定ファイルの確認
[root@server ~]# ls -l /etc/sysctl.conf

#バックアップファイルの取得
[root@server ~]# cp -p /etc/sysctl.conf /tmp/sysctl.conf_$(date +%Y%m%d)

#バックアップファイルが取得できているかを確認
[root@server ~]# ls -l /etc/sysctl.conf /tmp/sysctl.conf*

#設定ファイルの中身を確認
[root@server ~]# cat /etc/sysctl.conf

#設定ファイルの編集
[root@server ~]# vi /etc/sysctl.conf

#編集後の設定ファイルの中身を確認
[root@server ~]# cat /etc/sysctl.conf

#差分を確認

[root@server ~]# diff /tmp/sysctl.conf_$(date +%Y%m%d) /etc/sysctl.conf

なお、デフォルトで「/etc/sysctl.conf」に設定されている場合もありますが、記載されていない場合もあります。その場合は下記を例にファイル内に追記を行いましょう。

fs.file-max = 20000

3. 変更内容をOSに反映

設定値の変更後はOS側に反映させましょう。設定値を反映させる方法として、主に下記の2つがあります。

  • サーバのリブート
  • コマンドで反映

この記事では、コマンドで反映させる方法について紹介します。

まず、前提として「/etc/sysctl.conf」の中身を編集しただけでは、設定値はOS側に反映されません。OS側に「/etc/sysctl.conf」の内容を反映させるには下記のコマンドを実行することで行えます。

[root@server ~]# sysctl -p

この記事では「fs.file-max」のみを変える流れになっています。しかし、1つのパラメータを変更したことで、他のパラメータも変わってしまうことがあります。そのため「sysctl -p」の実行前と実行後にカーネルの設定値の一覧を取得しておくことがおすすめです。

確認作業を考慮した手順の一例は下記のとおりです。

[root@server ~]# sysctl -a > /tmp/sysctl_before
[root@server ~]# sysctl -a
[root@server ~]# sysctl -p
[root@server ~]# sysctl -a
[root@server ~]# sysctl -a > /tmp/sysctl_after
[root@server ~]# diff /tmp/sysctl_before /tmp/sysctl_after

もし、手を加えたパラメータ以外も変わっている場合、影響がないかを確認しましょう。

作業時の注意点

ここでは、エラーが発生している際と復旧に向けた作業を行う際の注意点について解説します。

「~Too many open files in system」のエラーが表示されている間は、サーバにログインできないことが多いです。停止可能なミドルウェアがあれば、一度停止してファイルのオープン数を減らしてからログインを試してみてください。

停止が行えない場合には、開かれているファイル数が少ないタイミングを見計らってサーバにログインを試みてみましょう。

コメント

タイトルとURLをコピーしました