آموزشی لینوکس

مصرف CPU در VPS ناگهان 100٪ شده است؛ چگونه عامل اصلی را پیدا و رفع کنیم؟

مصرف CPU یکی از مهم‌ترین شاخص‌هایی است که هنگام بررسی عملکرد یک VPS باید به آن توجه کرد. گاهی اوقات ممکن است مصرف پردازنده سرور به‌صورت ناگهانی به 100 درصد برسد و در نتیجه سایت، پنل مدیریت، سرویس‌های مختلف یا حتی اتصال SSH با کندی مواجه شوند.

رسیدن CPU به 100 درصد لزوماً به معنای خراب شدن VPS نیست. یک برنامه می‌تواند به دلیل افزایش ترافیک، اجرای یک پردازش سنگین، مشکل نرم‌افزاری، Queryهای سنگین دیتابیس یا حتی یک فعالیت مخرب، تمام منابع پردازنده را مصرف کند.

در این مقاله بررسی می‌کنیم چگونه عامل اصلی مصرف 100 درصد CPU را پیدا کنیم و سپس بر اساس علت، مشکل را برطرف کنیم.

چرا CPU در VPS به 100 درصد می‌رسد؟

دلایل مختلفی می‌توانند باعث افزایش شدید مصرف CPU شوند. برخی از رایج‌ترین موارد عبارت‌اند از:

  • افزایش ناگهانی بازدید سایت
  • اجرای پردازش سنگین
  • مشکل در یک برنامه یا اسکریپت
  • مصرف زیاد PHP-FPM
  • Queryهای سنگین MySQL یا MariaDB
  • اجرای Cron Job سنگین
  • افزایش درخواست‌های ربات‌ها
  • حملات سایبری یا ترافیک غیرعادی
  • اجرای Docker Container پرمصرف
  • پردازش‌های Python، Node.js یا Java
  • وجود Malware یا برنامه ناشناس
  • اجرای هم‌زمان چند سرویس سنگین

بنابراین اولین کار این نیست که VPS را Restart کنیم؛ بلکه باید مشخص کنیم کدام پردازش باعث افزایش مصرف CPU شده است.

مرحله اول؛ بررسی مصرف CPU با دستور top

ابتدا از طریق SSH وارد VPS شوید و دستور زیر را اجرا کنید:

top

پس از اجرای این دستور، اطلاعات مربوط به CPU، RAM و Processهای در حال اجرا نمایش داده می‌شود.

در قسمت CPU می‌توانید میزان مصرف پردازنده را مشاهده کنید. برای مثال:

%Cpu(s): 98.5 us, 1.2 sy, 0.0 ni, 0.3 id

مقدار id نشان‌دهنده CPU بیکار است. اگر این مقدار بسیار پایین باشد، پردازنده تقریباً به‌طور کامل درگیر پردازش است.

در ادامه صفحه top، ستون %CPU را بررسی کنید. این ستون نشان می‌دهد هر Process چه میزان از CPU را مصرف می‌کند.

برای مثال:

PID    USER       %CPU    COMMAND
1245   www-data   185.2   php-fpm
3421   mysql       72.4   mysqld
5512   root        95.8   python3

در این مثال باید ابتدا Process مربوط به php-fpm را بررسی کرد، زیرا بیشترین مصرف CPU را دارد.

مرحله دوم؛ استفاده از htop

ابزار htop نسخه‌ای ساده‌تر و کاربردی‌تر برای مشاهده Processهای سیستم است.

اگر روی VPS نصب نیست، در Ubuntu و Debian می‌توانید آن را با دستور زیر نصب کنید:

sudo apt update
sudo apt install htop

سپس آن را اجرا کنید:

htop

در این محیط می‌توانید Processها را مشاهده کرده و آن‌ها را بر اساس میزان مصرف CPU مرتب کنید.

