در کنسول دارکوب برای هر اپ نمودارهای میزان مصرف منابع مختلف نمایش داده میشود. این نمودارها به کاربر کمک میکنند تا که منابع را به شکل بهتری برای اپ خود مدیریت کند. اینجا قصد داریم معنی نمودارهای CPU را توضیح دهیم و نکاتی را در مورد آنها بیان کنیم.
نمودار مصرف CPU
در این نمودار مصرف CPU را بر حسب زمان میبینید. خطی هم در آن نمایش داده شده که حداکثر میزان CPUی است که اپ یا همان کانتینر میتواند استفاده کند.
برای توضیح متریک مصرف CPU باید به جایی که این متریک از آن خوانده میشود نگاه کنیم؛ یعنی کرنل لینوکس. کرنل به ازای هر کانتینر (یا به طور کلی هر پردازه) عددی را برای مصرف CPU میدهد که cpuacct.usage است. این عدد بیان میکند پردازههای کانتینر در مجموع چند نانوثانیه از زمان CPU استفاده کردهاند. چون این عدد مجموع است، باید برای این که در بازههای مختلف مصرف CPU به دست آید نرخ تغییرات آن محاسبه شود. مثلا در زمان t کرنل عدد ۱۰۰۰۰۰ را برای cpuacct.usage یک کانتینر میدهد. در زمان t+1 هم عدد ۳۰۰۰۰۰ را میدهد. ما متوجه میشویم در یک ثانیه دویست هزار نانوثانیه یا ۲۰۰ میکروثانیه (اختلاف دو عدد در زمان t و t+1) از زمان CPU در پردازههای این کانتینر استفاده شده است.
این متریک توسط ابزاری از کرنل خوانده میشود و به واحد ثانیه تبدیل میشود. سپس ابزار مانیتورینگ* آن را دریافت و ذخیره میکند. این کار در بازههای زمانی خاصی به طور متناوب انجام میشود. مثلا هر ۱۰ ثانیه یک بار. در نتیجه ما هر ده ثانیه یک بار مجموع زمان استفاده شده در CPU را برای هر کانتینر داریم. آن چه در نمودار دیده میشود نرخ تغییرات این عدد در یک دقیقه است. یعنی نشان میدهد در هر دقیقه چقدر از زمان CPU مصرف شده است. برای مثال اگر در زمان یک ثانیه به اندازه ۲ ثانیه از CPUهای سیستم استفاده کند یعنی ۲ کور CPU مصرف کرده است.
در این نمودار یک خط افقی هم دیده میشود که حداکثر میزان CPUی است که این کانتینر میتواند استفاده کند؛ این همان عددی است که موقع تعیین منابع برای CPU انتخاب میکنید.
نمودار CPU Throttling
متریک دیگری که برای CPU داریم در نمودار CPU throttling آمده است:
برای توضیح این نمودار باید با مفهوم دیگری در کرنل لینوکس آشنا شویم. در کرنل بازههایی زمانی برای تخصیص CPU به پردازههای سیستم تعریف شده است. طول این بازهها قابل تنظیم است و معمولا ۱۰۰ میلی ثانیه است. فرض کنید یک سیستم با ۴ عدد CPU داریم. در این سیستم در هر بازهی ۱۰۰ میلی ثانیهای زمانی به اندازهی ۴۰۰ میلی ثانیه پردازهها میتوانند از CPU استفاده کنند چون ۴ عدد CPU داریم و هر کدام ۱۰۰ میلی ثانیه دارند.
حال فرض کنید ما برای یک پردازه یا همان کانتینر پایتونی محدودیتی تعیین میکنیم که فقط میتواند ۰.۳ تمام CPUهای این سیستم را مصرف کند. کرنل این ۰.۳ را در آن بازههای ۱۰۰ میلی ثانیهای محاسبه میکند. یعنی از ابتدای بازه تا انتهای آن این پردازهی پایتونی مجموعا میتواند
0.3*100ms=30ms
از تمام CPUهای سیستم استفاده کند. ممکن است در همان ۳۰ میلی ثانیهی اول تمام بودجه مصرف شود و تا ابتدای بازهی دیگر کرنل به این پردازه اجازهی اجرا شدن نخواهد داد.
کرنل برای throttling دو عدد مهم را در اختیار ما میگذارد. اولین عدد تعداد کل بازههای ۱۰۰ میلی ثانیهای است که در آن کانتینر اجرا شده است. دومین عدد تعداد کل بازههایی است که در آنها throttling رخ داده است. پس اگر کانتینری ۱ ثانیه اجرا شود تعداد کل بازهها و عدد اول ۱۰ میشود. اگر در ۲ تا از بازهها این کانتینر throttle
شده باشد عدد دوم ۲ میشود. در نتیجه ۲۰ درصد بازهها throttling داشتند. چیزی که در نمودار دوم نمایش داده میشود همین نسبت است. البته با توجه به این که عدد کرنل مجموع تعداد بازهها را میدهد، نسبت افزایش این دو عدد در نمودار میآید. این اعداد هم توسط همان ابزاری که در قسمت قبل گفتیم خوانده میشوند. سپس ابزار مانیتورینگ در بازههای ۱۰ ثانیهای آنها را جمعآوری میکند.
مقایسه دو نمودار
گاهی در بررسی این نمودارها سوالی پیش میآید که «چرا مصرف CPU به مقدار حداکثر تعیین شده نرسیده است ولی CPU throttling به وجود آمده است؟». با توجه به توضیحات داده شده این موضوع مشخص میشود. اولاً دادههای نمودار مصرف هر ۱۰ ثانیه یک بار خوانده میشوند؛ در نتیجه اگر در این میان افزایش ناگهانی باشد دیده نمیشود و ابتدا و انتهای بازه را فقط میبینیم. دوماً نقاط روی نمودار میانگین یک دقیقهای از دادهها هستند. اگر در بعضی بازههای ۱۰۰ میلی ثانیهای مصرف CPU کانتینر زیاد شده و throttle شود و بعد از آن در بازههایی کم شود، در نمودار مصرف خود را بهخوبی نشان نمیدهد. ولی عدد نمودار throttling افزایش مییابد چون در کرنل پردازههای کانتینر throttle شدهاند. وقتی مصرف CPU افزایش ندارد ولی CPU throttling افزایش قابل توجهی پیدا میکند به این معنی است که سرویس مورد نظر به شکل bursty از CPU استفاده میکند. حضور این دو نمودار زیر هم کمک میکند که متوجه این گونه رفتارهای برنامهی درون کانتینر هم بشویم و در صورت نیاز منابع آن را افزایش دهیم.