Çok kullanıcılı bir sistemde, her kullanıcının CPU kullanımını cpu süresi cinsinden ölçmek istiyorum. Bu ölçümün amacı, eğer bir PID bir kullanıcıya aitse, bu kullanıcının CPU zamanına neden olduğunu varsayarım - yani ben deemon ve çekirdeği görmezden geliyorum.
Şu anda bunu her beş saniyede bir yapıyorum:
- Her kullanıcıyı ve kullandıkları PID’leri edinin
ps aux
- Her PID için
x
, utime, cutime, stime ve cstime toplamını alın./proc/[pid]/stat
- hesapla
t = x / interval
(yüksek yük olduğunda aralık her zaman tam olarak 5 saniye değildir)
Bunu çalıştırırsam, makul görünen değerler elde ederim. Örneğin: Bu sistemdeki bir kullanıcı python ( while True: pass
) biçiminde dönüyordu ve sistem saniyede yaklaşık 750 milisaniye CPU süresi gösteriyordu. Sistem biraz beklediğinde, 1 saniyelik bir ters çevirme için 1600ms bildirdi. Hangi sağ yaklaşık görünüyor, ama ben bu değerler, özellikle ben yok verilen deceiptful olabileceğini anlamamıza gerçekten onları anlamak.
İşte benim sorum bu:
CPU yükünü kullanıcı bazında ölçmenin adil ve doğru bir yolu nedir?
Bu yöntem oldukça doğru olmalı. Bu sistemde yüzlerce kullanıcı olabilir, bu yüzden yüzdeleri çıkarmak ps aux
, özellikle birçok yazılımın ortaya çıkmasını sevdiği kısa ömürlü iplikler için yeterince doğru olmayacaktır.
Bu karmaşık olsa da, bunun mümkün olduğunu kesinlikle biliyorum. Bu benim başlangıç noktamdı:
Çekirdek, bir işlem oluşturma süresini ve kullanım ömrü boyunca harcadığı CPU süresini takip eder. Her bir saat tıklaması, çekirdeği, geçerli işlemin sistemde ve kullanıcı modunda geçirdiği gecikmelerdeki süreyi günceller. - ( Linux Belgelendirme Projesinden )
Peşinde olduğum değer, bir kullanıcının sistem yükü veya işlemci kullanımı yüzdesi değil CPU'da harcadığı saniye (veya kısa süreli) miktarıdır.
İşlemler devam ederken CPU süresini ölçmemiz önemlidir. Bazı işlemler sadece yarım saniye sürecek, bazıları aylarca sürecek - ve her iki türü de yakalamamız gerekecek, böylece kullanıcıların CPU zamanlarını hassas bir şekilde hesaplayabilelim.
top
toplu iş modu yapabileceğini biliyor musun ? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
o anda {user} yükünü göstermelidir.