Top ve ps aynı cpu sonucunu göstermiyor


54

Bu, bu soru ile bağlantılı.

Çalıştırdığımda topaşağıdaki sonucu alıyorum:

görüntü tanımını buraya girin

pid 3038% 18 CPU kullanıyor ancak çalışıyorken

görüntü tanımını buraya girin

sonuç% 5.5'tir. Ve bu rakam zamanla değişmiyor gibi görünüyor (yani aynı komutu bir süre sonra çalıştırırken) ...

Bu pskomut bir şekilde cpu kullanımının ortalamasını alıyor mu?

Yanıtlar:


87

man psiçinde NOTESbölüm.

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

Ve bildiğini tahmin et, ama şunu da yapabilirsin:

top -p <PID>

Düzenleme : diğer cevaplar hakkındaki yorumunuz için;

" Hmm evet ps bunu nasıl alacağınızı merak ediyorum (anlık işlemci yüzdesi) "

Kısa cevap: yapamazsın.

Neden bu kadar?

Birinden bir resimdeki arabanın hızını hesaplamasını istemek gibi bir şey.

topBir izleme aracı iken , psanlık bir araçtır. Şöyle düşünün: Herhangi bir anda bir işlem CPU'yu kullanır ya da kullanmaz. Böylece, tam o anda% 0 veya% 100 yükünüz olur.

Verilmesi: Anında CPU kullanımıps vermesi gerekiyorsa,% 0 veya% 100 olacaktır.

top Öte yandan yoklama numaralarını saklayın ve zaman içindeki yükü hesaplayın.

psmevcut kullanım vermiş olabilirdi - ancak bu verileri birden çok kez okumasını ve her okuma arasında uyumasını gerektirir. Öyle değil.

Ps% cpu için hesaplama

ps CPU kullanımını aşağıdaki şekilde hesaplar:

uptime = toplam süre sistemi çalışıyor.
ps_time = Başlamadan saniye cinsinden ölçülen işlem başlangıç ​​zamanı.
pu_time = İşlemciyi kullanan toplam zaman işlemi.

;; Saniye işlemi devam ediyor:
saniye = çalışma süresi - ps_time
;; Kullanımı:
cpu_dosyası = pu_time * 1000 / saniye

print: cpu_dosyası / 10 "." cpu_Ürün% 10


Örnek: çalışma süresi = 344,545 ps_time = 322,462 pu_time = 3,383 saniye = 344,545 - 322,462 = 22,083 cpu_dosyası = 3,383 * 1,000 / 22,083 = 153 baskı: 153/10 "." % 153 10 => 15,3

Bu nedenle yazdırılan sayı şudur: işlemin ömrü boyunca CPU'yu kullandığı süre. Yukarıdaki örnekte olduğu gibi. Bunu ömrünün% 15.3'ünde yaptı. Zamanının% 84,7'sinde işlemcide can sıkıcı değil.

Veri alımı

psbunun yanında top, /proc/- ya da işlem bilgisi sözde dosya sistemi altında depolanan dosyalardan gelen verileri kullanır .

/proc/Sistemin genel durumu hakkında çeşitli bilgiler içeren kök dosyalarınız var. Ek olarak, her işlem, /proc/<PID>/işleme özgü verilerin depolandığı kendi alt klasörüne sahiptir . Yani, örneğin sorunuzun işleminde bir klasör vardı /proc/3038/.

Ne zaman psCPU kullanımını hesaplar bu iki dosya kullanır:

/ proc / uptime Sistemin çalışma süresi (saniye) ve boşta işlemde harcanan süre (saniye).
/ proc / [PID] / stat İşlemle ilgili durum bilgisi.
  • Ondan uptimeilk değeri kullanır ( çalışma süresi ).
  • Ondan [PID]/stataşağıdakileri kullanır:
 # İsim Açıklama
Kullanıcı kodunda harcanan 14 utime CPU süresi, jiffies ile ölçülür
Çekirdek kodunda harcanan 15 stime CPU süresi
Çocuklardan gelen zaman da dahil olmak üzere kullanıcı kodunda harcanan 16 cutime CPU zamanı
Çocuklardan gelen zaman da dahil olmak üzere, çekirdek kodunda harcanan 17 cstime CPU zamanı 
22 starttime Sürecin başladığı zaman, juli olarak ölçülen zaman

Bir jiffie saat kenedir . Bu yüzden ek olarak, sysconf(_SC_CLK_TCK)sistemin Hertzini (saniyedeki tik sayısını) almak için çeşitli yöntemler kullanır - sonuçta 100'ü diğer seçenekleri yorucu bıraktıktan sonra geri dönüş olarak kullanmak.

Öyleyse utime1234 ve Hertz 100 ise:

seconds = utime / Hertz = 1234 / 100 = 12.34

Gerçek hesaplama şu şekilde yapılır:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

Örnek (Özel bir Bash komut dosyasından çıktı):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

Ps ile "akım" yükünün hesaplanması

Bu (biraz?) Gölgeli bir çaba ama Tamam. Hadi gidelim.

Biri tarafından sağlanan zamanları kullanabilir psve bundan CPU kullanımını hesaplayabilir. Bunu düşünürken bazı sınırlamalarla oldukça yararlı olabilir.

Bu, CPU kullanımını daha uzun bir süre boyunca hesaplamak için faydalı olabilir. Yani plugin-container, Firefox ile ilgili bir görev yaparken, Firefox'taki ortalama CPU yükünü izlemek istediğinizi varsayalım.

Çıktısını kullanarak:

$ ps -p -o cputime, etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

Kullandığım etimeüzerinde etimeshesaplamalara, sadece biraz daha net olmak gerekirse, bu örnekteki. Ayrıca "eğlence" için% cpu ekledim. Örneğin, bir bash betiğinde açıkça kullanılacaktır etimes- veya daha iyisi /proc/<PID>/vs.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

İşlem bu dönemde işlemlerin% 38'ini kullanıyordu.

Koduna bak

Nasıl psolduğunu bilmek ve biraz C bilmek istiyorsanız, yapın (Gnome Debain deriavnt'ı çalıştırdığınız gibi) - yorumlarla ilgili koddaki hoş tutum:

apt-get source procps
cd procps*/ps
vim HACKING

Geçerli CPU yüküyle ilgili daha fazla bilgiyle topve sürekli izlemeyle - veya gecikmeli aka " ps" ile güncelleyerek güncelleme yapabilirim .
Runium,

2
Gerçekten harika cevap!
Theodor

Tüm sistemde toplam CPU kullanımı hesaplanırken ne olur? Araçlar anlık görüntü yoluyla CPU kullanımını almaya mı çalışıyor, yoksa zaman içinde ortalamalarını alıyor mu?
CMCDragonkai

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

Hmm evet bunu nasıl elde edeceğinizi merak ediyorum (anlık CPU yüzdesi)ps
Theodor

2
En iyi örnekten elde edebilirsiniztop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil

1
Muhteşem. Ben buldum awk: piddaha iyi çalıştı için ing , içindetop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
Teşekkürler "top-p" güzel, bu seçeneği hiç fark etmedim! Bununla birlikte, PID'yi aramaktan hoşlanmıyorum, ya da şans eseri boş hafıza bölümünde aynı rakamlar görünüyorsa. Sistemimdeki bilgiler 8. satırda ve 9. sütundadır, bundan dolayı ben:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
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.