@oligofren
Tôi cũng đã thực hiện một số thử nghiệm để xác định cách "ulimits -Sn"
thức "open files"
thi hành.
Giống như poster Chosen được đề cập trong liên kết , ulimit cho "open files"
thực sự được áp dụng cho mỗi quy trình. Để xem giới hạn hiện tại của quy trình là gì:
cat /proc/__process_id__/limits
Để xác định có bao nhiêu tệp một quy trình đã mở, bạn cần sử dụng lệnh sau:
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
Giải thích về các kết quả / phương pháp thử nghiệm ở trên và của tôi
Các "-P -M -l -n"
đối số cho lsof chỉ đơn giản là có để làm cho lsof hoạt động nhanh nhất có thể. Hãy đưa chúng ra ngoài.
-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
Đối "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
số hướng dẫn lsof
để loại trừ các mô tả tệp loại: cwd / err / ltx / mem / mmap / pd / rtd / txt.
Từ trang 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;
Tôi coi "Lnn,jld,m86,tr,v86"
là không áp dụng được với Linux và do đó không bận tâm thêm chúng vào danh sách loại trừ. Tôi không chắc chắn về "Mxx"
.
Nếu ứng dụng của bạn sử dụng các tệp / thiết bị được ánh xạ bộ nhớ thì bạn có thể muốn xóa "^mem"
và "^mmap"
khỏi danh sách loại trừ.
EDIT --- bắt đầu snip ---
Chỉnh sửa: Tôi tìm thấy liên kết sau chỉ ra rằng:
bộ nhớ được ánh xạ .so-files về mặt kỹ thuật không giống như một tệp xử lý ứng dụng có quyền kiểm soát. / Proc // fd là điểm đo cho các mô tả tệp mở
Vì vậy, nếu quy trình của bạn sử dụng các tệp ánh xạ bộ nhớ, bạn sẽ cần lọc ra các tệp * .so.
Ngoài ra, JVM của Sun sẽ ghi lại các tệp jar
Một JARfile được ánh xạ bộ nhớ, trong trường hợp này là tệp chứa "các lớp JDK." Khi bạn ánh xạ bộ nhớ JAR, bạn có thể truy cập các tệp trong đó rất hiệu quả (so với việc đọc nó từ đầu mỗi lần). Sun JVM sẽ ánh xạ bộ nhớ tất cả các JAR trên đường dẫn lớp; nếu mã ứng dụng của bạn cần truy cập JAR, bạn cũng có thể ánh xạ bộ nhớ.
Vì vậy, những thứ như tomcat / thủy tinh cũng sẽ hiển thị các tệp jar được ánh xạ bộ nhớ. Tôi đã không kiểm tra xem những thứ này có được tính đến "ulimit -Sn"
giới hạn hay không.
EDIT --- cuối snip ---
Theo kinh nghiệm, tôi đã phát hiện ra rằng "cwd,rtd,txt"
đang không được tính liên quan đến các quá trình mỗi giới hạn tập tin (ulimit -Sn).
Tôi không chắc liệu có "err,ltx,pd"
được tính vào giới hạn tệp hay không vì tôi không biết cách tạo xử lý tệp của các loại mô tả này.
Đối "-p __process_id__"
số hạn chế lsof
chỉ trả về thông tin cho __process_id__
chỉ định. Xóa cái này nếu bạn muốn lấy số đếm cho tất cả các quy trình.
Đối "-a"
số được sử dụng để VÀ các lựa chọn (tức là các đối số "-p" và "-d").
Câu "awk '{if (NR>1) print}'"
lệnh được sử dụng để bỏ qua tiêu đề lsof
in trong đầu ra của nó.
Tôi đã thử nghiệm bằng cách sử dụng tập lệnh perl sau:
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---
Tôi đã phải thực thi tập lệnh trong trình gỡ lỗi perl để đảm bảo tập lệnh không chấm dứt và giải phóng bộ mô tả tệp.
Để thực hiện: perl -d test.pl
Trong trình gỡ lỗi của perl, bạn có thể chạy chương trình bằng cách nhập c
và nhấn enter và nếu bạn ulimit -Sn
có giá trị 1024 , bạn sẽ thấy chương trình dừng lại sau khi tạo Test1017.log
tệp /tmp
.
Nếu bây giờ bạn xác định pid của quá trình perl và sử dụng lsof
lệnh trên, bạn sẽ thấy rằng nó cũng xuất ra 1024 .
Xóa "wc -l"
và thay thế bằng a "less"
để xem danh sách các tệp được tính theo giới hạn 1024 . Xóa "-d ^....."
đối số cũng để thấy rằng các mô tả cwd,txt
và khôngrtd
được tính vào giới hạn.
Nếu bây giờ bạn chạy "ls -l /proc/__process_id__/fd/ | wc -l"
, bạn sẽ thấy giá trị 1025 được trả về. Điều này là do ls
đã thêm một "total 0"
tiêu đề vào đầu ra của nó đã được tính.
Ghi chú:
Để kiểm tra xem HĐH có hết bộ mô tả tệp hay không, tốt hơn là so sánh giá trị của:
cat /proc/sys/fs/file-nr | awk '{print $1}'
với
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt tài liệu gì file-nr
và file-max
có ý nghĩa.