استفاده از htop مخصوصاً زمانی مفید است که تعداد زیادی Process روی VPS اجرا می‌شوند و پیدا کردن Process پرمصرف با top دشوار است.

مرحله سوم؛ پیدا کردن Process پرمصرف با ps

راه دیگر برای پیدا کردن Processهایی که بیشترین CPU را مصرف می‌کنند، استفاده از دستور زیر است:

ps aux --sort=-%cpu | head -20

این دستور 20 Process اول را که بیشترین مصرف CPU دارند نمایش می‌دهد.

اگر در خروجی برنامه‌ای مانند موارد زیر مشاهده کردید:

php-fpm
mysqld
nginx
apache2
python3
node
java

باید بررسی کنید این Process دقیقاً مربوط به کدام سرویس یا برنامه است.

اگر یک Process ناشناس CPU را مصرف می‌کند

اگر Processی مشاهده کردید که نام آن برایتان آشنا نیست، قبل از متوقف کردن آن ابتدا باید اطلاعات بیشتری درباره آن به دست آورید.

برای مشاهده جزئیات Process:

ps -fp PID

به جای PID شماره Process را قرار دهید.

برای مثال:

ps -fp 5512

همچنین می‌توانید مسیر فایل اجرایی Process را بررسی کنید:

readlink -f /proc/5512/exe

و دستور اجرای آن را ببینید:

cat /proc/5512/cmdline

این اطلاعات کمک می‌کنند مشخص شود Process مربوط به چه برنامه‌ای است و از چه مسیری اجرا شده است.

اگر یک Process ناشناس با کاربر root اجرا شده باشد یا فایل اجرایی آن در مسیر غیرمعمولی قرار داشته باشد، باید بررسی امنیتی بیشتری انجام شود.

اگر PHP-FPM باعث مصرف 100 درصد CPU شده است

در سرورهایی که سایت‌های PHP روی آن‌ها اجرا می‌شوند، PHP-FPM یکی از مواردی است که باید هنگام افزایش مصرف CPU بررسی شود.

ممکن است تعداد زیادی درخواست هم‌زمان باعث اجرای چندین Process مربوط به PHP شده باشد.

دلایل احتمالی عبارت‌اند از:

  • افزایش بازدید سایت
  • ربات‌های اینترنتی
  • اجرای کد PHP سنگین
  • افزونه یا اسکریپت مشکل‌دار
  • Queryهای سنگین دیتابیس
  • درخواست‌های زیاد به یک صفحه خاص
  • حمله به یک فرم یا API
  • اجرای Cron Jobهای PHP

در چنین شرایطی Restart کردن PHP-FPM ممکن است مصرف CPU را برای مدت کوتاهی کاهش دهد، اما اگر علت اصلی برطرف نشود، مشکل دوباره برمی‌گردد.

بررسی لاگ Nginx

اگر سایت شما با Nginx اجرا می‌شود، لاگ درخواست‌ها را بررسی کنید:

sudo tail -f /var/log/nginx/access.log

این دستور درخواست‌های جدید را نمایش می‌دهد.

اگر تعداد بسیار زیادی درخواست به یک صفحه خاص ارسال می‌شود، باید مشخص کنید این درخواست‌ها توسط کاربران واقعی، ربات‌ها یا یک سرویس دیگر ایجاد شده‌اند.

برای بررسی درخواست‌های ثبت‌شده می‌توانید از دستور زیر نیز استفاده کنید:

sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head

این دستور IPهایی را که بیشترین تعداد درخواست را ارسال کرده‌اند نمایش می‌دهد.

البته تعداد زیاد درخواست از یک IP به‌تنهایی به معنی حمله نیست و باید URL، زمان درخواست‌ها و نوع ترافیک نیز بررسی شود.

بررسی لاگ Apache

اگر به‌جای Nginx از Apache استفاده می‌کنید، لاگ درخواست‌ها معمولاً در مسیر زیر قرار دارد:

sudo tail -f /var/log/apache2/access.log

