رفع مشکل

CPU Steal بالا چیست و چرا سرور مجازی را کند می‌کند؟

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

RAMCPUCPUStealرفع مشکلCPU Steal بالا چیست وچرا سرور مجازی را کندمی‌کند؟مجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

CPU Steal (ستون st در top) زمانی است که سرور مجازی شما آمادهٔ اجرای کار بوده اما هایپروایزر پردازندهٔ فیزیکی را به ماشین مجازی دیگری داده است. Steal بالا یعنی سرور میزبان شلوغ است و برنامه‌های شما با وجود مصرف پایین CPU کند اجرا می‌شوند. آن را با top، vmstat یا mpstat اندازه بگیرید؛ اگر به‌طور پایدار بالاست، مستندات را برای ارائه‌دهنده بفرستید، به پلن با هستهٔ اختصاصی بروید یا سرور را روی میزبان دیگری بسازید.

یک سرور فیزیکی، چندین سرور مجازی

سرور مجازی شما روی یک سرور فیزیکی قدرتمند اجرا می‌شود که بین چند مشتری تقسیم شده است. نرم‌افزاری به نام هایپروایزر (مثل KVM) هسته‌های پردازندهٔ فیزیکی را بین ماشین‌های مجازی پخش می‌کند. هر سرور مجازی تعدادی vCPU (هستهٔ مجازی) دارد، اما این هسته‌های مجازی در لحظه روی هسته‌های فیزیکی اجرا می‌شوند و در بیشتر پلن‌های اقتصادی، تعداد کل vCPUهای فروخته‌شده از تعداد هسته‌های فیزیکی بیشتر است.

این مدل معقول است؛ چون بیشتر سرورها بیشتر وقت بیکارند و همه هم‌زمان به حداکثر پردازنده نیاز ندارند. اما وقتی چند همسایه هم‌زمان پردازندهٔ زیادی بخواهند، هایپروایزر باید نوبت بدهد. زمانی که سرور شما منتظر نوبت می‌ماند، Steal Time نام دارد: زمانی که از شما «دزدیده» شده است. دربارهٔ vCPU در مقالهٔ vCPU چیست؟ بیشتر بخوانید.

Steal از کجا می‌آید
درخواست پردازشدرخواست نوبتتخصیصبرنامهٔ شماآمادهٔ اجراvCPU سرور شمامنتظر نوبتهایپروایزرزمان‌بندی هسته‌هاهستهٔ فیزیکیمشغول ماشین دیگردرخواست پردازشدرخواست نوبتتخصیصبرنامهٔ شماآمادهٔ اجراvCPU سرور شمامنتظر نوبتهایپروایزرزمان‌بندی هسته‌هاهستهٔ فیزیکیمشغول ماشین دیگر
شکل ۱ زمانی که vCPU شما منتظر هستهٔ فیزیکی می‌ماند، در ستون st ثبت می‌شود.

نشانه‌های Steal بالا

  • برنامه‌ها کند اجرا می‌شوند، اما مصرف CPU در top پایین یا متوسط است.
  • Load Average بالاست، بدون این‌که پردازه‌ای بیشتر از معمول کار کند.
  • زمان پاسخ سایت در ساعت‌های خاصی از روز بالا می‌رود، بدون افزایش بازدید.
  • کارهای سنگین مثل فشرده‌سازی یا ساخت پروژه، در زمان‌های مختلف مدت متفاوتی طول می‌کشند.
  • بنچمارک‌های تکراری نتایج بسیار متغیر می‌دهند.

اندازه‌گیری Steal

با top

top

در سطر %Cpu(s)، مقدار st همان Steal است. مقدار id بیکاری، us مصرف برنامه‌ها و sy مصرف هستهٔ سیستم‌عامل است. با کلید 1 می‌توانید هر هسته را جداگانه ببینید.

با vmstat در طول زمان

یک لحظه کافی نیست؛ Steal نوسان دارد. vmstat هر چند ثانیه یک سطر چاپ می‌کند:

vmstat 5 12

آخرین ستون، st است. این دستور یک دقیقه نمونه‌برداری می‌کند.

با mpstat برای جزئیات بیشتر

sudo apt install -y sysstat
mpstat -P ALL 5 3

ستون %steal برای هر هسته نمایش داده می‌شود. بستهٔ sysstat ابزار sar را هم دارد که اگر فعال شود، آمار تاریخی را نگه می‌دارد و می‌توانید Steal ساعت‌های گذشته را هم ببینید.

برای مرور ابزارهای پایش پردازنده، بررسی مصرف CPU و رم در لینوکس را ببینید.

