رفع خطای WORKER TIMEOUT در برنامه های Django
یکی از خطاهایی که ممکن است هنگام اجرای برنامههای Django با آن روبرو شوید، WORKER TIMEOUT است. این ارور معمولاً زمانی رخ میدهد که پردازش درخواستها بیش از زمان مشخصشده طول بکشد یا منابع سرور برای پردازش درخواستها کافی نباشند. مشکل مذکور اغلب در وبسرورهایی مانند Gunicorn دیده میشود که برای اجرای برنامههای وب در محیط Production استفاده میگردند. در ادامه راهحلهای مختلف برای رفع آن توضیح داده میشود:
افزایش مقدار Timeout
برای رفع این مشکل، میتوانید مقدار Timeout را افزایش دهید. این کار به Gunicorn اجازه میدهد زمان بیشتری برای پردازش درخواستها اختصاص دهد. Gunicorn به طور پیشفرض 30 ثانیه برای پردازش هر درخواست در نظر میگیرد. اگر یک درخواست بیشتر از این زمان طول بکشد، خطای WORKER TIMEOUT رخ میدهد لذا میتوانید مقدار Timeout را از طریق خط فرمان یا Terminal در سرور افزایش دهید:
gunicorn --timeout 120 myproject.wsgi:application
یا با اضافه کردن تنظیمات در فایل کانفیگ Gunicorn آن را اصلاح نمایید:
timeout = 120
مقدار Timeout را باید با توجه به نیاز برنامه خود تعیین کنید. به عنوان مثال، اگر درخواستهایی دارید که معمولاً بین 1 تا 2 دقیقه زمان میبرند، مقدار Timeout را حداقل روی 120 تنظیم نمایید.
افزایش تعداد Workerها
اگر تعداد درخواستها زیاد و تعداد Workerهای Gunicorn کم باشند، ممکن است درخواستها در صف بمانند و منجر به خطای TIMEOUT شوند. با افزایش تعداد Workerها میتوانید پردازش درخواستها را بهبود دهید.
برای این کار با استفاده از دستور زیر و از طریق خط فرمان یا Terminal تعداد worker ها را می توان افزایش داد:
gunicorn --workers 3 myproject.wsgi:application
توجه داشته باشید که تعداد Workerها معمولاً برابر است با:
(2 x تعداد هستههای CPU) + 1
استفاده از Workerهای Async یا Gevent
در صورتی که برنامه شما درخواستهایی با عملیات I/O سنگین (مانند خواندن و نوشتن از دیتابیس یا ارسال درخواستهای HTTP خارجی) دارد، استفاده از Workerهای Asynchronous میتواند عملکرد را بهبود ببخشد:
gunicorn --worker-class gevent myproject.wsgi:application
بهینهسازی کد برنامه
بهینهسازی کدهای برنامه یکی از مهمترین اقداماتی است که میتوانید برای جلوگیری از خطای WORKER TIMEOUT انجام دهید. چند نکته برای بهینهسازی مهم است:
بهینهسازی کدهای برنامه یکی از مهمترین اقداماتی است که میتوانید برای جلوگیری از خطای WORKER TIMEOUT انجام دهید. چند نکته برای بهینهسازی مهم است:
-
بررسی و کاهش عملیات سنگین یا زمانبر در Viewها
-
استفاده از Caching برای دادههای پرکاربرد
-
بهینهسازی Queryهای دیتابیس با استفاده از ابزارهایی مانند Django Debug Toolbar
-
پردازشهای طولانی را به Celery یا یک سیستم Task Queue منتقل نمایید
بررسی Load Balancer
اگر برنامه شما با Load Balancer اجرا میشود، مطمئن شوید که تنظیمات Timeout در Load Balancer (مانند Nginx یا AWS ALB) به اندازه کافی زیاد است تا درخواستها به Gunicorn منتقل شوند.
فعال کردن Logging برای Debug
فعال کردن Logging میتواند به شما کمک کند تا درخواستهایی که منجر به Timeout میشوند را شناسایی کنید به طور مثال:
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
def my_view(request):
logger.debug("Processing request started")
logger.debug("Processing request finished")
مانیتورینگ سیستم
از ابزارهایی مانند htop یا top برای بررسی مصرف منابع سرور استفاده نمایید. اگر CPU یا RAM به شدت درگیر است، ممکن است نیاز به ارتقای منابع سخت افزاری یا توزیع بهتر منابع داشته باشید.