Mario

WFN Üye
Konular
574
Mesajlar
574
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
İşletim sistemi Linux ise Python ile sunucunun toplam CPU kullanımını ek paket kurmadan /proc/stat dosyasındaki işlemci sayaçlarını iki ölçüm arasında karşılaştırarak izleyebilirsiniz. Windows veya macOS için ise işletim sistemine göre değişen sayaçları kendiniz okumak yerine psutil gibi platformlar arası bir kütüphane kullanmak daha pratiktir. Aşağıdaki Linux örneği beş saniyede bir ölçüm alır, yüzdeyi yazdırır ve yüksek kullanımın sürekli mi yoksa kısa süreli mi olduğunu görmenizi sağlar.

Linux sunucuda ek paketsiz CPU ölçümü​


Linux, işlemciye ait toplu çalışma sayaçlarını /proc/stat altında sunar. cpu ile başlayan satırdaki değerler doğrudan yüzde değildir; işletim sisteminin açılıştan beri topladığı CPU zamanlarını temsil eder. Bu nedenle tek bir okumayı yüzdeye çeviremezsiniz. Önceki ve sonraki okumalar arasındaki fark alınır, boşta geçen sürenin toplam süreye oranı hesaplanır.

Ölçüm aralığını hesaplamak için duvar saatini değil, sistem saatindeki geriye dönüşlerden etkilenmeyen time.monotonic() değerini kullanmak gerekir. Python belgelerinde bu saatin geriye gitmediği ve iki çağrı arasındaki farkın ölçüm amacıyla kullanılabileceği belirtilir.

Sunucuda bir dosya oluşturun:

Python:
#!/usr/bin/env python3
import time


def read_cpu_counters():
    with open("/proc/stat", "r", encoding="ascii") as file:
        for line in file:
            if line.startswith("cpu "):
                values = line.split()[1:]
                return [int(value) for value in values]
    raise RuntimeError("/proc/stat içinde toplam CPU satırı bulunamadı")


def cpu_usage(previous, current):
    deltas = [now - before for before, now in zip(previous, current)]
    total = sum(deltas)

    # İlk sayaçlar kullanıcı, sistem, nice ve benzeri CPU zamanlarıdır.
    # idle ve iowait boşta geçen süre olarak değerlendirilir.
    idle = deltas[3]
    if len(deltas) > 4:
        idle += deltas[4]

    if total <= 0:
        return 0.0

    return (1 - idle / total) * 100


previous = read_cpu_counters()

while True:
    time.sleep(5)
    current = read_cpu_counters()
    usage = cpu_usage(previous, current)
    print(f"CPU kullanımı: {usage:.2f}%", flush=True)
    previous = current

Çalıştırma sırası şöyledir:
  1. Dosyayı örneğin cpu_izle.py adıyla kaydedin.
  2. Linux sunucuda python3 cpu_izle.py komutunu çalıştırın.
  3. İlk beş saniyede yalnızca başlangıç sayaçları alınır; ilk anlamlı yüzde sonraki okumada yazdırılır.
  4. İzlemeyi durdurmak için Ctrl+C kullanın.
Örneğin ekranda CPU kullanımı: 18.43% görmeniz, son beş saniyelik aralıkta toplam işlemci kapasitesinin yaklaşık yüzde 18'inin kullanıldığını gösterir. Bu değer belirli bir Python sürecinin yüzde 18 CPU kullandığını kanıtlamaz; sunucudaki tüm süreçlerin toplamını ifade eder. Ayrıca tek bir anlık değere bakarak kalıcı bir sorun sonucu çıkarılmamalıdır. Birkaç ölçüm boyunca değerin yüksek kalması daha anlamlıdır.

Kodun ölçtüğü değer nasıl yorumlanır?​


Sunucuda dört mantıksal işlemci varsa yüzde 100, dört işlemcinin toplam kapasitesinin tamamen kullanıldığı anlamına gelir. Bu yaklaşım, top veya benzeri sistem araçlarının genellikle gösterdiği toplam kullanım yüzdesiyle aynı ölçeği hedefler. Tek çekirdekli bir sunucuda ise yüzde 100 tek işlemci kapasitesine karşılık gelir.

Uzun süre yüzde 80-100 aralığında kalmak, CPU'nun olası darboğaz olduğunu gösterir; ancak tek başına hangi uygulamanın sorumlu olduğunu göstermez. Bu durumda aynı zaman aralığında top, htop veya süreç bazlı bir ölçüm aracıyla hangi işlemin CPU tükettiğini kontrol edin. CPU düşükken uygulama yavaşsa sorun büyük olasılıkla doğrudan işlemci doygunluğu değildir; disk beklemesi, ağ gecikmesi, bellek yetersizliği veya veritabanı beklemesi ayrıca incelenmelidir.

