খুব প্রায়ই 'অনেকগুলি খোলা ফাইল৷ হাই-লোড লিনাক্স সার্ভারে ত্রুটি দেখা দেয়। এর মানে হল যে একটি প্রক্রিয়া অনেকগুলি ফাইল (ফাইল বর্ণনাকারী) খুলেছে এবং নতুনগুলি খুলতে পারে না। লিনাক্সে, প্রতিটি প্রক্রিয়া বা ব্যবহারকারীর জন্য ডিফল্টরূপে সর্বাধিক খোলা ফাইলের সীমা সেট করা হয় এবং মানগুলি বেশ ছোট।
এই নিবন্ধে আমরা শিখব কিভাবে লিনাক্সে খোলা ফাইলের সর্বোচ্চ সংখ্যার বর্তমান সীমা চেক করতে হয় এবং কীভাবে পুরো হোস্ট, পৃথক পরিষেবা বা বর্তমান সেশনের জন্য এটি পরিবর্তন করতে হয়।
'অনেক বেশি ফাইল খোলা' ত্রুটি এবং লিনাক্সে ফাইলের সীমা খুলুন
প্রথমত, দেখা যাক কোথায় 'অনেকগুলি খোলা ফাইল' ত্রুটি দেখা যাচ্ছে। বেশিরভাগ সময় এটি একটি ইনস্টল করা 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
দুটি সীমা প্রকার রয়েছে:হার্ড এবং নরম . একজন ব্যবহারকারী একটি নরম সীমা পরিবর্তন করতে পারেন (তবে, নরম মান কঠিন এক অতিক্রম করতে পারে না)। শুধুমাত্র একটি বিশেষ সুবিধাপ্রাপ্ত বা রুট ব্যবহারকারী একটি হার্ড সীমা মান পরিবর্তন করতে পারেন।
নরম সীমা প্রদর্শন করতে, এই কমান্ডটি চালান:
# ulimit –nS
হার্ড সীমা মান প্রদর্শন করতে:
# ulimit -nH
লিনাক্সে সর্বোচ্চ খোলা ফাইলের সীমা কীভাবে বাড়ানো যায়?
সমস্ত পরিষেবাগুলিকে প্রচুর সংখ্যক ফাইল খোলার অনুমতি দিতে, আপনি আপনার Linux OS-এ সীমা পরিবর্তন করতে পারেন৷ নতুন সেটিংস স্থায়ী করতে এবং সার্ভার বা সেশন পুনরায় চালু হওয়ার পরে তাদের রিসেট প্রতিরোধ করতে, আপনাকে অবশ্যই /etc/security/limits.conf এ পরিবর্তন করতে হবে . এই লাইন যোগ করুন:
* hard nofile 97816 * soft nofile 97816
আপনি যদি উবুন্টু ব্যবহার করেন তবে এই লাইনটিও যোগ করুন:
session required pam_limits.so
এই প্যারামিটারটি ব্যবহারকারীর প্রমাণীকরণের পরে খোলা ফাইলের সীমা সেট করার অনুমতি দেয়৷
কোনো পরিবর্তন করার পরে, টার্মিনালটি পুনরায় লোড করুন এবং max_open_files মান পরীক্ষা করুন:
# ulimit -n
97816
পরিষেবা প্রতি ওপেন ফাইল বর্ণনার সীমা বাড়ানো
আপনি সম্পূর্ণ অপারেটিং সিস্টেমের পরিবর্তে একটি নির্দিষ্ট পরিষেবার জন্য খোলা ফাইল বর্ণনাকারীর সীমা পরিবর্তন করতে পারেন। একটি উদাহরণ হিসাবে অ্যাপাচি নেওয়া যাক। 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 16000worker_connections 8192 সহ একটি উচ্চ লোড করা 8-কোর সার্ভারে Nginx কনফিগার করার সময়, আপনাকে 8192*2*8 (vCPU) =131072 নির্দিষ্ট করতে হবে worker_rlimit_nofile এ।
তারপর Nginx পুনরায় চালু করুন।
অ্যাপাচির জন্য, একটি ডিরেক্টরি তৈরি করুন:
# 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
এই প্রবন্ধে আমরা শিখেছি কিভাবে লিনাক্সে ওপেন ফাইল ডিসক্রিপ্টারের সীমার মান খুব কম হলে সমস্যাটি সমাধান করা যায় এবং সার্ভারে এই সীমা পরিবর্তনের কিছু বিকল্প নিয়ে আলোচনা করেছি৷