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

・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とかにすると起動自体ができなくなるので、作業前にはサーバーのバックアップ取得推奨です。
- タグ:
- EC2