iowait değerini boşta süreye katmak, disk veya başka G/Ç işlemlerini bekleyen CPU zamanını kullanım dışında bırakır. Bu, CPU'nun gerçekten hesaplama yaptığı zamanı izlemek için pratik bir yaklaşımdır; fakat sunucunun genel yükünü yorumlarken yüksek G/Ç beklemesini gözden kaçırmamalısınız. CPU yüzdesi düşük ve iowait yüksekse işlemci boşta görünürken disk sistemi uygulamayı yavaşlatıyor olabilir.

Daha kolay ve platformlar arası yöntem: psutil​


Linux, Windows ve macOS üzerinde aynı Python kodunu kullanmak istiyorsanız psutil tercih edilebilir. Bu yöntemde önce paketi, izlemeyi yapacak sanal ortam veya sistem Python kurulumu için yükleyin:

Kod:
python3 -m pip install psutil

Ardından şu kodu çalıştırın:

Python:
import time
import psutil

# İlk çağrı karşılaştırma için başlangıç değerini oluşturur.
psutil.cpu_percent(interval=None)

while True:
    usage = psutil.cpu_percent(interval=5)
    print(f"CPU kullanımı: {usage:.2f}%", flush=True)

Buradaki interval=5, ölçümün beş saniyelik aralık üzerinden yapılmasını sağlar. İlk çağrıdaki interval=None yalnızca başlangıç değerini kurar; aralık verilmeden yapılan ilk ölçümü doğrudan yorumlamayın. Bu yöntem sistem sayaçlarının ayrıntısını sizin yerinize ele alır, fakat yine toplam CPU kullanımını ölçer.

İşletim sisteminin sunduğu CPU sayısını görmek için Python'un os modülünü de kullanabilirsiniz:

Python:
import os

print("Mantıksal CPU sayısı:", os.cpu_count())

os.cpu_count() sonucu, yüzdeyi kaç işlemciye göre değerlendirmeniz gerektiğini anlamaya yardımcı olur. Bu değer kullanılabilir işlemci kapasitesinin her ortamda tam karşılığı olmayabilir; örneğin sanallaştırılmış veya konteynerleştirilmiş sistemlerde işlemci sınırı ayrıca uygulanmış olabilir. Python belgelerinde os modülündeki işlemci sayısı işlevlerinin platform ve çalışma ayarlarına bağlı olabileceği belirtilir.

Aşağıdaki ayrım, hangi yöntemin sizin ihtiyacınıza uygun olduğunu netleştirir:


İhtiyaç | Uygun yöntem | Dikkat edilmesi gereken

Yalnızca Linux sunucuda toplam CPU kullanımı | /proc/stat okuyarak standart kütüphane çözümü | Sayaç farkları alınmadan yüzde hesaplanamaz

Linux, Windows ve macOS'ta aynı kod | psutil.cpu_percent(interval=5) | İlk aralıksız ölçüm doğrudan yorumlanmamalıdır

Belirli bir Python sürecinin CPU zamanı | Süreç bazlı ölçüm, örneğin psutil.Process().cpu_percent() | Sunucunun toplam CPU yüküyle aynı değer değildir


Tablodaki son satır özellikle önemlidir: uygulamanızın kendi CPU tüketimini ölçmek istiyorsanız sistem toplamını değil, ilgili süreci ölçmelisiniz. Toplam CPU yüzde 90 iken sizin uygulamanız yüzde 5 kullanıyor olabilir; kalan yük başka bir süreçten kaynaklanabilir. Tersine, toplam kullanım düşük görünürken tek iş parçacıklı bir uygulama bir işlemci çekirdeğini tamamen doldurabilir.

Ölçümü sürekli izlemeye dönüştürme​


Terminal çıktısı kısa süreli kontrol için yeterlidir. Sunucuda düzenli kayıt tutmak istiyorsanız ölçüm sonucunu zaman damgasıyla birlikte bir dosyaya yazabilirsiniz:

Python:
from datetime import datetime, timezone
import time
import psutil

psutil.cpu_percent(interval=None)