همچنین برای مشاهده خطاهای Apache می‌توانید از این دستور استفاده کنید:

sudo tail -f /var/log/apache2/error.log

بررسی این لاگ‌ها می‌تواند مشخص کند آیا یک صفحه خاص یا یک خطای مداوم باعث مصرف زیاد منابع شده است.

بررسی MySQL و MariaDB

گاهی CPU بالا به دلیل اجرای Queryهای سنگین دیتابیس ایجاد می‌شود.

برای مشاهده Processهای MySQL می‌توانید از دستور زیر استفاده کنید:

mysqladmin processlist

یا وارد MySQL شوید:

mysql -u root -p

سپس دستور زیر را اجرا کنید:

SHOW FULL PROCESSLIST;

اگر Query خاصی مدت زیادی در حال اجرا باشد، باید بررسی شود.

برای مثال Queryهایی که روی جدول‌های بزرگ اجرا می‌شوند و Index مناسبی ندارند، ممکن است CPU و منابع سیستم را به‌شدت مصرف کنند.

در چنین شرایطی باید Query، ساختار جدول و Indexهای دیتابیس بررسی شوند.

بررسی Cron Jobها

یکی دیگر از دلایل مصرف ناگهانی CPU می‌تواند Cron Job باشد.

برای مشاهده Cronهای کاربر فعلی:

crontab -l

Cronهای سیستم را نیز بررسی کنید:

cat /etc/crontab

همچنین:

ls -la /etc/cron.d/

و:

ls -la /etc/cron.daily/

اگر یک اسکریپت سنگین به‌صورت مداوم یا در فاصله‌های کوتاه اجرا شود، ممکن است باعث مصرف شدید CPU شود.

به‌خصوص اگر مصرف CPU در ساعت مشخصی از روز افزایش پیدا می‌کند، Cron Jobها باید با دقت بررسی شوند.

بررسی Docker

اگر روی VPS از Docker استفاده می‌کنید، می‌توانید مصرف منابع Containerها را با دستور زیر بررسی کنید:

docker stats

این دستور میزان مصرف CPU، RAM و سایر منابع Containerهای فعال را نشان می‌دهد.

اگر یک Container مصرف بسیار زیادی دارد، ابتدا باید لاگ آن را بررسی کنید:

docker logs CONTAINER_ID

همچنین برای مشاهده Containerهای فعال:

docker ps

استفاده کنید.

بررسی برنامه‌های Python، Node.js و Java

مصرف زیاد CPU ممکن است توسط برنامه‌هایی ایجاد شود که با Python، Node.js یا Java نوشته شده‌اند.

برای مشاهده سریع Processهای پرمصرف:

ps aux --sort=-%cpu | head -20

اگر در بالای فهرست Processهایی مانند موارد زیر مشاهده کردید:

python3
node
java

باید مشخص کنید این برنامه متعلق به کدام پروژه است و چرا چنین میزان CPU مصرف می‌کند.

گاهی یک حلقه بی‌نهایت یا پردازش سنگین می‌تواند باعث شود یک برنامه برای مدت طولانی CPU را درگیر نگه دارد.

بررسی احتمال Malware

اگر هیچ دلیل مشخصی برای مصرف بالای CPU پیدا نکردید، بررسی امنیتی VPS اهمیت زیادی پیدا می‌کند.

Processهای ناشناس را بررسی کنید:

ps aux

سپس مسیر Process مشکوک را مشاهده کنید:

readlink -f /proc/PID/exe

همچنین سرویس‌های در حال اجرا را بررسی کنید:

systemctl list-units --type=service --state=running

اگر برنامه‌ای را نمی‌شناسید، قبل از حذف یا متوقف کردن آن باید مشخص کنید که آیا واقعاً مخرب است یا بخشی از سیستم‌عامل و نرم‌افزارهای نصب‌شده روی VPS است.

