Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxで「開いているファイルが多すぎます」エラーを解決する方法

高負荷のLinuxサーバーでは、「too many open files(開いているファイルが多すぎます)」というエラーが頻繁に発生します。これは、プロセスが開けるファイル(ファイルディスクリプタ)の数が上限に達し、それ以上新しいファイルを開けなくなったことを意味します。Linuxでは、プロセスごと・ユーザーごとにオープンファイル数の上限がデフォルトで設定されていますが、その初期値はかなり小さめです。

本記事では、Linuxにおけるオープンファイル数の上限値を確認する方法と、ホスト全体・個別のサービス・現在のセッションそれぞれに対して上限値を変更する方法を詳しく解説します。

「Too Many Open Files」エラーとLinuxのオープンファイル制限とは

まず、このエラーがどのような場面で発生するのかを見てみましょう。最も多いのは、NGINXやhttpdなどのWebサーバー、あるいはデータベースサーバー(MySQL/MariaDB/PostgreSQL)が稼働する環境で、大量のログを読み込む際に発生するケースです。例えば、Nginxがオープンファイル数の上限を超えると、次のようなエラーが表示されます。

socket () failed (29: Too many open files) while connecting to upstream

システム全体で開けるファイルディスクリプタの最大数は、以下のコマンドで確認できます。

# cat /proc/sys/fs/file-max

現在のユーザーのオープンファイル数の上限は、デフォルトで1024に設定されています。以下のコマンドで確認できます。

# ulimit -n

制限にはハードリミット(Hard)とソフトリミット(Soft)の2種類があります。ユーザーはソフトリミットを自分で変更できますが、その値はハードリミットを超えることができません。ハードリミットの変更は、特権ユーザーまたはrootユーザーのみが可能です。

ソフトリミットを表示するには、次のコマンドを実行します。

# ulimit -nS

ハードリミットの値を表示するには、次のコマンドを使用します。

# ulimit -nH

Linuxでオープンファイル数の上限を引き上げる方法

すべてのサービスが大量のファイルを扱えるようにするには、Linux OS自体の制限値を変更します。設定を永続化し、サーバーやセッションの再起動後もリセットされないようにするには、/etc/security/limits.confを編集する必要があります。以下の行を追加してください。

* hard nofile 97816
* soft nofile 97816

Ubuntuを使用している場合は、さらに次の行も追加します。

session required pam_limits.so

このパラメータにより、ユーザー認証後にオープンファイル数の制限が正しく適用されるようになります。

変更後はターミナルを再読み込みし、max_open_filesの値を確認しましょう。

# ulimit -n

97816

サービス単位でファイルディスクリプタの上限を変更する方法

OS全体ではなく、特定のサービスに対してのみオープンファイルディスクリプタの上限を変更することも可能です。ここではApacheを例に説明します。systemctlを使ってサービス設定を開きます。

# systemctl edit httpd.service

必要な制限値を追加します。例は以下の通りです。

[Service]
LimitNOFILE=16000
LimitNOFILESoft=16000

変更後、サービスの設定を更新して再起動します。

# systemctl daemon-reload
# systemctl restart httpd.service

値が正しく反映されたか確認するには、まずサービスのPIDを取得します。

# systemctl status httpd.service

例えば、サービスのPIDが3724の場合は次のように実行します。

# cat /proc/3724/limits | grep "Max open files"

これで、特定のサービスにおけるオープンファイル数の上限値を変更できました。

NginxとApacheのオープンファイル上限の設定方法

Webサーバーのオープンファイル数の上限を変更する場合は、サービス側の設定ファイルも併せて修正する必要があります。例えば、Nginxの設定ファイル/etc/nginx/nginx.confで、次のディレクティブの値を指定または変更します。

worker_rlimit_nofile 16000

worker_connections 8192を設定した高負荷な8コアサーバーでNginxを運用する場合、worker_rlimit_nofileには「8192 × 2 × 8(vCPU)= 131072」を指定するのが目安です。

その後、Nginxを再起動して設定を反映させます。

Apacheの場合は、まず次のコマンドでディレクトリを作成します。

# mkdir /lib/systemd/system/httpd.service.d/

続いて、limit_nofile.confファイルを作成します。

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

ファイルに以下の内容を追加します。

[Service]
LimitNOFILE=16000

編集が完了したら、忘れずにhttpdを再起動してください。

現在のセッションのオープンファイル上限を一時的に変更する

ターミナルセッションのオープンファイル数の上限だけを変更したい場合は、次のコマンドを実行します。

# ulimit -n 3000

ただし、ターミナルを閉じて新しいセッションを作成すると、制限値は/etc/security/limits.confで指定された元の値に戻る点に注意してください。

システム全体の上限値(/proc/sys/fs/file-max)を恒久的に変更するには、/etc/sysctl.conf内のfs.file-maxの値を編集します。

fs.file-max = 100000

その後、次のコマンドで変更を反映させます。

# sysctl -p

本記事では、Linuxにおけるオープンファイルディスクリプタの上限値が小さすぎて発生する問題の解決方法を解説しました。ホスト全体・個別サービス・セッション単位それぞれの変更手順を理解し、状況に応じて適切に設定を行いましょう。

  1. Windowsエラー1067「プロセスは予期せず終了しました」の解決方法を徹底解説

    エラー1067は、Windowsのさまざまなサービスで発生しうるエラーで、通常はサービスを起動する操作を実行した際に表示されます。このエラーメッセージが特に頻繁に報告されるのは、SQLサービスおよびそれに類するデータベース関連サービスです。この問題には複数の解決方法があります。ここでは、実際に同じ問題を経験したユーザーによって効果が確認された方法を厳選してご紹介します。以下の手順に沿って、ぜひ試してみてください。解決策1:サービスの制御権限を取得するこの問題は多くの場合、権限設定に起因しています。自分のユーザーアカウントにサービスの制御権限を与えることで解決できるケースが多いです。この方法を最

  2. Windows 11で発生する0xc00007bエラーを解決する完全ガイド

    この記事では、Windows 11で発生する0xc00007bエラーを修正するための対処法を詳しくご紹介します。 Windows OSの使用中にエラーに遭遇することは、決して珍しいことではありません。従来のバージョンも、最新のWindows 11も、バグやエラーがつきものであり、いつ何らかのトラブルに見舞われてもおかしくありません。 Windows 11に存在する数々の厄介なエラーの中でも、エラーコード「0xc00007b」は、アプリケーションを起動しようとした際によく表示される最も一般的なエラーの一つです。このエラーが発生すると、「アプリケーションは正しく起動できませんでした(0xc0000