RHELのOS全体のファイルディスクリプタ数を変更する【AWS】

EC2アイキャッチ画像

・OS全体のファイルディスクリプタ数を確認・変更したい。
・OS全体のファイルディスクリプタ数のテストをしたい。
・ファイルディスクリプタ数を使用するjavaが欲しい。

ファイルディスクリプタ数を確認

システム全体のファイルディスクリプタ数を確認します。

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

設定の反映

下記コマンドより設定ファイルを修正し、下記を追加します。
fs.file-max = 10000

sudo vi /etc/sysctl.conf

設定の反映

sudo /sbin/sysctl -p

ファイルディスクリプタ数の確認

sudo cat /proc/sys/fs/file-max
ファイルディスクリプタ数の確認

設定の確認テスト

全体のファイルディスクリプタ数の反映を確認するため、ファイルディスクリプタ数を生み出すjavaを用意します。
ファイルを無限に開き続ける必要があるため、何か適当なファイルを用意し10行目を修正してください。

ファイル作成コマンド

vi FileDescriptorTest.java
import java.io.File;	
import java.io.FileInputStream;	
import java.io.IOException;	
import java.util.ArrayList;	
import java.util.List;	
	
public class FileDescriptorTest {	
    public static void main(String[] args) {	
        List<FileInputStream> openFiles = new ArrayList<>();	
        try {	
            for (int i = 0; ; i++) {	
                File file = new File("/path/to/any/file.txt"); // 存在するファイルパスを指定	
                FileInputStream fis = new FileInputStream(file);	
                openFiles.add(fis); // ファイルをリストに追加し、閉じずに保持する	
                System.out.println("Opened file #" + i);	
            }	
        } catch (IOException e) {	
            // エラーメッセージを表示(ファイルディスクリプタの上限に達したときに発生)	
            System.out.println("Error: " + e.getMessage());	
            e.printStackTrace();	
        } finally {	
            // リソースをクリーンアップ(必要に応じて)	
            for (FileInputStream fis : openFiles) {	
                try {	
                    if (fis != null) {	
                        fis.close();	
                    }	
                } catch (IOException e) {	
                    e.printStackTrace();	
                }	
            }	
        }	
    }	
}	

先ほどのjavaファイルをコンパイル

javac FileDescriptorTest.java 
java FileDescriptorTest

8866時点で止まっていますが、上限数が10000付近で止まることを確認しました。
(おそらく、ターミナル上に帰ってくる前に裏で使い切ってしまったと予想。)

ファイルディスクリプタ数確認

以上です。ちなみに誤って100とかにすると起動自体ができなくなるので、作業前にはサーバーのバックアップ取得推奨です。