ساعت دو بامداد است، سایت کند شده، وارد SSH میشوید و uptime میزنید: load average: 14.62, 9.10, 4.33. سؤال واقعی این است که ۱۴ یعنی فاجعه یا یعنی هیچ. جواب کوتاه: به تعداد هستهٔ همان ماشین بستگی دارد، و به این که آن ۱۴ از CPU آمده یا از دیسک.
خروجی uptime سه عدد میدهد: میانگین بار در ۱، ۵ و ۱۵ دقیقهٔ گذشته. این اعداد از هستهٔ لینوکس میآیند و صف اجرا (run queue) را میشمارند؛ یعنی پروسههایی که یا در حال اجرا روی CPU هستند یا منتظر نوبت CPU، و پروسههایی که در حالت D (خواب غیرقابلقطع) منتظر I/O دیسک یا شبکه ماندهاند. همین جملهٔ آخر کل ماجراست: load average فقط CPU نیست.
load average را با تعداد هسته بسنجید، نه با عدد ثابت
قاعدهٔ سرانگشتی این است: لود را تقسیم بر تعداد هستهٔ منطقی کنید. زیر ۰.۷ به ازای هر هسته یعنی راحتید. حدود ۱ یعنی اشباع کامل ولی بدون صف. بالای ۱.۵ به ازای هر هسته یعنی صف شکل گرفته و کاربر منتظر میماند.
تعداد هسته را با nproc یا lscpu | grep '^CPU(s):' بگیرید. روی یک VPS چهارهستهای، لود ۴ یعنی تمام؛ روی یک سرور ۳۲ هستهای، لود ۴ یعنی بیکار. عدد لود بهتنهایی هیچ معنایی ندارد.
| لود روی ۴ هسته | نسبت | وضعیت |
|---|---|---|
| 0.8 | 0.2 | سالم |
| 3.6 | 0.9 | نزدیک اشباع، هنوز بدون صف |
| 6.0 | 1.5 | صف تشکیل شده، تأخیر محسوس |
| 20+ | 5+ | سرویس عملاً از دسترس خارج است |
یک نکتهٔ مهم که خیلیها از دست میدهند: روند. اگر لود ۱ دقیقه بالاتر از ۱۵ دقیقه است، مشکل همین حالا در حال رشد است. اگر برعکس است، از یک موج گذر کردهاید. به همین دلیل است که uptime سه عدد میدهد و نه یکی.
تفاوت لود CPU و لود I/O را چطور تشخیص دهیم
اینجا جایی است که اکثر تشخیصها اشتباه میرود. لود ۱۲ روی سروری که CPU آن ۱۵ درصد مصرف دارد، یعنی مشکل CPU نیست؛ یعنی دیسک.
با top وارد شوید و کلید 1 را بزنید تا هر هسته جدا نمایش داده شود، بعد به ستون %wa (iowait) نگاه کنید. اگر این عدد بالای ۲۰ ماند، گلوگاه دیسک است. با iostat -x 2 (از بستهٔ sysstat) ستون %util را ببینید؛ نزدیک ۱۰۰ یعنی دیسک اشباع است.
iostat -x 2 5
# به %util و await نگاه کنید
# await بالای 50ms روی SSD یعنی مشکل جدی
برای دیدن اینکه کدام پروسه در حالت D گیر کرده، از ps استفاده کنید:
ps -eo state,pid,comm | awk '$1=="D"'
اگر خروجی پر بود از mysqld یا php-fpm، به احتمال زیاد کوئری سنگین یا کمبود RAM دارید که باعث swap شده. با vmstat 1 ستون si و so را ببینید؛ هر عدد غیرصفر آنجا یعنی سیستم در حال swap کردن است و این بدترین نوع لود است، چون دیسک را هم اشباع میکند.
اینجا اشتباه میکنند: لود بالا را با اضافه کردن CPU حل میکنند. اگر ریشه I/O باشد، هستهٔ بیشتر فقط صف را طولانیتر میکند و وضعیت بدتر میشود. علامتش هم این است: بعد از ارتقای پلن، لود برای دو روز خوب است و بعد دقیقاً به همان عدد قبلی برمیگردد.
چه زمانی load average واقعاً نگرانکننده است
سه شرط را با هم ببینید، نه جدا:
- لود ۱ دقیقه بالای ۱.۵ برابر تعداد هسته باشد و صعودی باشد.
- زمان پاسخ سایت (TTFB) همزمان بالا رفته باشد. لود بالا بدون کندی کاربر، معمولاً یعنی یک کار batch در حال اجراست و مشکلی نیست.
- لود ۱۵ دقیقه هم بالا مانده باشد. یک spike کوتاه در بکاپ شبانه طبیعی است.
اگر هر سه برقرار است، مشکل واقعی است. اگر فقط اولی برقرار است، احتمالاً دارید به یک عدد بیاهمیت واکنش نشان میدهید.
یک تلهٔ رایج در وردپرس: wp-cron.php که با هر بازدید کاربر اجرا میشود. وقتی ترافیک بالا میرود، دهها نمونهٔ همزمان از آن اجرا میشود و لود را میبرد بالا. راهحل، غیرفعال کردن cron داخلی و جایگزینی با کرون واقعی سیستمی است؛ جزئیاتش در wp-cron وردپرس؛ چرا اجرا نمیشود و چطور با کرون واقعی جایگزینش کنیم آمده. اگر روی هاست اشتراکی هستید و به کرون سیستمی دسترسی ندارید، هاست لینوکس با دسترسی کامل این کار را ممکن میکند.
ابزارهایی که واقعاً به کار میآیند
htop برای نگاه سریع، atop برای بررسی گذشتهنگر (چون تاریخچهٔ لود و دیسک را نگه میدارد)، و sar -q برای دیدن روند لود در ۲۴ ساعت گذشته. اگر سرور را همین حالا راه انداختهاید و میخواهید baseline بگیرید، sar را از روز اول فعال کنید؛ بعداً بدون دادهٔ تاریخی نمیتوانید بگویید لود ۸ برای این سرور طبیعی است یا نه.
برای بررسی سریع از بیرون، ابزارهای رایگان سرورنت تست سرعت و بررسی پاسخ سرور را در اختیار میگذارند. اگر خطای HTTP میبینید و نمیدانید از کجاست، کد وضعیت HTTP: راهنمای عملی خطاهای رایج نقطهٔ شروع خوبی است.
و اگر مشکل از یک افزونهٔ وردپرسی است که هر بار کل دیتابیس را میخواند، قبل از هر کار دیگری ممیزی افزونه وردپرس را انجام دهید. در تجربهٔ من، بیش از نیمی از لودهای بالای ۱۰ روی سرورهای وردپرسی از دو یا سه افزونهٔ بد نوشته میآید، نه از کمبود منابع.
پرسشهای پرتکرار
load average چند خوب است؟
عدد مطلق وجود ندارد. لود را بر تعداد هسته تقسیم کنید؛ زیر ۰.۷ به ازای هر هسته خوب است و بالای ۱.۵ به ازای هر هسته یعنی صف و تأخیر. روی سرور ۸ هستهای، لود ۵ نگرانکننده نیست ولی لود ۱۴ هست.
چرا load average بالا است ولی CPU مصرف کمی دارد؟
چون پروسهها در حالت خواب غیرقابلقطع (D) منتظر I/O دیسک یا شبکه هستند و لینوکس آنها را هم در لود میشمارد. ستون %wa در top و %util در iostat -x را ببینید؛ اگر بالا بود، گلوگاه دیسک است نه پردازنده.
اضافه کردن CPU لود را پایین میآورد؟
فقط اگر گلوگاه واقعاً CPU باشد. اگر ریشه I/O، کمبود RAM یا swap باشد، هستهٔ بیشتر مشکل را پنهان میکند و بعد از مدت کوتاهی لود به همان عدد برمیگردد. اول با vmstat و iostat ریشه را پیدا کنید.
تفاوت load average و مصرف CPU چیست؟
مصرف CPU میگوید پردازنده چند درصد وقتش را کار میکند؛ لود میگوید چند کار در صف هستند. یک CPU میتواند ۱۰۰ درصد مشغول باشد و لود ۱ داشته باشد، یا ۱۰ درصد مشغول باشد و لود ۲۰ داشته باشد چون بقیه منتظر دیسکاند.
قدم بعدی: همین حالا nproc و uptime را کنار هم بگذارید و نسبت را حساب کنید. اگر بالای ۱.۵ بود، قبل از هر اقدامی top را باز کنید و کلید 1 را بزنید تا ببینید آن لود از CPU میآید یا از %wa. همین یک نگاه، نصف تشخیص را تمام میکند.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!