root@server: ~
$ vmstat 5 3procs ---memory--- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free  ...                       us sy id wa st 2  0      0  ...                              .. .. .. ..  .$ mpstat -P ALL 5 1CPU    %usr   %sys  %iowait  %steal  %idle$ 
شکل ۲ آخرین ستون vmstat و ستون %steal در mpstat، Steal را در طول زمان نشان می‌دهند.

چه مقداری نگران‌کننده است؟

عدد جهانی و قطعی وجود ندارد، اما یک قاعدهٔ عملی کمک می‌کند. مقدار نزدیک به صفر یا اندک و گاه‌به‌گاه کاملاً طبیعی است. وقتی Steal به‌طور پایدار و در بازه‌های طولانی چند واحد درصد بالاتر از صفر است، اثرش روی برنامه‌های حساس به تأخیر قابل لمس می‌شود. اگر Steal در ساعت‌های طولانی بخش قابل توجهی از زمان پردازنده را می‌گیرد، سرور شما به‌وضوح از ظرفیتی که خریده‌اید محروم است.

مهم‌تر از عدد، الگو است. Steal کوتاه و پراکنده اهمیت کمی دارد؛ Steal پایدار در ساعت‌های کاری که هم‌زمان با کندی برنامه است، مشکل واقعی است.

Steal بالا با High CPU فرق دارد

این دو مشکل را با هم اشتباه نگیرید:

  • High CPU: برنامه‌های خود شما پردازنده را مصرف می‌کنند (us و sy بالا). راه‌حل، پیدا کردن پردازهٔ پرمصرف و بهینه‌سازی یا ارتقاست. راهنمای کامل در مصرف بالای CPU در لینوکس.
  • High Steal: برنامه‌های شما پردازنده می‌خواهند اما نوبت نمی‌گیرند (st بالا). بهینه‌سازی کد شما کمک محدودی می‌کند؛ مشکل در سطح میزبان است.

البته گاهی هر دو هم‌زمان رخ می‌دهند: سرور شما زیر بار است و میزبان هم شلوغ است.

چه کار می‌توانید بکنید؟

۱. مستندسازی و تماس با ارائه‌دهنده

خروجی vmstat یا mpstat را در چند زمان مختلف ذخیره کنید و برای پشتیبانی بفرستید. ارائه‌دهندگان معتبر می‌توانند سرور را به میزبان کم‌بارتری منتقل کنند یا همسایهٔ پرمصرف را مدیریت کنند. اعداد مستند، پیگیری را بسیار مؤثرتر از «سرورم کند است» می‌کند.

۲. ساخت سرور جدید

در سرورهای ابری ساعتی، ساختن سرور جدید ممکن است آن را روی میزبان دیگری قرار دهد. سرور جدید را بسازید، Steal را چند ساعت اندازه بگیرید و اگر بهتر بود، سرویس را منتقل کنید. با بکاپ و انتقال با rsync این کار سریع است.

۳. پلن با هستهٔ اختصاصی

برخی ارائه‌دهندگان پلن‌هایی با vCPU اختصاصی (Dedicated CPU) دارند که هسته‌های فیزیکی فقط به شما داده می‌شود. برای پایگاه‌دادهٔ سنگین، سرور بازی یا برنامه‌های حساس به تأخیر، این پلن‌ها ارزش هزینهٔ بیشتر را دارند.

۴. کاهش وابستگی به پردازنده

اگر نمی‌توانید سرور را عوض کنید، با کش کردن نتایج، کم کردن کارهای پس‌زمینه در ساعت‌های شلوغ و زمان‌بندی کارهای سنگین برای ساعت‌های خلوت، اثر Steal را کمتر حس کنید.

High CPU یا High Steal
High CPU
  • us و sy بالا
  • پردازه‌های شما پرمصرف‌اند
  • راه‌حل: بهینه‌سازی یا ارتقا
  • با top پردازه را پیدا کنید
در برابر
High Steal
  • st بالا، us متوسط یا پایین
  • میزبان شلوغ است
  • راه‌حل: پشتیبانی، سرور جدید یا هستهٔ اختصاصی
  • با vmstat در طول زمان مستند کنید
شکل ۳ تشخیص درست بین این دو، از هزینهٔ بی‌مورد برای ارتقا جلوگیری می‌کند.