with open("cpu-usage.log", "a", encoding="utf-8") as log:
    while True:
        usage = psutil.cpu_percent(interval=5)
        timestamp = datetime.now(timezone.utc).isoformat()
        line = f"{timestamp} cpu_percent={usage:.2f}\n"
        print(line, end="", flush=True)
        log.write(line)
        log.flush()

Bu örnekte her kayıt UTC zaman damgasıyla eklenir. Dosyayı sınırsız büyütmemek için gerçek sunucuda log döndürme uygulanmalıdır; aksi hâlde uzun süre çalışan izleme süreci disk alanını tüketebilir. Kayıtları daha sonra bir grafik veya alarm sistemine aktarmak istiyorsanız her satırdaki zaman damgasını ve CPU değerini ayrı alanlar olarak koruyun.

Değer belirlediğiniz eşiği aşınca yalnızca alarm üretmek yerine önce birkaç ardışık ölçüm arayın. Örneğin yüzde 95'e tek ölçümde çıkılması kısa süreli bir yedekleme veya derleme işlemi olabilir. Beş ya da daha fazla ardışık ölçümde yüksek değer görülüyorsa ilgili zaman aralığındaki süreç listesini, bellek kullanımını, disk beklemesini ve uygulama günlüklerini birlikte inceleyin. Böylece yalnızca belirtiyi değil, CPU'yu tüketen işlemi ayırabilirsiniz.

Sık karşılaşılan hatalar ve doğru sonraki adım​


/proc/stat bulunamıyorsa kod Linux dışı bir sistemde çalışıyor olabilir veya uygulama sınırlı bir çalışma ortamındadır. Bu durumda Linux'a özel kodu zorlamak yerine psutil yöntemine geçin. psutil kurulumu sırasında yetki hatası alırsanız sistem Python'una yazmak yerine bir sanal ortam oluşturup paketi o ortamın Python yorumlayıcısına kurun.

Değer sürekli sıfıra yakınsa ölçüm aralığının çok kısa olup olmadığını kontrol edin. Sayaç farkları küçük aralıkta düşük çözünürlüklü veya yuvarlanmış görünebilir; beş veya on saniyelik aralıkla yeniden ölçün. Değer sürekli yüksekse önce toplam kullanımın mı yoksa tek bir çekirdeğin mi dolduğunu ayırın, ardından süreç bazında CPU tüketimini inceleyin.

Kodun çalıştığı makine ile izlemek istediğiniz sunucunun aynı makine olduğundan da emin olun. Python betiğini kendi bilgisayarınızda çalıştırıp uzak sunucunun CPU'sunu ölçemezsiniz; betik, okuduğu işletim sistemi sayaçlarını çalıştığı makineden alır. Uzak sunucuyu izlemek için betiği sunucuda çalıştırmanız veya sunucudan ölçüm verisini güvenli bir yöntemle dışarı aktarmanız gerekir.

Sık sorulan sorular​

CPU kullanımını her saniye ölçmek doğru mudur?​

Çok kısa süreli ani yükleri görmek için kullanılabilir, ancak tek saniyelik değerler dalgalı olabilir. Genel sunucu takibi için beş veya on saniyelik aralıklar daha kararlı bir görünüm verir. Alarm kararını da tek ölçüm yerine ardışık yüksek ölçümlere bağlamak daha sağlıklıdır.

Python'un kendi CPU kullanımını nasıl ölçerim?​

Sunucunun toplamını ölçen psutil.cpu_percent() yerine ilgili sürecin CPU yüzdesini ölçmelisiniz. Bunun için izlenecek Python sürecinin işlem kimliğini belirleyip psutil.Process(pid).cpu_percent(interval=5) kullanabilirsiniz. Çıkan değer sistem toplamı değildir; yalnızca o sürecin CPU tüketimini gösterir.

CPU yüzde 100 görünüyorsa sunucu kesinlikle yavaş mıdır?​

Hayır. CPU'nun sürekli dolu olması işlemci darboğazına işaret edebilir, ancak uygulamanın gerçekten yavaşladığını tek başına kanıtlamaz. Yanıt sürelerini, süreç listesini, bellek durumunu ve disk beklemesini aynı zaman aralığında kontrol etmelisiniz.

time.process_time() sunucunun CPU kullanımını ölçer mi?​

Hayır. time.process_time() geçerli Python işleminin kullanıcı ve sistem CPU zamanını ölçer; sunucudaki tüm süreçlerin toplam CPU kullanımını vermez. Sunucu genelini izlemek için işletim sistemi sayaçlarını veya psutil gibi süreç ve sistem ölçümü sağlayan bir aracı kullanın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic