कर्नेल इनोटिफ़ वॉच लिमिट तक पहुँच गया


206

मैं वर्तमान में एक लाइन बॉक्स पर एक समस्या का सामना कर रहा हूं, जहां रूट के रूप में मेरे पास रिटर्निंग एरर है क्योंकि inotify वॉच की सीमा समाप्त हो चुकी है।

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

मैंने थोड़ा सा गुमराह किया और मैंने पाया हर समाधान सीमा को बढ़ाने के लिए है:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

लेकिन मुझे उस मूल्य को बढ़ाने के परिणामों की कोई जानकारी नहीं मिल पा रही थी। मुझे लगता है कि डिफ़ॉल्ट कर्नेल मान एक कारण के लिए सेट किया गया था, लेकिन यह विशेष रूप से उपयोग के लिए अपर्याप्त लगता है। (उदाहरण के लिए, ड्रॉपबॉक्स का उपयोग करते समय बड़ी संख्या में फ़ोल्डर, या सॉफ़्टवेयर जो बहुत सारी फ़ाइलों की निगरानी करता है)

तो यहाँ मेरे सवाल हैं:

  • क्या उस मूल्य को उठाना सुरक्षित है और बहुत अधिक मूल्य के परिणाम क्या होंगे?
  • क्या यह पता लगाने का एक तरीका है कि वर्तमान में सेट की गई घड़ियां क्या हैं और कौन सी प्रक्रिया उन्हें निर्धारित करने में सक्षम है कि यदि निर्धारित सीमा दोषपूर्ण सॉफ़्टवेयर के कारण नहीं है?

आपने शायद इसे अब तक जाँच लिया है क्योंकि यह 8 महीने का है, लेकिन क्या आपकी ड्राइव पूरी है? "पूंछ: 'नहीं देख सकता /' / var / log / संदेश ': डिवाइस पर कोई जगह नहीं बची"
froggythefrog

जवाबों:


273

क्या उस मूल्य को उठाना सुरक्षित है और बहुत अधिक मूल्य के परिणाम क्या होंगे?

हां, उस मूल्य को उठाना सुरक्षित है और नीचे संभावित लागत [ स्रोत ] हैं:

  • प्रत्येक इस्तेमाल की जाने वाली घड़ी में 540 बाइट्स (32-बिट सिस्टम), या 1 kB (डबल - 64-बिट पर) [स्रोत: 1 , 2 ] लगते हैं।
  • यह कर्नेल मेमोरी से बाहर आता है , जो कि अकल्पनीय है।
  • मान लें कि आपने 524288 पर अधिकतम सेट किया था और सभी का उपयोग किया गया था (असंभव), आप लगभग 256MB / 512MB 32-बिट / 64-बिट कर्नेल मेमोरी का उपयोग करेंगे।
    • ध्यान दें कि आपका एप्लिकेशन अतिरिक्त मेमोरी का उपयोग करने के लिए इनोटिफ़ाइड हैंडल, फ़ाइल / निर्देशिका पथ आदि का ट्रैक रखने के लिए भी उपयोग करेगा - यह इसके डिजाइन पर कितना निर्भर करता है।

घड़ियों को देखने के लिए अधिकतम संख्या की जाँच करें:

cat /proc/sys/fs/inotify/max_user_watches

इनोटिफ़ घड़ियों की अधिकतम संख्या निर्धारित करने के लिए

अस्थायी रूप से:

  • sudo sysctl fs.inotify.max_user_watches=अंत में अपने पसंदीदा मूल्य के साथ चलाएँ ।

स्थायी रूप से ( अधिक विस्तृत जानकारी ):

  • fs.inotify.max_user_watches=524288अपनी sysctl सेटिंग में डालें । आपके सिस्टम के आधार पर वे निम्नलिखित स्थानों में से एक में हो सकते हैं:
    • डेबियन / RedHat: /etc/sysctl.conf
    • आर्क: /etc/sysctl.d/उदाहरण के लिए, एक नई फ़ाइल डालें/etc/sysctl.d/40-max-user-watches.conf
  • आप रिबूट से बचने के लिए sysctl सेटिंग्स को पुनः लोड करना चाह सकते हैं: sysctl -p(डेबियन / रेडहैट) या sysctl --system(आर्क)

यह देखने के लिए जांचें कि क्या अधिकतम संख्या में inotify घड़ियां पहुंच गई हैं:

किसी भी पुरानी फ़ाइल पर (अनुसरण करें) विकल्प के tailसाथ प्रयोग करें -f, जैसे tail -f /var/log/dmesg: - यदि सब ठीक है, तो यह अंतिम 10 लाइनों को दिखाएगा और रोक देगा; Ctrl-C के साथ गर्भपात - यदि आप घड़ियों से बाहर हैं , तो यह कुछ हद तक गुप्त त्रुटि के साथ विफल हो जाएगा :

पूंछ: '/ var / log / dmsg' नहीं देख सकता: डिवाइस पर कोई स्थान नहीं बचा है

देखने के लिए क्या inotify घड़ियों का उपयोग कर रहा है

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

पहला कॉलम inotify fds (यद्यपि घड़ियों की संख्या नहीं है) की संख्या को इंगित करता है और दूसरा उस प्रक्रिया के PID को दिखाता है [स्रोत: 1 , 2 ]।


3
I guess very few codes need the values higher than the defaultड्रॉपबॉक्स को एक उच्च सीमा की आवश्यकता हो सकती है, जो आपके पास कितनी फ़ाइलों पर निर्भर करता है। Iv'e कोई मुद्दों के साथ मेरा उठाया। वास्तव में, ड्रॉपबॉक्स अधिसूचना (जो तब होती है जब यह अपनी सीमा तक पहुंच जाती है) स्पष्ट रूप से आपको इसे बढ़ाने के लिए कहती है।
फल्मरी

1
@ ultrasawblade- ने नोटिफिकेशन को बदल दिया। सुस्ती धीमी और छोटी थी। inotify का उपयोग डायरेक्ट्रीज़ पर किया जा सकता है, और एक डायरेक्टरी को "चेंज" किया जाएगा जब उस डायरेक्टरी में एक फाइल (एक लेवल डीप) को संशोधित किया जाता है। निर्देशिकाएँ वैसे भी सिर्फ फाइलें हैं।
बीटगैमिट

6
"स्थायी रूप से: मान को / proc / sys / fs / inotify / max_user_watches के भीतर बदलें" <- यह गलत है। इसे स्थायी करने के लिए आपको बदलने की आवश्यकता है/etc/sysctl.conf
Merc

3
sysctl! = systemd, आपके स्पष्टीकरण में। और /etc/sysctl.dनए RedHat- आधारित सिस्टम पर भी काम करता है।
अप्रैल को y१ 'बजे 6१।

1
@stackexchanger यदि आपको बहुत यकीन है कि ये समान हैं (जैसे आपने परीक्षण किया है), तो कृपया प्रश्न को सबमिट करें और संपादित करें। मैंने खुद जाँच नहीं की है, और मुझे पता है कि डिस्ट्रोस पैकेज को पैच करते हैं, इसलिए व्यवहार एक ही पैकेज के लिए अलग हो सकता है। यह पैकेज संस्करणों में अंतर का उल्लेख नहीं करना है।
tshepang
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.