پیش از خرید چه بپرسید؟

  • آیا vCPUها اشتراکی‌اند یا اختصاصی؟
  • نسبت فروش vCPU به هستهٔ فیزیکی (Overcommit) چگونه مدیریت می‌شود؟
  • آیا امکان انتقال به میزبان دیگر در صورت Steal بالا وجود دارد؟
  • آیا می‌توانم چند ساعت سرور را آزمایش کنم؟

در سرورهای ساعتی کلودیفای می‌توانید پیش از تعهد، سرور را بسازید و با vmstat و بنچمارک‌های ساده کیفیت پردازنده را بسنجید. ابزارهای سنجش در ابزارهای بنچمارک سرور معرفی شده‌اند.

Steal در محیط‌های داکر و کانتینر

اگر برنامه‌ها را داخل کانتینرهای داکر اجرا می‌کنید، Steal همچنان در سطح سرور مجازی معنا دارد، نه کانتینر. یعنی همهٔ کانتینرهای روی سرور به یک اندازه تحت اثر آن قرار می‌گیرند. محدودیت‌های CPU که برای کانتینرها تعیین می‌کنید (مثل گزینهٔ --cpus) سهم هر کانتینر از vCPUهای سرور را مشخص می‌کند، اما نمی‌تواند جلوی کم شدن کل ظرفیت به‌خاطر Steal را بگیرد. پس در عیب‌یابی کندی کانتینرها، ابتدا Steal را در سطح سرور بررسی کنید و سپس سراغ تنظیمات کانتینرها بروید.

یک سناریوی واقعی

فرض کنید فروشگاه شما هر روز حوالی ساعت نه شب کند می‌شود. بازدید در این ساعت کمی بیشتر است، اما نه آن‌قدر که کندی را توضیح دهد. top را باز می‌کنید و می‌بینید مصرف us متوسط است، اما st در همین ساعت به‌طور محسوس بالا می‌رود و در ساعت‌های دیگر نزدیک صفر است. این الگو یعنی در همان ساعت، ماشین‌های دیگر روی میزبان هم پرمصرف‌اند و سرور شما نوبت کمتری می‌گیرد.

در این حالت، ارتقا به پلن بزرگ‌تر با همان نوع vCPU اشتراکی ممکن است فقط بخشی از مشکل را حل کند. راه مطمئن‌تر این است که خروجی sar -u چند روز را جمع کنید، الگوی ساعت نه شب را نشان دهید و از پشتیبانی بخواهید سرور را جابه‌جا کند؛ یا یک سرور جدید بسازید، چند شب Steal آن را بسنجید و در صورت بهتر بودن، فروشگاه را منتقل کنید. هم‌زمان، کش صفحات و کش اشیا را تقویت کنید تا هر درخواست به پردازش کمتری نیاز داشته باشد و اثر Steal کمتر حس شود.

اثر Steal روی بنچمارک‌ها

اگر قصد مقایسهٔ دو ارائه‌دهنده یا دو پلن را دارید، بنچمارک یک‌باره گمراه‌کننده است. یک سرور ممکن است در لحظهٔ آزمایش روی میزبانی خلوت باشد و نتیجهٔ عالی بدهد، و چند ساعت بعد با شلوغ شدن میزبان، به‌مراتب کندتر شود. بنچمارک را در چند زمان مختلف تکرار کنید و هم‌زمان Steal را ثبت کنید. نوسان زیاد نتایج، خودش نشانه‌ای از میزبان پرتراکم است.

سؤالات متداول

ستون st در top یعنی چه؟

st یا Steal درصد زمانی است که سرور مجازی آمادهٔ اجرا بوده اما هایپروایزر پردازندهٔ فیزیکی را به ماشین دیگری داده است. روی سرور فیزیکی این مقدار همیشه صفر است.

آیا Steal بالا تقصیر من است؟

معمولاً نه. Steal از رقابت ماشین‌های مجازی روی یک میزبان ناشی می‌شود. اما اگر سرور شما پلن کوچکی با vCPU اشتراکی دارد و همیشه از حداکثر پردازنده استفاده می‌کند، ممکن است ارائه‌دهنده سهم شما را محدود کند.

ارتقای پلن Steal را کم می‌کند؟

ارتقا به vCPU بیشتر روی همان نوع پلن اشتراکی همیشه مشکل را حل نمی‌کند. پلن با هستهٔ اختصاصی یا انتقال به میزبان کم‌بارتر راه‌حل مؤثرتری است.

چطور Steal ساعت‌های گذشته را ببینم؟

بستهٔ sysstat را نصب و جمع‌آوری آمار آن را فعال کنید؛ سپس با sar -u آمار پردازنده از جمله steal را برای ساعت‌های قبل مشاهده کنید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.