@oligofren
Ayrıca nasıl uygulandığını belirlemek "ulimits -Sn"
için bazı testler yaptım "open files"
.
Poster gibi Seçilmiş belirtilen bağlantı için Ulimit "open files"
gerçekten sürecin başına kullanılır. Sürecin mevcut sınırlarının ne olduğunu görmek için:
cat /proc/__process_id__/limits
Bir işlemin kaç dosya açtığını belirlemek için aşağıdaki komutu kullanmanız gerekir:
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
Yukarıdakilerin ve test yöntemimin / sonuçların açıklaması
"-P -M -l -n"
İçin argümanlar lsof yapmak basitçe vardır lsof mümkün olduğunca hızlı çalışır. Onları çıkarmaktan çekinmeyin.
-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'"
Argüman talimatını lsof
Çeşidi dosya tanımlayıcıları dışlamak için: cwd / err / LTX'e / mem / mmap / pd / rtd / txt.
Lsof man sayfasından:
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 için geçerli olmadığını düşündüm ve bu nedenle bunları hariç tutma listesine eklemek için uğraşmadım. Emin değilim "Mxx"
.
Uygulamanız bellek eşlemeli dosyaları / cihazları kullanıyorsa , hariç tutma listesinden "^mem"
ve "^mmap"
listeden çıkarmak isteyebilirsiniz .
DÜZENLEME --- snip başlat ---
Düzenleme: Bunu gösteren aşağıdaki bağlantı bulundu :
bellek eşlenen .so dosyaları teknik olarak uygulamanın kontrol ettiği bir dosya tanıtıcısı ile aynı değildir. / proc // fd açık dosya tanımlayıcıları için ölçüm noktasıdır
İşleminiz bellek eşlemeli dosyalar kullanıyorsa, * .so dosyalarını filtrelemeniz gerekir.
Ayrıca, Sun'ın JVM'si harita jar dosyalarını hafızaya alacak
Bellek eşlemeli JARfile, bu durumda "JDK sınıflarını" tutan dosya. Bir JAR'ı bellek eşlediğinizde, içindeki dosyalara çok verimli bir şekilde erişebilirsiniz (her seferinde başlangıçtan okumak yerine). Sun JVM, sınıf yolundaki tüm JAR'ları bellekle eşler; uygulama kodunuzun bir JAR'a erişmesi gerekiyorsa, bunu bellek eşlemesiyle de eşleştirebilirsiniz.
Böylece tomcat / glassfish gibi şeyler de bellek eşlemeli jar dosyalarını gösterecektir. Bunların sınıra doğru olup olmadığını test etmedim "ulimit -Sn"
.
DÜZENLEME --- son snip ---
Ampirik olarak, ben fark ettik "cwd,rtd,txt"
vardır sayılmaz sürecin başına dosya sınırı açısından (Ulimit -Sn) ile.
"err,ltx,pd"
Bu tanımlayıcı türlerinin dosya tanıtıcılarını nasıl oluşturacağımı bilmediğim için dosya sınırına dahil olup olmadığından emin değilim .
"-p __process_id__"
Argümanı kısıtlar lsof
yalnızca bilgi döndürmek için __process_id__
belirtilmedi. Tüm işlemler için bir sayım almak istiyorsanız bunu kaldırın.
Bağımsız "-a"
değişken AND seçimlerine (yani "-p" ve "-d" bağımsız değişkenlerine) kullanılır.
"awk '{if (NR>1) print}'"
Açıklamada, başlığını geçmek için kullanılır lsof
çıktıda baskılar.
Aşağıdaki perl betiği kullanarak test ettim:
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---
Komut dosyasının sonlandırılmasını ve dosya tanımlayıcılarını serbest bırakmamasını sağlamak için perl hata ayıklayıcısında komut dosyasını yürütmek zorunda kaldım.
Yürütmek için: perl -d test.pl
Perl hata ayıklayıcısında, c
enter girip tuşuna basarak programı çalıştırabilirsiniz ve 1024ulimit -Sn
değeriniz varsa , dosyayı oluşturduktan sonra programın durduğunu göreceksiniz .Test1017.log
/tmp
Şimdi perl işleminin pid'ini belirlerseniz ve yukarıdaki lsof
komutu kullanırsanız, bunun da 1024 çıktısı verdiğini göreceksiniz .
Kaldır "wc -l"
ve değiştirin "less"
sayılır dosyaların listesini görmek için 1024 sınırı. Kaldır "-d ^....."
görmek için de argüman cwd,txt
ve rtd
tanımlayıcılar vermedi limitine sayılır.
Şimdi koşarsanız "ls -l /proc/__process_id__/fd/ | wc -l"
, 1025 değerinin döndürüldüğünü görürsünüz . Bunun nedeni , çıktısına sayılan ls
bir "total 0"
üstbilgi eklemesidir .
Not:
İşletim sisteminin dosya tanımlayıcılarının tükenip tükenmediğini kontrol etmek için aşağıdakilerin değerini karşılaştırmak daha iyidir :
cat /proc/sys/fs/file-nr | awk '{print $1}'
ile
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt neyi file-nr
ve ne file-max
anlama geldiğini belgeler .