しゅう
また、どのように実施されたかを判断する"ulimits -Sn"
ため"open files"
にいくつかのテストを実施しました。
linkで言及されているポスターChosenのように、ulimit はプロセスごとに実際に適用されます。プロセスの現在の制限を確認するには:"open files"
cat /proc/__process_id__/limits
プロセスが開いているファイルの数を確認するには、次のコマンドを使用する必要があります。
lsof -P -M -l -n -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -p __process_id__ -a | awk '{if (NR>1) print}' | wc -l
上記の説明と私の試験方法/結果
"-P -M -l -n"
引数のlsofは作るために、単純にあるlsofのは、可能な限り高速で動作します。それらを取り出してください。
-P - inhibits the conversion of port numbers to port names for network files
-M - disable reporting of portmapper registrations for local TCP, UDP and UDPLITE ports
-l - inhibits the conversion of user ID numbers to login names
-n - inhibits the conversion of network numbers to host names for network files
"-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
引数が指示しlsof
たタイプのファイル記述子を除外するために:CWD / ERR / LTX / MEM / mmapの/ PD / RTD / TXT。
lsof manページから:
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
"Lnn,jld,m86,tr,v86"
Linuxには該当しないと判断したため、除外リストに追加することはありませんでした。わからない"Mxx"
。
アプリケーションがメモリマップドファイル/デバイスを使用している場合、除外リストから削除"^mem"
したい場合があります"^mmap"
。
編集---切り取り開始---
編集:私はそれを示す次のリンクを見つけました:
メモリマッピングされた.soファイルは、技術的には、アプリケーションが制御するファイルハンドルとは異なります。/ proc // fdは、開いているファイル記述子の測定ポイントです
そのため、プロセスでメモリマップファイルを使用する場合は、*。soファイルを除外する必要があります。
また、SunのJVMはjarファイルをメモリマップします
メモリマップされたJARファイル、この場合は「JDKクラス」を保持するファイル。JARをメモリマップすると、JAR内のファイルに非常に効率的にアクセスできます(毎回最初から読み込むのとは対照的です)。Sun JVMは、クラスパス上のすべてのJARをメモリマップします。アプリケーションコードがJARにアクセスする必要がある場合は、メモリマップすることもできます。
そのため、tomcat / glassfishのようなものもメモリマップされたjarファイルを表示します。これらが制限にカウントされるかどうかはテストしていません"ulimit -Sn"
。
編集---切り取りの終了---
経験的に、プロセスごとのファイル制限(ulimit -Sn)に関してはカウントされないこと"cwd,rtd,txt"
がわかりました。
"err,ltx,pd"
これらの記述子タイプのファイルハンドルを作成する方法がわからないため、ファイル制限にカウントされるかどうかはわかりません。
"-p __process_id__"
引数制限しlsof
だけのための情報を返すように__process_id__
指定しました。すべてのプロセスのカウントを取得する場合は、これを削除します。
"-a"
引数はに使用されていると、選択(すなわち「-p」と「-d」引数)。
この"awk '{if (NR>1) print}'"
ステートメントはlsof
、出力に出力されるヘッダーをスキップするために使用されます。
次のperlスクリプトを使用してテストしました。
File: test.pl
---snip---
#!/usr/bin/perl -w
foreach $i (1..1100) {
$FH="FH${i}";
open ($FH,'>',"/tmp/Test${i}.log") || die "$!";
print $FH "$i\n";
}
---snip---
スクリプトが終了せず、ファイル記述子を解放しないように、perlデバッガーでスクリプトを実行する必要がありました。
実行するには: perl -d test.pl
perlのデバッガーでは、c
Enter キーを押してプログラムを実行できます。ulimit -Sn
値が1024の場合、Test1017.log
ファイルを作成した後にプログラムが停止することがわかります/tmp
。
ここでperlプロセスのpidを識別し、上記のlsof
コマンドを使用すると、1024も出力されることがわかります。
を削除し、"wc -l"
a "less"
に置き換えて、1024個の制限にカウントされたファイルのリストを表示します。"-d ^....."
引数も削除して、cwd,txt
およびrtd
記述子が制限にカウントされなかったことを確認します。
を実行"ls -l /proc/__process_id__/fd/ | wc -l"
すると、値1025が返されます。これは、カウントされた出力にヘッダーがls
追加されたため"total 0"
です。
注意:
OSでファイル記述子が不足しているかどうかを確認するには、次の値を比較することをお勧めします。
cat /proc/sys/fs/file-nr | awk '{print $1}'
と
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txtには、file-nr
そのfile-max
意味と意味が記載されています。