@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प्रकार की फ़ाइल वर्णनकर्ता बाहर करने के लिए: CWD / अं / LTX / सदस्य / mmap / पीडी / 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"लिनक्स पर लागू नहीं माना और इसलिए उन्हें बहिष्करण सूची में जोड़ने की जहमत नहीं उठाई। मुझे यकीन नहीं है "Mxx"।
यदि आपका एप्लिकेशन मेमोरी मैप्ड फ़ाइलों / उपकरणों का उपयोग करता है तो आप अपवर्जन सूची से हटाना "^mem"और निकालना चाह सकते हैं "^mmap"।
EDIT --- स्निप शुरू करें ---
संपादित करें: मुझे निम्न लिंक मिला जो इंगित करता है कि:
मेमोरी मैप्ड .so-files तकनीकी रूप से एक फाइल हैंडल के रूप में एक ही नहीं होती है जिस पर एप्लिकेशन का नियंत्रण होता है। / proc // fd ओपन फाइल डिस्क्रिप्टर के लिए मापने का बिंदु है
इसलिए यदि आपकी प्रक्रिया मेमोरी मैप्ड फ़ाइलों का उपयोग करती है, तो आपको * .so फ़ाइलों को फ़िल्टर करने की आवश्यकता होगी।
इसके अलावा, सूर्य की JVM, jar फाइलों को मैप करेगी
एक मेमोरी-मैपेड JARfile, इस मामले में "JDK क्लासेस" रखने वाली फ़ाइल। जब आप एक JAR को मेमोरी-मैप करते हैं, तो आप इसके भीतर फ़ाइलों को बहुत कुशलता से एक्सेस कर सकते हैं (प्रत्येक बार शुरू से इसे पढ़ते हुए)। सूर्य JVM क्लासपाथ पर सभी JAR को मेमोरी-मैप करेगा; यदि आपके एप्लिकेशन कोड को JAR तक पहुंचने की आवश्यकता है, तो आप इसे मेमोरी-मैप भी कर सकते हैं।
तो टॉमकट / ग्लासफिश जैसी चीजें मेमोरी मैप्ड जार फाइलें भी दिखाएंगी। मैंने परीक्षण नहीं किया है कि क्या ये "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इसके उत्पादन में प्रिंट।
मैंने निम्नलिखित पर्ल स्क्रिप्ट का उपयोग करके परीक्षण किया:
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 -d test.pl
पर्ल के डिबगर में, आप दर्ज करके cऔर दबाकर प्रोग्राम चला सकते हैं और यदि आपका ulimit -Snमूल्य 1024 था , तो आप पाएंगे कि Test1017.logफ़ाइल बनाने के बाद प्रोग्राम बंद हो जाता है /tmp।
यदि आप अब perl प्रक्रिया के pid की पहचान करते हैं और उपरोक्त lsofकमांड का उपयोग करते हैं, तो आप देखेंगे कि यह 1024 आउटपुट भी करता है ।
1024 सीमा की ओर गिनती करने वाली फ़ाइलों की सूची देखने के लिए इसे निकालें "wc -l"और इसे बदलें । यह देखने के लिए कि विवरण और विवरणक सीमा से दूर नहीं थे, यह तर्क निकालें ।"less""-d ^....."cwd,txtrtd
यदि आप अब चलाते हैं "ls -l /proc/__process_id__/fd/ | wc -l", तो आपको 1025 का मान लौटा दिखाई देगा । ऐसा इसलिए है क्योंकि इसके आउटपुट में lsएक "total 0"हेडर जोड़ा जाता है जो कि गिना जाता है।
ध्यान दें:
यह जाँचने के लिए कि OS फ़ाइल डिस्क्रिप्टर से बाहर चल रहा है या नहीं, इसकी कीमत की तुलना करना बेहतर है :
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मतलब है।