- Konu sahibi
- #1
İşletim sistemi Linux ise Python ile sunucunun toplam CPU kullanımını ek paket kurmadan
Linux, işlemciye ait toplu çalışma sayaçlarını
Ölçüm aralığını hesaplamak için duvar saatini değil, sistem saatindeki geriye dönüşlerden etkilenmeyen
Sunucuda bir dosya oluşturun:
Çalıştırma sırası şöyledir:
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,
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
Linux, Windows ve macOS üzerinde aynı Python kodunu kullanmak istiyorsanız
Ardından şu kodu çalıştırın:
Buradaki
İşletim sisteminin sunduğu CPU sayısını görmek için Python'un
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ı |
Linux, Windows ve macOS'ta aynı kod |
Belirli bir Python sürecinin CPU zamanı | Süreç bazlı ölçüm, örneğin
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.
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:
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.
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.
/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:
- Dosyayı örneğin
cpu_izle.pyadıyla kaydedin. - Linux sunucuda
python3 cpu_izle.pykomutunu çalıştırın. - İlk beş saniyede yalnızca başlangıç sayaçları alınır; ilk anlamlı yüzde sonraki okumada yazdırılır.
- İzlemeyi durdurmak için
Ctrl+Ckullanın.
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 hesaplanamazLinux, Windows ve macOS'ta aynı kod |
psutil.cpu_percent(interval=5) | İlk aralıksız ölçüm doğrudan yorumlanmamalıdırBelirli 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ğildirTablodaki 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.