در صورت مشاهده رفتار مشکوک، بررسی لاگ‌های SSH، کاربران سیستم، Cronها و سرویس‌های ناشناس نیز ضروری است.

آیا Restart کردن VPS مشکل را حل می‌کند؟

Restart کردن VPS می‌تواند در برخی شرایط مصرف CPU را به‌صورت موقت کاهش دهد، اما معمولاً علت اصلی را برطرف نمی‌کند.

برای مثال ممکن است پس از Restart وضعیت به این شکل باشد:

CPU = 100%
     ↓
Restart
     ↓
CPU = 10%
     ↓
چند ساعت بعد
     ↓
CPU = 100%

این وضعیت نشان می‌دهد احتمالاً یک برنامه، Cron Job، ترافیک ورودی یا سرویس خاص دوباره فعال شده است.

بنابراین Restart را نباید به‌عنوان راه‌حل اصلی در نظر گرفت.

آیا باید Process را Kill کنیم؟

اگر یک Process مشخص باعث مصرف شدید CPU شده باشد، در بعضی شرایط می‌توان آن را متوقف کرد.

ابتدا:

kill PID

اگر Process متوقف نشد، می‌توان از:

kill -9 PID

استفاده کرد.

با این حال، استفاده از kill -9 باید با احتیاط انجام شود. اگر Process مربوط به دیتابیس، وب‌سرور یا یک سرویس مهم باشد، توقف اجباری آن می‌تواند باعث مشکلات دیگری شود.

بنابراین بهتر است قبل از Kill کردن Process مشخص شود که متعلق به چه برنامه‌ای است.

چگونه از تکرار مشکل جلوگیری کنیم؟

پس از پیدا کردن عامل اصلی، باید از تکرار مشکل جلوگیری کرد.

اگر مشکل از سایت باشد، می‌توان موارد زیر را بررسی کرد:

  • بهینه‌سازی کد PHP
  • کاهش Queryهای غیرضروری
  • ایجاد Index مناسب در دیتابیس
  • استفاده از Cache
  • محدود کردن درخواست‌های غیرعادی
  • بهینه‌سازی Cron Jobها
  • بررسی افزونه‌های پرمصرف
  • کنترل Botها و Crawlerها
  • بهینه‌سازی تنظیمات PHP-FPM

اگر مشکل از یک برنامه خاص باشد، باید خود برنامه و نحوه اجرای آن بررسی شود.

اگر مشکل امنیتی باشد نیز باید منبع ورود، فایل‌های مشکوک، کاربران سیستم، SSH، Cron و سرویس‌های غیرضروری بررسی شوند.

بررسی سابقه مصرف CPU با sar

اگر می‌خواهید بدانید مصرف CPU در ساعات گذشته چگونه بوده است، ابزار sar می‌تواند مفید باشد.

ابتدا آن را نصب کنید:

sudo apt install sysstat

سپس:

sar -u

برای مشاهده مصرف CPU در لحظه نیز می‌توانید از:

sar -u 1 10

استفاده کنید.

این دستور هر یک ثانیه اطلاعات CPU را دریافت می‌کند و 10 بار نمایش می‌دهد.

استفاده از ابزارهای مانیتورینگ و ثبت تاریخچه مصرف منابع نیز کمک می‌کند بفهمید مشکل دقیقاً چه زمانی شروع شده و آیا الگوی خاصی دارد یا خیر.

یک روش سریع برای پیدا کردن عامل CPU 100 درصد

اگر CPU VPS ناگهان به 100 درصد رسید، این مراحل را به ترتیب انجام دهید:

1. مشاهده Processها

top

2. مرتب کردن Processها بر اساس CPU

ps aux --sort=-%cpu | head -20

3. شناسایی Process اصلی

نام Process و PID آن را یادداشت کنید.

4. بررسی سرویس مربوطه

برای مثال:

systemctl status nginx

یا:

systemctl status mysql

5. بررسی لاگ‌ها

