गैर-सीपीयू-गहन विकल्प lsof के लिए?


12

हम एक अपाचे कैसंड्रा क्लस्टर चलाते हैं जहां प्रत्येक होस्ट में किसी भी समय कुछ सौ हज़ार फाइलें खुली होती हैं।

हम आवधिक अंतरालों पर खुली फाइलों की एक गिनती प्राप्त करने और इस संख्या को ग्रेफाइट में फीड करने में सक्षम होना चाहते हैं , लेकिन जब हम lsofनीचे चलते हैं collectd, तो इस बीच सीपीयू की एक अपर्याप्त राशि को पूरा करने और चबाने में कुछ मिनट लगते हैं। ।

अगर वहाँ एक ही डेटा है कि lsof प्रदान करता है, या यहाँ तक कि lsof चलाने का एक तरीका है कि CPU में नहीं खाएगा के रूप में एक वैकल्पिक और अधिक अनुकूल साधन है सोच रहा हूँ? (हालांकि मुझे लगता है कि यह बाद की विधि की तुलना में इसे वर्तमान में पूरा करने में अधिक समय लगेगा ... आदर्श नहीं)।

शायद कर्नेल कुछ चर को बनाए रखता है जिसमें खुली फ़ाइलों की संख्या होती है? वास्तविकता पर नहीं आशाओं के आधार पर कामना करना?

अपडेट करें:

उत्तर में से एक के जवाब में, हम पहले से ही -bऔर -nझंडे का उपयोग कर रहे हैं । यहाँ पूरी कमान है क्योंकि मेरे पास यह चल रहा है collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

जवाबों:


12

आपको शायद सॉकेट के लिए नेटवर्क पते को हल करने की आवश्यकता नहीं है, इसलिए कम से कम -nस्विच का उपयोग करें। तो आप भी चाहते हो सकता है तो साथ ब्लॉकिंग संचालन को छोड़ दें -b

इन 2 पहले स्विचों को वास्तव में तेज करना चाहिए।

और फिर -luids को सुलझाने से बचने के लिए। और -Lगिनती लिंक से बचने के लिए। आदि ने आदमी को lsof देखें ।

वैकल्पिक रूप से, लिनक्स के साथ, आप /proc/<PID>/fdइस तरह से लिंक को गिनने के लिए एक स्क्रिप्ट बना सकते हैं :

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


I alway get - find: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': ऐसी कोई फ़ाइल या निर्देशिका नहीं है - Q @ Beno Qt मैं इससे कैसे बच सकता हूं?
बीजी ब्रूनो

2
@BrunoBG: कोशिश करें:echo /proc/*/fd/* | wc -w
ओलिवियर

Thx @OlivierDulac जो एक स्पष्ट था :-)
बीजी ब्रूनो

अच्छे सुझाव, लेकिन पहले से ही एन-एन और बी विकल्पों का उपयोग कर रहे हैं .... मुझे और अधिक सुझावों की आवश्यकता है
माइकल मार्टिनेज

1
यदि आपके पास बहुत बड़ी संख्या में fd है तो @OlivierDulac काम नहीं कर सकता है।
बेनोइट

5

आप यह गलत कर रहे है।

से man proc

   /proc/sys/fs/file-nr

इस (केवल पढ़ने के लिए) फ़ाइल में तीन नंबर होते हैं: आवंटित फ़ाइल हैंडल की संख्या (यानी, वर्तमान में खोली गई फ़ाइलों की संख्या); मुफ्त फ़ाइल हैंडल की संख्या; और फ़ाइल हैंडल की अधिकतम संख्या (यानी, / proc / sys / fs / file-max के समान मान)। यदि आवंटित फ़ाइल हैंडल की संख्या अधिकतम के करीब है, तो आपको अधिकतम बढ़ाने पर विचार करना चाहिए। लिनक्स 2.6 से पहले, कर्नेल आवंटित फ़ाइल गतिशील रूप से संभालती है, लेकिन इसने उन्हें फिर से मुक्त नहीं किया। इसके बजाय मुफ्त फ़ाइल हैंडल को वास्तविक सूची के लिए एक सूची में रखा गया था; "मुफ्त फ़ाइल हैंडल" मूल्य उस सूची के आकार को इंगित करता है। बड़ी संख्या में मुफ्त फ़ाइल हैंडल इंगित करता है कि खुले फ़ाइल हैंडल के उपयोग में एक अतीत की चोटी थी। लिनक्स 2.6 के बाद से, कर्नेल मुक्त फ़ाइल हैंडल को हटा देता है, और "

पहला मूल्य यदि आप बिल्ली है जो आपको ठीक वही देता है जो आप उसके बाद दिखाई देते हैं।

रिकॉर्ड के लिए मैं lsofइसे कुछ मात्रा में ठगने के साथ भी मिलान करने के लिए आउटपुट नहीं प्राप्त कर सका, लेकिन मैं इकट्ठा करता हूं कि अगर कर्नेल अपनी सूची से कहीं अधिक आधिकारिक रूप से कहता है, तो आप क्या करेंगे lsof


1
यहाँ मेरी lsof उत्पादन होता है: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065। यहाँ फ़ाइल nr क्या कहते हैं [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428:। बड़ी विसंगति (1,000,000 + बनाम 2784) इस तथ्य के कारण है कि lsofइसमें सभी चीजें शामिल हैं जिनमें फ़ाइल-डिस्क्रिप्टर उनके साथ जुड़ा नहीं है: लाइब्रेरी फाइलें, एक्सक्यूटेबल्स, इत्यादि, यदि आप केवल फाइल डिस्क्रिप्टर में रुचि रखते हैं, तो file-nrजाने का रास्ता है, अन्यथा आपको lsof या समकक्ष की आवश्यकता है।
माइकल मार्टिनेज

inode-nrइसके बजाय उसी स्थान पर प्रयास करें ।
मैथ्यू इफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.