Tek bir işlemin CPU / bellek kullanımı nasıl izlenir?


170

Bir işlemin bellek / cpu kullanımını gerçek zamanlı olarak izlemek istiyorum. Buna benzer, topancak yalnızca bir işlemde, tercihen bir tür geçmiş grafikle hedeflenmiştir.


Hangi hafıza istatistiklerini istiyorsun? Onlardan çok var.
vwduder,

Belirli bir zaman diliminde hafıza kullanımı, mevcut kullanım, maksimum kullanım, ortalama.
Josh K

Yanıtlar:


139

Linux'ta, topaslında bir geçmiş grafiği bulunmamasına rağmen , aslında tek bir sürece odaklanmayı destekler:

top -p PID

Bu, Mac OS X'te farklı bir sözdizimi ile de mevcuttur:

top -pid PID

9
Ve her seferinde PID'ye bakmak istemeyeceğiniz için, bunun gibi bir şey deneyin top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski

Bazı bireysel işlemleri izlemek için Cacti kullanıyorum, ancak tam gelişmiş bir Cacti kurulumu yapmak burada sorulan basit durum için çok karmaşık geliyor.
Stefan Lasiewski,

@Stefan: Bunu uzaktan çalıştırmak zorunda kalacağımı farz ediyorum?
Josh K

@Josh: Evet, başka bir sunucuda Cacti'yi (MySQL, Apache ve diğer birkaç paket gerektirir) çalıştırmanız gerekir. Çoğu dağıtımda, Yum veya apt-get kullanarak yüklemek oldukça kolaydır.
Stefan Lasiewski

@Stefan uzaktan kontrol etmek istiyorsanız ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk

61

htopiçin harika bir alternatiftir top. O ... Renkler! Basit klavye kısayolları! Ok tuşlarını kullanarak listeyi kaydırın! Ayrılmadan ve PID'yi not etmeden bir işlemi sonlandır! Birden fazla işlemi işaretleyin ve hepsini öldürün!

Tüm özellikler arasında, manpage bir işlemi takipF etmek için basabileceğinizi söylüyor .

Gerçekten denemelisin htop. topİlk kullanmamdan sonra bir daha hiç başlamadım htop.

Tek bir işlem göster:

htop -p PID


7
Htop için +1. Bu, yeni bir sisteme kurduğum ilk programlardan biri. Hayatımı çok kolaylaştırıyor. Ağaç görünümü de çok kullanışlıdır.
Barthelemy

9
topayrıca renkleri var. Basın z.
tshepang

2
Haklısın! toprenkleri var! Çok kötü, renkleri htop(özellikle diğer kullanıcıların işlemlerini ve programın ismini vurgulayan) soluyor.
Denilson Sá Maia

1
Ve htop -p PIDaynı zamanda, @Michael Mrozek'in verdiği örnek gibi çalışacak.
noisebleed

1
Öyleyse top kullanmak için tek neden, Htop'un mevcut olmaması ya da yüklenememesidir. Bu yüzden, daha fazla özellik sağlamak için htop oluşturuldu.
lepe,

59

psrecord

Aşağıdakiler bir çeşit geçmiş grafiğini ele almaktadır . Python psrecordpaketi tam olarak bunu yapar.

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

