हाई-लोड Linux सर्वर पर अक्सर 'too many open files' एरर होती है। इसका मतलब है कि एक प्रोसेस ने बहुत सारी फ़ाइलें (फाइल डिस्क्रिप्टर) खोल ली हैं और नई नहीं खोल सकता। Linux में, प्रत्येक प्रोसेस या यूज़र के लिए अधिकतम ओपन फ़ाइल लिमिट डिफ़ॉल्ट रूप से सेट होती हैं और मान काफी छोटे होते हैं।
इस लेख में हम सीखेंगे कि Linux में अधिकतम ओपन फ़ाइलों की संख्या पर वर्तमान लिमिट कैसे चेक करें और इसे पूरे होस्ट, व्यक्तिगत सर्विस या वर्तमान सत्र के लिए कैसे बदलें।
'Too Many Open Files' एरर और Linux में ओपन फ़ाइल लिमिट
सबसे पहले, आइए देखें कि 'too many open files' एरर कहां दिखाई देती है। यह सबसे अधिक बार NGINX/httpd वेब सर्वर या डेटाबेस सर्वर (MySQL/MariaDB/PostgreSQL) वाले सर्वर पर बड़ी संख्या में लॉग पढ़ते समय होती है। उदाहरण के लिए, जब Nginx वेब सर्वर ओपन फ़ाइल लिमिट से अधिक हो जाता है, तो आपको एरर दिखाई देगी:
socket () failed (29: Too many open files) while connecting to upstream

इस कमांड का उपयोग करके, आप अधिकतम फाइल डिस्क्रिप्टर प्राप्त कर सकते हैं जो आपका सिस्टम खोल सकता है:
# cat /proc/sys/fs/file-max
वर्तमान यूज़र के लिए ओपन फ़ाइल लिमिट 1024 है। आप इसे इस तरह चेक कर सकते हैं:
# ulimit -n

दो लिमिट प्रकार हैं: Hard और Soft। एक यूज़र सॉफ्ट लिमिट बदल सकता है (हालांकि, सॉफ्ट मान हार्ड वाले से अधिक नहीं हो सकता)। केवल एक विशेषाधिकार प्राप्त या रूट यूज़र हार्ड लिमिट मान बदल सकता है।
सॉफ्ट लिमिट प्रदर्शित करने के लिए, यह कमांड चलाएं:
# ulimit -nS
हार्ड लिमिट मान प्रदर्शित करने के लिए:
# ulimit -nH
Linux में मैक्स ओपन फ़ाइल लिमिट कैसे बढ़ाएं?
सभी सर्विस को बड़ी संख्या में फ़ाइलें खोलने की अनुमति देने के लिए, आप अपने Linux OS में लिमिट बदल सकते हैं। नई सेटिंग्स को स्थायी बनाने और सर्वर या सत्र रीस्टार्ट के बाद उनके रीसेट को रोकने के लिए, आपको /etc/security/limits.conf में परिवर्तन करने होंगे। ये लाइनें जोड़ें:
* hard nofile 97816 * soft nofile 97816
यदि आप Ubuntu उपयोग कर रहे हैं, तो यह लाइन भी जोड़ें:
session required pam_limits.so
यह पैरामीटर यूज़र ऑथेंटिकेशन के बाद ओपन फ़ाइल लिमिट सेट करने की अनुमति देता है।
कोई भी परिवर्तन करने के बाद, टर्मिनल रीलोड करें और max_open_files मान चेक करें:
# ulimit -n
97816
प्रति सर्विस ओपन फ़ाइल डिस्क्रिप्टर लिमिट बढ़ाना
आप पूरे ऑपरेटिंग सिस्टम के बजाय किसी विशिष्ट सर्विस के लिए ओपन फ़ाइल डिस्क्रिप्टर की लिमिट बदल सकते हैं। आइए apache को उदाहरण के रूप में लें। Systemctl का उपयोग करके सर्विस सेटिंग्स खोलें:
# systemctl edit httpd.service
आप जो लिमिट चाहते हैं उन्हें जोड़ें, उदाहरण के लिए:
[Service] LimitNOFILE=16000 LimitNOFILESoft=16000

परिवर्तन करने के बाद, सर्विस कॉन्फिगरेशन अपडेट करें और इसे रीस्टार्ट करें:
# systemctl daemon-reload
# systemctl restart httpd.service
यह सुनिश्चित करने के लिए कि मान बदल गए हैं, सर्विस PID प्राप्त करें:
# systemctl status httpd.service
उदाहरण के लिए, सर्विस PID 3724 है:
# cat /proc/3724/limits | grep "Max open files"

इस प्रकार, आपने किसी विशिष्ट सर्विस के लिए अधिकतम ओपन फ़ाइलों की संख्या के मान बदल दिए हैं।
Nginx और Apache के लिए मैक्स ओपन फ़ाइल लिमिट कैसे सेट करें?
वेब सर्वर के लिए ओपन फ़ाइलों की संख्या पर लिमिट बदलते समय, आपको सर्विस कॉन्फिगरेशन फ़ाइल भी बदलनी होगी। उदाहरण के लिए, Nginx कॉन्फिगरेशन फ़ाइल /etc/nginx/nginx.conf में निम्न डायरेक्टिव मान निर्दिष्ट/बदलें:
worker_rlimit_nofile 16000
हाई लोडेड 8-कोर सर्वर पर worker_connections 8192 के साथ Nginx कॉन्फिगर करते समय, आपको worker_rlimit_nofile में 8192*2*8 (vCPU) = 131072 निर्दिष्ट करना होगा।
फिर Nginx रीस्टार्ट करें।
Apache के लिए, एक डायरेक्टरी बनाएं:
# mkdir /lib/systemd/system/httpd.service.d/
फिर limit_nofile.conf फ़ाइल बनाएं:
# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

इसमें जोड़ें:
[Service] LimitNOFILE=16000
httpd रीस्टार्ट करना न भूलें।
वर्तमान सत्र के लिए ओपन फ़ाइल लिमिट बदलना
अपने टर्मिनल सत्र के लिए अधिकतम ओपन फ़ाइल लिमिट बदलने के लिए, यह कमांड चलाएं:
# ulimit -n 3000
टर्मिनल बंद करने और नया सत्र बनाने के बाद, लिमिट /etc/security/limits.conf में निर्दिष्ट मूल मान पर वापस आ जाएंगी।
सिस्टम के लिए सामान्य मान /proc/sys/fs/file-max बदलने के लिए, /etc/sysctl.conf में fs.file-max मान बदलें:
fs.file-max = 100000
और इसे लागू करें:
# sysctl -p

इस लेख में हमने सीखा कि Linux में ओपन फ़ाइल डिस्क्रिप्टर लिमिट का मान बहुत छोटा होने पर समस्या कैसे हल करें, और सर्वर पर इन लिमिट को बदलने के कुछ विकल्पों पर चर्चा की।