@oligofren
Saya juga dilakukan beberapa pengujian untuk menentukan bagaimana "ulimits -Sn"
untuk "open files"
diberlakukan.
Seperti poster yang dipilih dalam tautan , ulimit untuk "open files"
memang diterapkan per proses. Untuk melihat batas proses saat ini:
cat /proc/__process_id__/limits
Untuk menentukan berapa banyak file yang telah dibuka suatu proses, Anda perlu menggunakan perintah berikut:
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
Penjelasan di atas dan metode / hasil pengujian saya
The "-P -M -l -n"
argumen untuk lsof hanya ada untuk membuat lsof beroperasi secepat mungkin. Jangan ragu untuk mengeluarkannya.
-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
The "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
menginstruksikan argumen lsof
untuk mengecualikan file deskriptor dari jenis: cwd / err / LTX / mem / mmap / pd / RTD / txt.
Dari halaman manual lsof:
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;
Saya dianggap "Lnn,jld,m86,tr,v86"
tidak berlaku untuk Linux dan karenanya tidak repot-repot menambahkannya ke daftar pengecualian. Saya tidak yakin tentang itu "Mxx"
.
Jika aplikasi Anda menggunakan file / perangkat yang dipetakan memori maka Anda mungkin ingin menghapus "^mem"
dan "^mmap"
dari daftar pengecualian.
Sunting --- mulai snip ---
Sunting: Saya menemukan tautan berikut yang menunjukkan bahwa:
memori yang dipetakan .so-file secara teknis tidak sama dengan file yang ditangani aplikasi. / proc // fd adalah titik pengukuran untuk deskriptor file terbuka
Jadi, jika proses Anda menggunakan file yang dipetakan memori, Anda perlu memfilter file * .so.
Juga, Sun's JVM akan memetakan file jar
JARfile yang dipetakan dengan memori, dalam hal ini file yang menampung "kelas JDK." Ketika Anda memetakan memori sebuah JAR, Anda dapat mengakses file di dalamnya dengan sangat efisien (dibandingkan membacanya dari awal setiap kali). Sun JVM akan memetakan-memori semua JAR di classpath; jika kode aplikasi Anda perlu mengakses JAR, Anda juga dapat memetakannya dalam memori.
Jadi hal-hal seperti tomcat / glassfish juga akan menampilkan file jar yang dipetakan memori. Saya belum menguji apakah ini masuk dalam "ulimit -Sn"
batas.
EDIT --- end snip ---
Secara empiris, saya telah menemukan bahwa "cwd,rtd,txt"
yang tidak dihitung berkaitan dengan per proses batas file (ulimit -sN).
Saya tidak yakin apakah "err,ltx,pd"
dihitung terhadap batas file karena saya tidak tahu cara membuat file menangani jenis deskriptor ini.
The "-p __process_id__"
Membatasi argumen lsof
hanya kembali informasi untuk __process_id__
ditentukan. Hapus ini jika Anda ingin mendapatkan hitungan untuk semua proses.
The "-a"
argumen digunakan untuk DAN pada pilihan (yaitu "p" dan "d" argumen).
The "awk '{if (NR>1) print}'"
pernyataan digunakan untuk melewatkan header yang lsof
cetakan dalam output.
Saya diuji menggunakan skrip perl berikut:
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---
Saya harus menjalankan skrip dalam perl debugger untuk memastikan skrip tidak berhenti dan merilis file deskriptor.
Untuk mengeksekusi: perl -d test.pl
Di debugger perl, Anda dapat menjalankan program dengan memasukkan c
dan menekan enter dan jika Anda ulimit -Sn
memiliki nilai 1024 , Anda akan menemukan bahwa program berhenti setelah membuat Test1017.log
file masuk /tmp
.
Jika sekarang Anda mengidentifikasi pid dari proses perl dan menggunakan lsof
perintah di atas Anda akan melihat bahwa itu juga menghasilkan 1024 .
Hapus "wc -l"
dan ganti dengan "less"
untuk melihat daftar file yang dihitung menuju batas 1024 . Hapus "-d ^....."
argumen juga untuk melihat bahwa cwd,txt
dan rtd
deskriptor tidak masuk dalam batas.
Jika Anda sekarang menjalankan "ls -l /proc/__process_id__/fd/ | wc -l"
, Anda akan melihat nilai 1025 dikembalikan. Ini karena ls
menambahkan "total 0"
header ke outputnya yang dihitung.
catatan:
Untuk memeriksa apakah OS kehabisan deskriptor file, lebih baik membandingkan nilai:
cat /proc/sys/fs/file-nr | awk '{print $1}'
dengan
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt mendokumentasikan apa file-nr
dan file-max
artinya.