FreeBSD: "बहुत अधिक खुली फाइलें" लेकिन एक और 160,000 फाइलें खोलने में सक्षम होना चाहिए


11

मेरे पास एक FreeBSD 8 सिस्टम है जो ZFS पर चल रहा है, जिसमें MySQL 5.5 सर्वर है जो लगभग 355GB है और टेराबाइट्स के एक जोड़े के रूप में विकसित होने का अनुमान है।

MySQL "बहुत अधिक खुली फ़ाइलों" के बारे में त्रुटियों को ट्रिगर कर रहा है /etc/hosts.allow। हम स्पष्ट रूप से उपयोग नहीं करते हैं /etc/hosts.allow, लेकिन इसका उपयोग host_access (3) ( libwrap.a) द्वारा किया जाता है, जिसका उपयोग कई चीजों द्वारा किया जाता है।

mysqld[1234]: warning: /etc/hosts.allow, line 15: cannot open /etc/hosts.allow: Too many open files

लेकिन जब मैं जाँचता हूँ तो लगता है कि कोई वास्तविक सीमा है। kern.openfiles staysनिरंतर अवधि में 40,000 से नीचे की रिपोर्ट की गई खुली फाइलों की संख्या , और हमारी सीमा काफी अधिक है:

# sysctl -a |grep files
kern.maxfiles: 204800
kern.maxfilesperproc: 184320
kern.openfiles: 38191

# ulimit -n
184320

Openfiles को असीमित पर सेट किया जाना चाहिए:

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\

MySQL का कहना है कि यह 184320 फ़ाइल हैंडल खोलने में सक्षम होना चाहिए:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

और कुछ जानकारी MySQL यूजर के नजरिए से। मैंने mysql को बंद कर दिया और /usr/local/etc/rc.d/mysql-serverइन वैरिएबल्स को प्रिंट करने के लिए हैक किया, इसलिए इसे MySQL वातावरण का प्रतिनिधित्व करना चाहिए। ध्यान दें कि संख्या 184320 उपरोक्त के अनुरूप है।

# /usr/local/etc/rc.d/mysql-server.stefantest start
Starting mysql.
cpu time               (seconds, -t)  unlimited
file size           (512-blocks, -f)  unlimited
data seg size           (kbytes, -d)  33554432
stack size              (kbytes, -s)  524288
core file size      (512-blocks, -c)  unlimited
max memory size         (kbytes, -m)  unlimited
locked memory           (kbytes, -l)  unlimited
max user processes              (-u)  5547
open files                      (-n)  184320
virtual mem size        (kbytes, -v)  unlimited
swap limit              (kbytes, -w)  unlimited
sbsize                   (bytes, -b)  unlimited
pseudo-terminals                (-p)  unlimited

और, आसान संदर्भ के लिए यहाँ sysctls के लिए विवरण हैं:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process

सम्बंधित


4
ulimit वैश्विक नहीं है, क्या आपको यकीन है कि आपके MySQL के साथ वही ulimit चल रहा है?
derobert

1
तो, क्या मैं देख सकता हूं कि MySQL डेमॉन के लिए ulimit वैल्यू क्या है, और क्या मैं डेमॉन के लिए ulimit वैल्यू को बिना डीमॉन को रोक कर बदल सकता हूं? मुझे पता है कि मैं ulimitस्टार्टअप स्क्रिप्ट या शेल वातावरण में सेट कर सकता हूं , लेकिन इसके लिए मुझे डेटाबेस को बाधित करने की आवश्यकता होगी।
स्टेफन लासवर्स्की

1
/ में देखें, अपने mysql सेवा के PID के साथ उप-तहत। आप cat limitsदेख सकते हैं कि mysql किसके साथ चल रहा है। : आप भी मक्खी (नए कर्नेल के साथ) पर उन्हें बदल सकते हैं echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(जाहिर है रूट के रूप में)
lornix

1
@ लोर्निक्स: यह फ्रीबीएसडी है। मैंने खुद बीएसडी का उपयोग कभी नहीं किया है, लेकिन मुझे यकीन नहीं है कि फ्रीबीएसडी वास्तव में / proc / * / सीमाओं का समर्थन करता है।
मार्टिन वॉन विटिच

1
/procFreeBSD पर डिफ़ॉल्ट रूप से माउंट नहीं किया गया है, लेकिन इसे स्वयं करें sudo mount -t procfs proc /proc, procfs(5)अधिक जानकारी के लिए देखें । एक बार जब आप /procमाउंट हो जाते हैं, तो /proc/$PID/rlimitफ़ाइल को देखें
zygis

जवाबों:


1

/Etc/login.conf की जाँच करें और पता लगाएँ कि कौन सा लॉगिन वर्ग आपके mysql उपयोगकर्ता को सौंपा है। यह शायद डिफ़ॉल्ट या डेमॉन है। यदि आप अपने उपयोगकर्ता के लिए सीमाएँ बदलना चाहते हैं, तो एक नया वर्ग बनाएं, अपने उपयोगकर्ता को उस कक्षा में असाइन करें, उस कक्षा के लिए अपनी पसंद के अनुसार अंग बदलें और फिर "cap_mkdb /etc/login.conf" चलाएं।

यदि आपने इसे अभी तक नहीं पढ़ा है, तो करें: http://www.freebsd.org/doc/handbook/users-limiting.htm

/ Etc / rc द्वारा सिस्टम स्टार्टअप पर शुरू की गई प्रक्रियाएँ डेमन लॉगिन वर्ग को सौंपी जाती हैं ।


0

कुछ ओएस पर नियमित उपयोगकर्ता के लिए सुरक्षा समस्या से बचने के लिए सीमाएं निर्धारित की जाती हैं, आपको man limits.conf
इस फ़ाइल में रीडिंग पर विचार करना चाहिए। यह फ़ाइल प्रति प्रक्रिया की सीमा को निर्धारित करती है जैसे कि अधिकतम संख्या में थ्रेड या अधिकतम संख्या में खुली फ़ाइल। सीमा उपयोग चेहरा वहाँ से आ सकता है। /etc/security/limits.conf

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