بعد یهو
nginx -s reload میزنی و کل سرویسها از دسترس خارج میشن امروز موقع ریلیز یکی از پروژهها متوجه شدیم که Nginx یه محدودیت کمتر شناختهشده داره:
NGX_MAX_PROCESSES
مستر برای Child Processها حداکثر 1024 تا Slot داره؛ یعنی Nginx نمیتونه بیشتر از این تعداد Process رو همزمان مدیریت کنه.
البته این عدد کاملاً جدا از
worker_connections هست که داخل nginx.conf تعیین میکنیم و مشخص میکنه هر Worker چند Connection میتونه داشته باشه.ضمن اینکه محدودیتی که اینجا راجع بهش صحبت میکنم از داخل
nginx.conf قابل تغییر نیست و توی سورس Nginx تعریف شده.حالا اگه
worker_processes auto داشته باشی، روی ۵۱۲ Core تقریباً ۵۱۲ تا Worker داری.موقع Reload هم Nginx اول Workerهای جدید رو بالا میاره و Workerهای قدیمی رو نگه میداره تا Connectionهای موجودشون تموم بشه.
یعنی خیلی راحت میرسی به:
512 old workers + 512 new workers = 1024
حالا اگه فقط چند تا Worker از Reload قبلی هنوز Gracefully خارج نشده باشن، دیگه برای ساختن همه Workerهای جدید Slot کافی وجود نداره
و اینجاست که فاجعه اتفاق میافته:
no more than 1024 processes can be spawned
روی سرورهای خیلی بزرگ، استفاده از
worker_processes auto همیشه هم بهترین انتخاب نیست.پس بهتره همیشه حواسمون به کانفیگهایی که در حالت
auto میزان مصرف منابعشون رو بر اساس منابع موجود سرور انتخاب میکنن باشه؛ چون چیزی که روی یه سرور معمولی کاملاً منطقیه، روی یه سرور خیلی بزرگ ممکنه ما رو به یه Limit فاجعهبار برسونه @DevTwitter | <Mohammad Falahat/>
