@oligofren
Я також провів кілька тестів , щоб визначити , як "ulimits -Sn"
для "open files"
було приведено в виконання.
Як і постер, вибраний у посиланні , посилання"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
виключити дескриптори файлів типу: ВУХО / ERR / LTX / MEM / ММАП / PD / ТПС / 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 файли.
Крім того, JVM Sun буде запам’ятовувати файли jar-файлів пам'яті
JARfile, зібраний на пам'ять, у цьому випадку файл, який містить "класи JDK". Коли ви пам'ятаєте JAR-карту, ви можете дуже ефективно отримувати доступ до файлів, що знаходяться в ній (порівняно з читанням з початку). Sun JVM запам'ятовує карту пам'яті всіх JAR на класному шляху; якщо вашому коду програми потрібно отримати доступ до JAR, ви також можете зробити карту пам'яті.
Таким чином, такі речі, як tomcat / glassfish, також відображатимуть картографічні файли з пам'яттю. Я не перевіряв, чи відносяться вони до "ulimit -Sn"
межі.
EDIT --- кінцевий фрагмент ---
Емпірично я виявив, що "cwd,rtd,txt"
вони не враховуються щодо обмеження файлу за кожний процес (ulimit -Sn).
Я не впевнений, чи "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
.
Якщо ви зараз ідентифікуєте pid процесу perl та скористаєтесь вищевказаною lsof
командою, ви побачите, що він також виводить 1024 .
Видаліть "wc -l"
та замініть на а, "less"
щоб побачити список файлів, що зараховуються до межі 1024 . Видаліть "-d ^....."
аргумент також, щоб побачити, що cwd,txt
і rtd
дескриптори не зараховувались до межі.
Якщо зараз запустити "ls -l /proc/__process_id__/fd/ | wc -l"
, ви побачите значення повернутої 1025 . Це тому, що до результату ls
додано "total 0"
заголовок, який підрахували.
Примітка:
Щоб перевірити, чи не вистачає ОС в дескрипторах файлів, краще порівняти значення:
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
означають.