@oligofren
ฉันยังทำการทดสอบเพื่อกำหนดวิธี"ulimits -Sn"
การ"open files"
บังคับใช้
เช่นเดียวกับโปสเตอร์ที่ได้รับการกล่าวถึงในลิงค์ ulimit สำหรับ"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
เพื่อยกเว้นอธิบายไฟล์ประเภท: CWD / ผิดพลาด / LTX / ข่าว / mmap / PD / RTD / txt
จากหน้ามนุษย์ของ 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;
ฉันถือว่า"Lnn,jld,m86,tr,v86"
ไม่สามารถใช้ได้กับ Linux และด้วยเหตุนี้จึงไม่ต้องสนใจเพิ่มลงในรายการยกเว้น "Mxx"
ผมไม่แน่ใจว่าเกี่ยวกับ
หากแอปพลิเคชันของคุณใช้ประโยชน์จากไฟล์ / อุปกรณ์ที่แมปหน่วยความจำคุณอาจต้องการลบ"^mem"
และออก"^mmap"
จากรายการยกเว้น
แก้ไข --- เริ่ม snip ---
แก้ไข: ฉันพบลิงค์ต่อไปนี้ซึ่งระบุว่า:
หน่วยความจำที่แมป. so-files ในทางเทคนิคนั้นไม่เหมือนกับที่จัดการกับไฟล์ที่แอปพลิเคชันควบคุมได้ / proc // fd เป็นจุดวัดสำหรับตัวอธิบายไฟล์แบบเปิด
ดังนั้นหากกระบวนการของคุณใช้ไฟล์ที่แม็พหน่วยความจำคุณจะต้องกรองไฟล์ * .so ออก
นอกจากนี้ JVM ของ Sun จะจดจำไฟล์ jar ของแม็พด้วย
JARfile ที่แม็พหน่วยความจำในกรณีนี้ไฟล์ที่เก็บ "คลาส JDK" เมื่อหน่วยความจำแมป JAR คุณสามารถเข้าถึงไฟล์ที่อยู่ในนั้นได้อย่างมีประสิทธิภาพ (เทียบกับการอ่านตั้งแต่เริ่มต้นแต่ละครั้ง) Sun JVM จะทำการแมป JAR ทั้งหมดไว้บน classpath หากรหัสแอปพลิเคชันของคุณจำเป็นต้องเข้าถึง JAR คุณยังสามารถแมปหน่วยความจำได้
ดังนั้นสิ่งต่างๆเช่น Tomcat / glassfish จะแสดงไฟล์ jar ที่แม็พหน่วยความจำด้วย ฉันไม่ได้ทดสอบว่าจำนวนเหล่านี้มีค่าถึง"ulimit -Sn"
ขีด จำกัด หรือไม่
แก้ไข --- end snip ---
สังเกตุฉันพบว่า"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 เพื่อให้แน่ใจว่าสคริปต์จะไม่ยุติและปล่อยไฟล์ descriptors
ในการดำเนินการ: perl -d test.pl
ในการดีบักของ Perl คุณสามารถเรียกใช้โปรแกรมโดยการป้อนc
และกด Enter และหากคุณulimit -Sn
มีค่าของ1024 , คุณจะพบว่าโปรแกรมหยุดหลังจากที่สร้างแฟ้มในTest1017.log
/tmp
ถ้าตอนนี้คุณระบุ pid ของกระบวนการ Perl และใช้ข้างต้นlsof
คำสั่งคุณจะเห็นว่ามันยังเอาท์พุท1024
ลบ"wc -l"
และแทนที่ด้วย a "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
หมายและความหมาย