@oligofren
Ja też przeprowadzić kilka testów w celu ustalenia, w jaki sposób "ulimits -Sn"
za "open files"
było egzekwowane.
Podobnie jak plakat Wybrany wymieniony w linku , ulimit "open files"
jest rzeczywiście stosowany dla każdego procesu. Aby zobaczyć, jakie są obecne limity procesu:
cat /proc/__process_id__/limits
Aby ustalić liczbę plików otwartych przez proces, musisz użyć następującego polecenia:
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
Wyjaśnienie powyższego i moja metoda / wyniki testowania
Te "-P -M -l -n"
argumenty lsof są po prostu tam, aby lsof działać tak szybko, jak to możliwe. Zapraszam do ich wyjęcia.
-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
W "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
przesyła zlecenie argumentów lsof
wykluczyć deskryptorów plików typu: CWD / err / LTX / mem / mmap / PD / BRT / txt.
Ze strony 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;
Uznałem, że "Lnn,jld,m86,tr,v86"
nie dotyczy Linuksa i dlatego nie zadałem sobie trudu, aby dodać je do listy wykluczeń. Nie jestem pewien "Mxx"
.
Jeśli twoje uzależnia zastosowanie do korzystania z pamięci mapowane plików / devices to może chcesz usunąć "^mem"
i "^mmap"
z listy wykluczeń.
EDYCJA --- rozpocząć wycinanie ---
Edycja: Znalazłem następujący link, który wskazuje, że:
odwzorowane w pamięci pliki .so technicznie nie są tym samym co uchwyt pliku, nad którym aplikacja ma kontrolę. / proc // fd to punkt pomiarowy dla otwartych deskryptorów plików
Jeśli więc proces używa plików zmapowanych w pamięci, konieczne będzie odfiltrowanie plików * .so.
Ponadto JVM firmy Sun zapisze w pamięci pliki jar
Plik JAR odwzorowany w pamięci, w tym przypadku plik zawierający „klasy JDK”. Kiedy mapujesz pamięć JAR, możesz bardzo wydajnie uzyskiwać dostęp do plików w nim zawartych (w porównaniu z odczytywaniem go od początku za każdym razem). Sun JVM zmapuje w pamięci wszystkie pliki JAR w ścieżce klasy; jeśli twój kod aplikacji musi uzyskać dostęp do pliku JAR, możesz go również zmapować w pamięci.
Rzeczy takie jak tomcat / glassfish będą również wyświetlać pliki jar zamapowane w pamięci. Nie testowałem, czy liczą się one do "ulimit -Sn"
limitu.
EDYCJA --- koniec snipa ---
Empirycznie, znalazłem, że nie"cwd,rtd,txt"
są liczone w odniesieniu do limitu pliku na proces (ulimit -Sn).
Nie jestem pewien, czy "err,ltx,pd"
są wliczane do limitu plików, ponieważ nie wiem, jak utworzyć uchwyty plików tych typów deskryptorów.
Do "-p __process_id__"
ogranicza argumentów lsof
aby tylko zwrócić informacji za __process_id__
określony. Usuń to, jeśli chcesz uzyskać liczbę wszystkich procesów.
"-a"
Argumentem jest używany do I wybory (czyli „p” i „-d” argumenty).
"awk '{if (NR>1) print}'"
Zestawienie służy do pominąć nagłówek, który lsof
drukuje w swoim wyjściu.
Testowałem przy użyciu następującego skryptu 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---
Musiałem wykonać skrypt w debugerze Perla, aby upewnić się, że skrypt się nie kończy i zwolnić deskryptory plików.
Wykonać: perl -d test.pl
W debugerze Perla możesz uruchomić program, wprowadzając c
i naciskając enter, a jeśli miałeś ulimit -Sn
wartość 1024 , przekonasz się, że program zatrzymuje się po utworzeniu Test1017.log
pliku /tmp
.
Jeśli teraz zidentyfikujesz pid procesu perla i użyjesz powyższego lsof
polecenia, zobaczysz, że wyprowadza on również 1024 .
Usuń "wc -l"
i zamień na, "less"
aby wyświetlić listę plików zaliczanych do limitu 1024 . Usuń również "-d ^....."
argument, aby zobaczyć, że deskryptory cwd,txt
i nie liczą się do limitu.rtd
Jeśli teraz uruchomisz "ls -l /proc/__process_id__/fd/ | wc -l"
, zobaczysz wartość 1025 . Jest tak, ponieważ ls
dodano "total 0"
nagłówek do jego wyniku, który został policzony.
Uwaga:
Aby sprawdzić, czy w systemie operacyjnym brakuje deskryptorów plików, lepiej porównać wartość:
cat /proc/sys/fs/file-nr | awk '{print $1}'
z
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt dokumentuje, co file-nr
i co file-max
oznacza.