Merhaba arkadaşlar, bugün sizlere sunucularımızda en sık karşılaştığımız problemlerden biri olan yüksek CPU kullanımını nasıl tespit edip, sorunlu süreçleri nasıl iyileştirebileceğimizi adım adım anlatacağım. Özellikle aniden gelen yüklenme (load) artışlarında bu adımları takip etmek, sorunun kaynağını hızla bulmanızı sağlayacaktır.
İlk Tespit Araçları
Sorunu anlamak için önce durumu gözlemlemeliyiz. Benim en çok güvendiğim birkaç temel araç var. İlk olarak, sunucuya SSH ile bağlandıktan sonra `top` veya daha gelişmiş bir alternatif olan `htop` komutunu çalıştırın.
Bu komut, CPU'yu en çok hangi süreçlerin (process) tükettiğini gerçek zamanlı olarak gösterir. `%CPU` sütununa dikkat edin. Eğer `htop` kurulu değilse, kurup kullanmanızı şiddetle tavsiye ederim, renkli ve daha interaktif bir arayüz sunuyor.
Detaylı Analiz ve Log İnceleme
`top` ile şüpheli süreci gördükten sonra, onun neden bu kadar CPU yediğini anlamamız lazım. Burada `ps` komutu ve sistem logları devreye giriyor. Örneğin, PID'sini (Process ID) öğrendiğiniz bir sürecin detaylarını görmek için:
Ayrıca, o sürece ait sistem çağrılarını (system calls) ve hataları izlemek için `strace` çok kuvvetli bir araçtır. Ancak bu komut, süreci biraz yavaşlatabilir, canlı sistemlerde dikkatli kullanın.
Log tarafında ise, /var/log/syslog veya /var/log/messages dosyalarını, sorunun başladığı zamana denk gelen satırları için inceleyin. `journalctl` komutu da systemd tabanlı sistemlerde işinizi görecektir.
Yaygın Nedenler ve İyileştirme Adımları
Yüksek CPU kullanımının birkaç klasik nedeni ve çözüm önerileri şunlar:
1. Kötü Yazılmış Web Uygulaması/Kod: Bir PHP veya Python scripti sonsuz döngüye girmiş olabilir. Web sunucunuzun (Apache/Nginx) error loglarını kontrol edin. Uygulama seviyesinde bir profiler (Xdebug gibi) kullanarak bottleneck'leri bulun.
2. Veritabanı Sorguları: En sık karşılaştığım durum. Yavaş ve optimize edilmemiş SQL sorguları CPU'yu bitirir. MySQL/MariaDB için `slow_query_log`'u aktifleştirin ve /etc/mysql/my.cnf dosyasında ilgili ayarları yapın.
Log dosyasını analiz edip, sorguları indexleyerek veya yeniden yazarak optimize edin.
3. Arka Plan Servisleri (Cron Jobs): Kontrolsüz çalışan cron job'lar CPU'yu tıkayabilir. Tüm cron tanımlarınızı gözden geçirin.
4. Dış Saldırılar (Brute Force, DDoS): Sürekli yeni süreçler (`php-fpm` veya `ssh` çatalları) oluşturuluyorsa saldırı ihtimali var. `fail2ban` kurulu ve aktif olduğundan emin olun. `netstat` veya `ss` komutuyla şüpheli bağlantıları kontrol edin.
Kritik Müdahale: Süreç Durdurma ve Limit Koyma
Analiz sonrası sorunlu bulduğunuz ve durdurabileceğiniz bir süreç varsa, önce `kill -15` (SIGTERM) ile nazikçe sonlandırmayı deneyin. Yanıt vermezse, son çare olarak `kill -9` (SIGKILL) kullanın.
Uzun vadeli çözüm için, `systemd` ile çalışan servislerinize CPU ve bellek limitleri koyabilirsiniz. Örneğin, /etc/systemd/system/[servis_adi].service.d/limit.conf dosyası oluşturup içine:
yazarak, ilgili servisin CPU kullanımını %80 ile, belleği de 512 MB ile sınırlayabilirsiniz. Değişiklik sonrası `sudo systemctl daemon-reload` ve `sudo systemctl restart [servis_adi]` yapmayı unutmayın.
Son Söz ve Tavsiyeler
CPU yükü sorununu çözmek sistematik bir yaklaşım gerektirir: Önce izle (`top`), sonra analiz et (`logs`, `strace`), ardından nedeni bul (kod, db, cron) ve en sonunda iyileştir veya sınırla. Düzenli olarak `monit`, `netdata` veya `prometheus` gibi izleme araçları kurmanız, sorunları daha oluşmadan görmenizi sağlar.
Ben genelde bu akışı takip ediyorum. Peki siz yüksek CPU kullanımı sorunlarıyla karşılaştığınızda hangi yöntemleri izliyorsunuz? Özel bir script veya aracınız var mı? Takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.
Sorunu anlamak için önce durumu gözlemlemeliyiz. Benim en çok güvendiğim birkaç temel araç var. İlk olarak, sunucuya SSH ile bağlandıktan sonra `top` veya daha gelişmiş bir alternatif olan `htop` komutunu çalıştırın.
Bash:
top
Bu komut, CPU'yu en çok hangi süreçlerin (process) tükettiğini gerçek zamanlı olarak gösterir. `%CPU` sütununa dikkat edin. Eğer `htop` kurulu değilse, kurup kullanmanızı şiddetle tavsiye ederim, renkli ve daha interaktif bir arayüz sunuyor.
`top` ile şüpheli süreci gördükten sonra, onun neden bu kadar CPU yediğini anlamamız lazım. Burada `ps` komutu ve sistem logları devreye giriyor. Örneğin, PID'sini (Process ID) öğrendiğiniz bir sürecin detaylarını görmek için:
Bash:
ps aux | grep [PID_NUMARASI]
Ayrıca, o sürece ait sistem çağrılarını (system calls) ve hataları izlemek için `strace` çok kuvvetli bir araçtır. Ancak bu komut, süreci biraz yavaşlatabilir, canlı sistemlerde dikkatli kullanın.
Bash:
sudo strace -p [PID_NUMARASI] -c
Log tarafında ise, /var/log/syslog veya /var/log/messages dosyalarını, sorunun başladığı zamana denk gelen satırları için inceleyin. `journalctl` komutu da systemd tabanlı sistemlerde işinizi görecektir.
Yüksek CPU kullanımının birkaç klasik nedeni ve çözüm önerileri şunlar:
1. Kötü Yazılmış Web Uygulaması/Kod: Bir PHP veya Python scripti sonsuz döngüye girmiş olabilir. Web sunucunuzun (Apache/Nginx) error loglarını kontrol edin. Uygulama seviyesinde bir profiler (Xdebug gibi) kullanarak bottleneck'leri bulun.
2. Veritabanı Sorguları: En sık karşılaştığım durum. Yavaş ve optimize edilmemiş SQL sorguları CPU'yu bitirir. MySQL/MariaDB için `slow_query_log`'u aktifleştirin ve /etc/mysql/my.cnf dosyasında ilgili ayarları yapın.
Kod:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
3. Arka Plan Servisleri (Cron Jobs): Kontrolsüz çalışan cron job'lar CPU'yu tıkayabilir. Tüm cron tanımlarınızı gözden geçirin.
Bash:
crontab -l # Kullanıcı crontab'ını listeler
sudo cat /etc/crontab # Sistem crontab'ını görüntüler
Analiz sonrası sorunlu bulduğunuz ve durdurabileceğiniz bir süreç varsa, önce `kill -15` (SIGTERM) ile nazikçe sonlandırmayı deneyin. Yanıt vermezse, son çare olarak `kill -9` (SIGKILL) kullanın.
Bash:
sudo kill -15 [PID_NUMARASI]
# Birkaç saniye bekle, eğer durmazsa:
sudo kill -9 [PID_NUMARASI]
Uzun vadeli çözüm için, `systemd` ile çalışan servislerinize CPU ve bellek limitleri koyabilirsiniz. Örneğin, /etc/systemd/system/[servis_adi].service.d/limit.conf dosyası oluşturup içine:
INI:
[Service]
CPUQuota=80%
MemoryMax=512M
yazarak, ilgili servisin CPU kullanımını %80 ile, belleği de 512 MB ile sınırlayabilirsiniz. Değişiklik sonrası `sudo systemctl daemon-reload` ve `sudo systemctl restart [servis_adi]` yapmayı unutmayın.
CPU yükü sorununu çözmek sistematik bir yaklaşım gerektirir: Önce izle (`top`), sonra analiz et (`logs`, `strace`), ardından nedeni bul (kod, db, cron) ve en sonunda iyileştir veya sınırla. Düzenli olarak `monit`, `netdata` veya `prometheus` gibi izleme araçları kurmanız, sorunları daha oluşmadan görmenizi sağlar.
Ben genelde bu akışı takip ediyorum. Peki siz yüksek CPU kullanımı sorunlarıyla karşılaştığınızda hangi yöntemleri izliyorsunuz? Özel bir script veya aracınız var mı? Takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.