হাই-লোড লিনাক্স সার্ভারে 'too many open files' এরর খুব সাধারণ। এর মানে হলো একটি প্রসেস খুব বেশি ফাইল খুলেছে (ফাইল ডেসক্রিপ্টর) এবং আর নতুন ফাইল খুলতে পারছে না। লিনাক্সে, প্রতিটি প্রসেস বা ইউজারের জন্য maksimum ওপেন ফাইল লিমিট ডিফল্টভাবে সেট করা থাকে এবং মানগুলো যথেষ্ট ছোট।
এই আর্টিকেলে আমরা শিখব কীভাবে লিনাক্সে maksimum ওপেন ফাইল লিমিট চেক করতে হয় এবং কীভাবে এটি পুরো হোস্ট, পৃথক সার্ভিস বা বর্তমান সেশনের জন্য পরিবর্তন করতে হয়।
'Too Many Open Files' এরর এবং লিনাক্সে ওপেন ফাইল লিমিট
প্রথমে, দেখি '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
একটি বর্তমান ইউজারের জন্য ওপেন ফাইল লিমিট ১০২৪। আপনি এভাবে চেক করতে পারেন:
# ulimit -n
দুই ধরনের লিমিট থাকে: Hard এবং Soft। একজন ইউজার সফট লিমিট পরিবর্তন করতে পারে (তবে, সফট মান হার্ড মান অতিক্রম করতে পারে না)। শুধু প্রিভিলেজড বা রুট ইউজার হার্ড লিমিট মান পরিবর্তন করতে পারে।
সফট লিমিট দেখতে এই কমান্ডটি চালান:
# ulimit -nS
হার্ড লিমিট মান দেখতে:
# ulimit -nH
লিনাক্সে Max ওপেন ফাইল লিমিট কিভাবে বাড়াবেন?
সকল সার্ভিস একটি বড় সংখ্যক ফাইল খুলতে পারে, সেটি অনুমতি দিতে আপনি আপনার লিনাক্স 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 ৩৭২৪:
# cat /proc/3724/limits | grep "Max open files"
এভাবে, আপনি একটি নির্দিষ্ট সার্ভিসের জন্য maksimum ওপেন ফাইল সংখ্যার মান পরিবর্তন করেছেন।
Nginx এবং Apache-এর জন্য Max ওপেন ফাইল লিমিট সেট কিভাবে করবেন?
ওয়েব সার্ভারের জন্য ওপেন ফাইল সংখ্যার লিমিট পরিবর্তন করার সময়, আপনাকে সার্ভিস কনফিগারেশন ফাইলও পরিবর্তন করতে হবে। উদাহরণস্বরূপ, Nginx কনফিগারেশন ফাইল /etc/nginx/nginx.conf-এ নিচের ডিরেক্টিভ মান নির্দিষ্ট/বদলান:
worker_rlimit_nofile 16000
উচ্চ লোডেড ৮-কোর সার্ভারে 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 রিস্টার্ট করা ভুলবেন না।
কারেন্ট সেশনের জন্য ওপেন ফাইল লিমিট পরিবর্তন
আপনার টার্মিনাল সেশনের জন্য maksimum ওপেন ফাইল লিমিট পরিবর্তন করতে এই কমান্ডটি চালান:
# ulimit -n 3000
টার্মিনাল বন্ধ করে নতুন সেশন তৈরি করার পর, লিমিটগুলো /etc/security/limits.conf-এ নির্দিষ্ট অরিজিনাল মানগুলোর দিকে ফিরে যাবে।
সিস্টেমের সাধারণ মান /proc/sys/fs/file-max পরিবর্তন করতে, /etc/sysctl.conf-এ fs.file-max মান পরিবর্তন করুন:
fs.file-max = 100000
এবং প্রযোজ্য করুন:
# sysctl -p
এই আর্টিকেলে আমরা শিখেছি কীভাবে লিনাক্সে ওপেন ফাইল ডেসক্রিপ্টর লিমিট খুব ছোট হলে সমস্যা সমাধান করতে হয়, এবং সার্ভারে এই লিমিটগুলো পরিবর্তন করার কিছু অপশন নিয়ে আলোচনা করেছি।