اگر مشکل مربوط به وب‌سایت است، لاگ Nginx یا Apache را بررسی کنید.

6. بررسی دیتابیس

در صورت مشاهده مصرف بالای MySQL:

SHOW FULL PROCESSLIST;

7. بررسی Cron

crontab -l
cat /etc/crontab

8. بررسی Processهای ناشناس

readlink -f /proc/PID/exe

9. پس از شناسایی علت، مشکل را برطرف کنید

در این مرحله می‌توانید سرویس، کد، Query، Cron یا تنظیمات مربوطه را اصلاح کنید.

اشتباهات رایج هنگام مواجه شدن با CPU 100 درصد

یکی از اشتباهات رایج این است که کاربر بلافاصله VPS را Restart می‌کند و تصور می‌کند مشکل برطرف شده است.

Restart ممکن است فقط Process مشکل‌دار را موقتاً متوقف کند.

اشتباه دیگر، Kill کردن Process بدون شناسایی آن است. این کار می‌تواند باعث قطع سرویس‌های مهم شود.

همچنین افزایش منابع VPS همیشه راه‌حل مناسبی نیست. اگر مشکل از یک Query اشتباه، حمله، Bot یا برنامه معیوب باشد، افزایش CPU ممکن است فقط زمان بیشتری برای بروز دوباره مشکل ایجاد کند.

جمع‌بندی

مصرف 100 درصد CPU در VPS به خودی خود علت مشکل نیست، بلکه نشانه‌ای است که باید بررسی شود.

اولین قدم این است که با ابزارهایی مانند top، htop و ps مشخص کنیم کدام Process بیشترین CPU را مصرف می‌کند.

پس از شناسایی Process، باید منبع آن را بررسی کنیم. اگر Process مربوط به PHP-FPM باشد، کد سایت، ترافیک و Queryهای دیتابیس باید بررسی شوند. اگر MySQL مصرف بالایی داشته باشد، Queryهای در حال اجرا و Indexها اهمیت پیدا می‌کنند. در صورت مصرف زیاد توسط Nginx یا Apache نیز باید لاگ‌های وب‌سرور و درخواست‌های ورودی بررسی شوند.

Cron Jobها، Docker، برنامه‌های Python و Node.js و همچنین Processهای ناشناس نیز نباید نادیده گرفته شوند.

مهم‌ترین نکته این است که قبل از Restart کردن مکرر VPS یا افزایش منابع، علت اصلی مصرف CPU را پیدا کنید. با بررسی Processها، لاگ‌ها، دیتابیس، Cron و ترافیک شبکه می‌توان در بیشتر موارد عامل اصلی را شناسایی و برای جلوگیری از تکرار آن اقدام کرد.

🖥️

سرور لینوکس مناسب برای اجرای پایدار پروژه‌های شما

اگر با مصرف بالای CPU، اجرای پردازش‌های سنگین یا محدودیت منابع در سرور فعلی مواجه هستید، انتخاب یک VPS متناسب با نیاز پروژه می‌تواند به مدیریت بهتر منابع و اجرای پایدارتر سرویس‌ها کمک کند.

در ایرانیکا سرور می‌توانید پلن‌های سرور مجازی را بررسی کرده و بر اساس میزان CPU، RAM، فضای ذخیره‌سازی و نوع کاربرد، گزینه مناسب پروژه خود را انتخاب کنید.


🚀 مشاهده پلن‌های سرور لینوکس


⚡ انتخاب منابع متناسب با نیاز پروژه

🎯 چالش آموزشی
مباحثی که در این مقاله یاد گرفتید را در عمل پیاده‌سازی کنید و نتیجه را با ما به اشتراک بگذارید.
شروع چالش

💬 دیدگاه‌ها 0

هنوز دیدگاهی ثبت نشده است. اولین نفری باشید که نظر می‌دهید!

✍️ دیدگاه خود را بنویسید