Toplam CPU zamanını izlemenin en kullanıcı yolu nedir?


25

Ç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:

  1. Her kullanıcıyı ve kullandıkları PID’leri edinin ps aux
  2. Her PID için x, utime, cutime, stime ve cstime toplamını alın./proc/[pid]/stat
  3. 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.


1
500 itibar: beginers o iyi bir şans
takyonların

Biraz
ligimin

1
toptoplu 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.
Rinzwind

Yanıtlar:


11

İşlem muhasebesine ihtiyacınız var gibi.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

Ubuntu'da işlem muhasebesi araçları acctpakettedir. Acct yükleyin

Kullanıcı başına rapor almak için,

sa -m

Ne yazık ki, bu benim için işe yaramaz çünkü "sa" uzun süren işlemleri saymaz. İhtiyacım olan (sanırım) başlatılan ve sonlandırılan süreçleri tespit etmenin ve cpu zamanlarını bıraktıklarında ve çalıştıkları zaman kaydetmenin bir yoludur.
Stefano Palazzo

@StefanoPalazzo Bunun alacağınız en iyi olduğuna inanıyorum. İşlemleri çalıştırmak için zamanla artırın /proc/[pid]/stat.
ændrük

Görünüşe göre, tüm süreçlerin çoğunun (.ps.gz) doğru bir şekilde hesaba sakatılacağı görülüyor . Ayrıca, uzun zamandır devam eden süreçleri “tahmin et” ve sonunda da onlar için doğru bir değer almadan önce iyi bir yolum var. Sonuçta onu kullanacağız ve cevabınıza ödül vermekten çok mutluyum. Çok teşekkürler!
Stefano Palazzo

3

Bu, her kullanıcı için kullanıcı adını ve toplam cpu zamanını gösteren bir satır verecektir:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done

2

En açık cevaplardan biri, şu anda ne yaptığınızı genişletmektir.

Kullanıcıların cpu zamanlarını takip etmek için bash komut dosyası ve mysql kullanmak için bu monitör işlemine rastladım, ancak konuştuğunuzdan çok daha büyük bir zaman dilimi boyunca yayıldı.

Umarım bu size yönelmek istediğiniz yön hakkında daha fazla fikir verebilir.

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm


0

Bu aynı zamanda günlerce süren süreçleri de idare edecektir.

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.