Tek işlem için, aşağıdakiler (durur Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

Birkaç işlem için, aşağıdaki komut dosyası çizelgeleri senkronize etmeye yardımcı olur:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

Grafikler şuna benzer: psrecord örneği

memory_profiler

Paket RSS okunur örnekleme (artı bazı Python özel seçenekler) sağlar. Ayrıca, çocuk süreçleriyle birlikte süreci de kaydedebilir (bkz mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

Varsayılan olarak bu python-tk, ihraç edilebilen bir Tkinter tabanlı ( gerekebilir) grafik gezginini açar :

mprof

grafit yığını ve istatistik

Basit bir kereye mahsus olmak üzere yapılan bir test için fazlaca gözükebilir, ancak birkaç günlük hata ayıklama gibi bir şey için, kesinlikle makul. Kullanışlı bir hepsi bir arada raintank/graphite-stack(Grafana'nın yazarlarından) görüntü psutilve statsdmüşteri. procmon.pybir uygulama sağlar.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

Sonra başka bir terminalde, hedef işlemi başlattıktan sonra:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

Sonra Grafana'yı http: // localhost: 8080 adresinde açmak , as kimlik doğrulaması yapmak admin:admin, veri kaynağını ayarlamak https: // localhost , şunun gibi bir grafik çizebilirsiniz :

grafana grafiği

grafit yığını ve telgraf

Python betiği, metrikleri Statsd'e göndermek yerine metrikleri doğrudan Grafit'e göndermek için telegraf(ve procstatgiriş eklentisi) kullanılabilir.

Minimal telegrafyapılandırma şöyle gözüküyor:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Ardından satır koş telegraf --config minconf.conf. Grafana kısmı, metrik adları hariç aynıdır.

sysdig

sysdig(Debian ve Ubuntu reposlarında mevcut) sysdig-inspected UI ile CPU kullanımı ve RSS ile birlikte son derece ince ayrıntılı bilgiler sağlayarak çok umut verici görünüyor, ancak ne yazık ki UI bunları sağlayamıyor ve olaydaki işlemleri sysdig filtreleyemiyor procinfo . yazma zamanı. Yine de, bu, özel bir keskiyle ( sysdigLua'da yazılmış bir uzantı) mümkün olmalıdır .


pgrep systemd birden fazla çıktı satırı veriyor ve bu nedenle psrecord'u çalıştırıyor, ne yapılmalı? Sadece herhangi bir işlemle test etmek istiyorum.
EralpB

1
@ pgrep --helpKurtarma için EralpB . En az var --newestve --oldest.
saaj

2
Bu aslında kabul edilmiş bir cevap olmalıdır, çünkü aslında bir bellek kullanım geçmişi grafiği verir. Not: psrecord yöntemi Ctrl+Ciçin, psrecord işleminde, bir arsa kaydetmeden sonlandırılır, test edilen işlemi sonlandırmanız gerekir.
user2561747

8

Bu bilgiyi bir komut dosyasında kullanmak için şunu yapabilirsiniz:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

gibi kullanmak: calcPercCpu.sh 1234nerede 1234 pid

Belirtilen $ nPid için, ölçecek ortalama 1 saniyelik bir bütün olarak işlemci kullanım 10 anlık (0.1s her gecikme * kaç_kere = 10); Bu, şu anda olanların iyi ve hızlı bir şekilde doğru sonucunu veriyor.

Değişkenleri ihtiyaçlarınıza göre ayarlayın.


Uhm, 1 cpu kullanımını izlemek için 10 işlemler?
xebeche,

@xebeche " 10 anlık görüntünün ortalamasını ölçecek " "nTimes = 10; # özelleştir " :)
Kova Gücü

Demek istediğim, 1 sayı ( $nPercCpu) almak için 10 işlemi çağırmanızdan hoşlanmıyorum : shell, top, grep, sed, cut ... bc. Bunların hepsi değilse, çoğu, örneğin 1 Sed veya Awk betiğiyle birleştirilebilir.
xebeche

@xebeche cool, var olana daha iyi bir komut ekleyerek düzenleme yapmaktan çekinmeyin (alternatif olarak), merakımı aldınız :)
Kova Gücü

1
Kendi cevabımı ekledim . Btw, çünkü ortalamasını hesaplayarak bir anlamı olduğu not top'nin çıkışı olan bir ortalama fazla $delay. Krş CPU kullanımı nasıl hesaplanır
xebeche

5

Normalde aşağıdaki ikisini kullanıyorum:

  1. HP kaliper : İşlemleri izlemek için çok iyi bir araçtır, ayrıca çağrı grafiğini ve diğer düşük seviye bilgilerini kontrol edebilirsiniz. Ancak, yalnızca kişisel kullanım için ücretsiz olduğunu lütfen unutmayın.

  2. daemontools : UNIX servislerini yönetmek için bir araç koleksiyonu


6
Yıllarca daemontools kullandım. Diğer işlemler için gözetmen / bekçi olarak harika. Tek bir işlem için CPU / bellek kullanımını izlemenize nasıl yardımcı olur?
Stefan Lasiewski

3

topVe awkbirini kullanarak kolayca oluşturabilir; örneğin daha sonra herhangi bir istatistik ve grafik aracına beslenebilecek virgülle ayrılmış% CPU ( $9) +% MEM ( $10) kullanımı günlüğü .

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

Çıkış gibi olacak

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Bu, büyük için iyi sonuçlar vermez $delay, çünkü yazdırılan zaman damgası çıktıların $delaynasıl topçalıştığından dolayı gerisinde kalmıştır . Çok fazla ayrıntıya girmeden, bunun için 1 basit yol, aşağıdakileri sağlayan süreyi kaydetmektir top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Ardından zaman damgası doğrudur, ancak çıkış yine de gecikecektir $delay.


2

İşlem adını biliyorsanız, kullanabilirsiniz

top -p $(pidof <process_name>)

8
Bu, yıllar önce kabul edilen cevabın ve ilk yorumunun söylediği şey.
dhag,

1

Top başına işlem (-p) seçeneği ya da ilgili seçeneklerin bulunmadığı kesik bir Linux dağıtımınız varsa, işlem başına CPU kullanım bilgilerini almak için işlem adınız için en üst komutun çıktısını çözümleyebilirsiniz.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8, gömülü Linux dağıtımımdaki üst komutun çıktısında işlem başına CPU kullanımını temsil ediyor


1

Yorum yapmak için yeterli itibar yok, ancak psrecord için doğrudan Python'da programlı bir şekilde de arayabilirsiniz:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)

0

Belirli bir işlemin belirli bir süresi için ortalamalara ihtiyacınız varsa, top toplayıcı -c seçeneğini deneyin:

top -c a -pid PID

Mac 10.8.5 için en üstte bulunan "-c a".

Scientific Linux için, seçenek etkileşimli olarak ayarlanabilen -S'dir.


Büyük olasılıkla hangi sürümlerinin topbu özelliği sağladığı hakkında daha fazla ayrıntı eklemek isteyeceksiniz . Fedora 19'daki sürümüm yok. Ubuntu 13.04'te de aynı.
slm

Haklısın !, Yararlı bir şey bulduğum için çok mutluydum, evde mac'umda olduğumu unuttum.
Kieleth

0

Buraya biraz geç kaldım ancak komut satırı numaramı yalnızca varsayılanı kullanarak paylaşacağım ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss" do; 
   sleep 1 
done

Bunu bir astar olarak kullanıyorum. Burada ilk satır komutu ateşler ve PID'yi değişkende saklar. Ardından ps, geçen süreyi, kullanılan yüzde CPU'yu, yüzde belleği ve RSS belleğini yazdırır. Diğer alanları da ekleyebilirsiniz.

İşlem biter bitmez, pskomut "başarı" ve "while döngü sona erer.

Profil yapmak istediğiniz PID zaten çalışıyorsa, ilk satırı yok sayabilirsiniz. Sadece istediğiniz kimliği değişkene yerleştirin.

Bunun gibi bir çıktı alacaksınız:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....
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.