سلام
چند روز پیش با دغدغه اینکه چطوری performance سیستمی که نوشتم رو ببرم بالاتر از خواب بیدار شدم. توی جلسه daily هم لید تیم کلاینت میگفت چرا بعضی از اندپوینت ها گاهی کار میکنن و گاهی نه؟
من هم گفتم ماست من ترش نیست و اندپوینت مد نظر درسته و مشکل از سمت خودته.
با این جواب ها خیلی به توافق نرسیدیم و قرار شد که ببینم ایراد از کجاست.
بعد از اون دنبال یک ابزاری بودم که بتونیم همه اندپوینت هارو پروفایل کنیم و تیم کلاینت خودش بتونه ببینه داره چیکار میکنه.
با این ذهنیت که اگر من همچین مشکلی دارم پس حتما یکی دیگه هم این رو داشته و حلش کرده شروع کردم به جست و جو کردن راه حل.
نتیجه تمام جست و جوی من ختم شد به ابزاری به اسم silk که با دستور 'pip install django-silk
' نصب میشود. با اضافه کردن به INSTALLED APPS و MIDDLEWARE و بعدش زدن دستور python manage.py migrate این ابزار آماده استفاده است. میتونید دکوریتورش رو به اندپوینت اضافه اش کنید و خودش موارد زیر رو حساب میکنه و توی مرورگرتون نشون میده و یک فیلتر خوبی هم داره که کلی کار راه می اندازه.
1- Overall Time
2- Queries Time
3- Queries Count
4- Method
5- Status Code
6- URL
7- Receive time
با کلیک کردن روی هر کدوم از کارت های این صفحه موارد زیر می آید
Detail:
1- Request Headers
2- Response Headers
3- Raw Response Body
4- Response Body
5- Curl
6- Django Test Client
SQL:
1- All Table used and joins count
2- Execution Time (ms)
CProfile:
1- The below is a dump from the cPython profiler.
استفاده اصلی من از سیلک فهمیدن performance سیستمی که نوشتم چون کامل همه چی رو نشون میده. و لازم هم نیست برو توی کانتینر چیزی رو چک کنم یا اینکه برم توی sentry و ارور ها رو ببینم. میتونم همون ریکوئست را دوباره تکرار کنم و ببینم چه اتفاقی می افتد.
راستی سیلک فقط برای سوپر یوزر ها هم فعال است.
لینک سایت سیلک
https://silk.readthedocs.io/en/latest/
تجربه خیلی مهم:
سیلک رو به هیچ وجه نبرید داخل پروداکشن چون مقدار زیادی رایت و دلیت روی دیتابیس داره که با افزایش تعداد رکوئست ها و با توجه به حساس بودنش به همه اندپوینت ها نرخ رایت هم افزایش پیدا میکنه. خود سیلک تعداد 10000 تا رکوئست رو نگه میداره یعنی اگر شما در مدت زمانی که ریسپانس رو اماده میکنید اگر 10000 تا رکوئست بیاد سمتتون هنوز روی دیتابیس یک پروسس برای رایت روی رکورد سیلک باز هست و داره کار میکنه (یعنی اون رکورد رو لاک کرده) و در همون مدت رکوئست میشه ده هزارمین رکورد دیتابیس سیلک و تریگر فعال میشه که پاکش کنه. حالا یک پروسس میخواد رایت کنه و یکی دیگه دیلیت اینجاست که دیتابیس ارور ددلاک برمیگردونه پس اتفاقی که میفته دیلیت از رایت عقب میفته و همه تمرکز سیستم میره سمت پروسس های دیلیت یعنی بقیه کار که مربوط جواب دادن به رکوئست ها کند میشه و سیستم بعد از مدتی قفل میکنه عملا.
این ماجرای یک روز تعطیل من بود که بعد از چندین ساعت مسئله رو پیدا کردم و توی نیم ساعت با یک راه حل ساده برطرفش کردم.
راه حل : یک متغیر محیطی مثل SILK_ACTIVATION ایجاد کنید و هر وقت سیلک رو میخواستید اون رو فعال کنید. مثل DEBUG.
شاید بگید اون ده هزار را به یک میلیون تغییر میدید ولی پاسخ اینجاست که تا کجا افزایش میدید ؟چون سیلک حجم قابل توجهی از دیتابیس رو اشغال میکند.