خطای Too Many Open Files در سرور: علت واقعی و راه حل عملی

توسعه‌دهنده بک‌اند

خطای Too Many Open Files در سرور: علت واقعی و راه حل عملی

یکی از خطاهایی که تقریبا هر مهندس بک‌اند یا DevOps حداقل یک‌بار در production با آن روبه‌رو شده، این پیام است: Too many open files ...

خطای Too Many Open Files در سرور: علت واقعی و راه حل عملی

مهسا شیخی

توسعه‌دهنده بک‌اند

۱۴۰۵/۷/۱۱
۱ نفر
۵ دقیقه مطالعه

یکی از خطاهایی که تقریبا هر مهندس بک‌اند یا DevOps حداقل یک‌بار در production با آن روبه‌رو شده، این پیام است:

Too many open files

در نگاه اول ساده به نظر می‌رسد، اما وقتی در ساعت اوج ترافیک ظاهر می‌شود، می‌تواند کل سرویس را از دسترس خارج کند. بسیاری از تیم‌ها سریع limit را بالا می‌برند و مشکل را موقتاً حل‌شده فرض می‌کنند. اما علت اصلی معمولاً جای دیگری است.

هر process در لینوکس تعداد مشخصی file descriptor می‌تواند باز کند. این فقط شامل فایل‌های معمولی نیست. socketها، connectionهای دیتابیس، فایل‌های لاگ، pipeها و حتی برخی resourceهای داخلی همگی از همین سهمیه استفاده می‌کنند. وقتی تعداد connectionهای همزمان یا فایل‌های باز از حد مجاز بیشتر شود، سیستم‌عامل دیگر اجازه باز کردن resource جدید نمی‌دهد و سرویس شروع به fail کردن درخواست‌ها می‌کند.

مشکل از آنجا پیچیده‌تر می‌شود که limit پیش‌فرض در بسیاری از سرورها (مخصوصا containerها) نسبتا پایین است. در Kubernetes یا Docker، اگر صریحا تنظیم نکنید، ممکن است با محدودیت‌های سخت‌گیرانه‌تری روبه‌رو شوید.


راه‌حل اصولی فقط افزایش عدد ulimit -n نیست. باید سه لایه را بررسی کنید:

  1. Limit سیستم‌عامل و process
    مقدار ulimit -n و تنظیمات /etc/security/limits.conf یا LimitNOFILE در systemd را چک کنید. در containerها این مقدار را از طریق ulimits در Docker یا securityContext در Kubernetes تنظیم کنید.

  2. نشت resource در خود اپلیکیشن
    شایع‌ترین علت واقعی، بستن‌نشدن connectionها یا فایل‌هاست. connection pool دیتابیس، HTTP client، یا باز کردن فایل بدون close مناسب می‌تواند به‌مرور descriptorها را مصرف کند. ابزارهایی مثل lsof -p <pid> به شما نشان می‌دهند دقیقاً چه چیزهایی باز مانده‌اند.

  3. ظرفیت واقعی سرویس
    اگر سرویس شما به‌طور طبیعی هزاران connection همزمان نیاز دارد، باید هم limit را بالا ببرید و هم معماری را بررسی کنید (مثلاً استفاده بهتر از connection pooling یا asynchronous I/O).


توصیه عملی:

قبل از اینکه فقط عدد را بالا ببرید، یک‌بار با lsof و مانیتورینگ تعداد open files را در زمان اوج ترافیک بررسی کنید. اگر عدد مدام در حال افزایش است و پایین نمی‌آید، با یک memory leak یا connection leak طرف هستید، نه فقط کمبود limit.

این خطا در ظاهر ساده است، اما معمولاً نشانه‌ای از یک مشکل عمیق‌تر در مدیریت resource است. تیم‌هایی که آن را جدی می‌گیرند، هم پایداری بیشتری دارند و هم از surpriseهای ناگهانی در production جلوگیری می‌کنند.

این مطلب برای شما مفید بود؟با لایک کردن، به ما انرژی بدهید
۰ نفر این مطلب را پسندیده‌اند