خطای Too many open files چیست؟
خطای Error in accept: Too many open files یکی از خطاهای رایج سرورهای لینوکسی است که نشاندهنده رسیدن تعداد فایلهای باز (File Descriptors) به حداکثر مجاز سیستمعامل است. این خطا میتواند باعث از کار افتادن دایرکت ادمین، وبسرور (Apache/LiteSpeed)، MySQL و سایر سرویسها شود.
هر فرآیند در لینوکس محدودیتی در تعداد فایلهایی که میتواند همزمان باز داشته باشد دارد. وقتی یک سرویس مانند Apache یا دایرکت ادمین به این محدودیت میرسد، دیگر نمیتواند اتصالات جدید بپذیرد و خطای Too many open files را ثبت میکند.
دلایل بروز خطا
محدودیت پایین ulimit در سیستمعامل، تعداد زیاد سایتها و اتصالات همزمان روی سرور، نشت فایل (File Descriptor Leak) در سرویسها، و تنظیمات پیشفرض سیستمعامل که برای سرورهای پرترافیک کافی نیست، از دلایل اصلی هستند.
بررسی محدودیت فعلی
ابتدا محدودیت فعلی سیستم را بررسی کنید:
# محدودیت سطح سیستم
cat /proc/sys/fs/file-max
# محدودیت سطح کاربر
ulimit -n
# تعداد فایلهای باز فعلی
cat /proc/sys/fs/file-nr
روشهای رفع خطا
روش ۱: افزایش محدودیت سطح سیستم
فایل /etc/sysctl.conf را ویرایش کنید:
nano /etc/sysctl.conf
خط زیر را اضافه یا ویرایش کنید:
fs.file-max = 500000
تغییرات را اعمال کنید:
sysctl -p
روش ۲: افزایش محدودیت سطح کاربر
فایل /etc/security/limits.conf را ویرایش کنید:
nano /etc/security/limits.conf
خطوط زیر را اضافه کنید:
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
روش ۳: تنظیم محدودیت برای سرویسهای systemd
برای سرویسهایی که با systemd مدیریت میشوند، باید محدودیت را در فایل سرویس تنظیم کنید. مثلاً برای دایرکت ادمین:
mkdir -p /etc/systemd/system/directadmin.service.d
nano /etc/systemd/system/directadmin.service.d/limits.conf
محتوا:
[Service]
LimitNOFILE=65535
و برای Apache:
mkdir -p /etc/systemd/system/httpd.service.d
nano /etc/systemd/system/httpd.service.d/limits.conf
با همان محتوای LimitNOFILE.
سپس systemd را ریلود کنید:
systemctl daemon-reload
systemctl restart directadmin
systemctl restart httpd
روش ۴: افزایش محدودیت در دایرکت ادمین
در فایل تنظیمات دایرکت ادمین نیز میتوانید تنظیمات مرتبط را بهینه کنید:
nano /usr/local/directadmin/conf/directadmin.conf
بررسی فایلهای باز هر سرویس
برای شناسایی سرویسی که بیشترین فایل باز را دارد:
# لیست فایلهای باز Apache
lsof -c httpd | wc -l
# لیست فایلهای باز MySQL
lsof -c mysqld | wc -l
# خلاصه فایلهای باز به تفکیک پروسس
lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
پیشگیری دائمی
تنظیمات بالا را بهصورت دائمی در فایلهای پیکربندی اعمال کنید تا پس از ریاستارت سرور باقی بمانند. مانیتورینگ منظم تعداد فایلهای باز نیز توصیه میشود. اگر تعداد فایلهای باز مرتباً به محدودیت نزدیک میشود، ممکن است منابع سرور کافی نباشد.
ارتقا به یک سرور مجازی با رم و CPU بیشتر و تنظیمات بهینهشده، بسیاری از مشکلات ناشی از محدودیت منابع را حل میکند.
برای بهینهسازی حرفهای تنظیمات سرور و رفع مشکلات پیچیده، از خدمات کانفیگ سرور میهن هاستینگ استفاده کنید.
⚙️ کانفیگ و بهینهسازی سرور
رفع خطاهای سرور، بهینهسازی ulimit و تنظیمات دایرکت ادمین توسط تیم فنی میهن هاستینگ.