it-swarm-tr.com

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

Bir işlemin bellek/işlemci kullanımını gerçek zamanlı olarak izlemek istiyorum. top 'a benzer ancak sadece bir işlemi hedefliyor, tercihen bir çeşit geçmiş grafiğine sahip.

194
Josh K

Linux'ta, top, aslında bir tarih grafiğine sahip olmamasına rağmen, aslında tek bir işleme odaklanmayı destekler:

top -p PID

Bu, Mac OS X'te farklı bir sözdizimiyle de kullanılabilir:

top -pid PID
157
Michael Mrozek

psrecord

Aşağıdaki adresler bir çeşit geçmiş grafiği . Python psrecord paket tam olarak bunu yapıyor.

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

Tek işlem için şu (durdu) Ctrl+C):

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

Birkaç işlem için aşağıdaki komut dosyası grafikleri eşitlemekte 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 şöyle görünür: psrecord example

memory_profiler

package yalnızca RSS örneklemesi sağlar (ayrıca bazı Python'a özgü seçenekler). Ayrıca, alt süreçleriyle de süreci kaydedebilir (bakınız mprof --help).

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

Varsayılan olarak bu Tkinter tabanlı (python-tk gerekebilir) dışa aktarılabilecek grafik Explorer:

mprof

grafit yığını ve istatistik

Basit bir kerelik test için aşırıya kaçabilir gibi görünebilir, ancak birkaç günlük hata ayıklama gibi bir şey için kesinlikle makul. Kullanışlı bir hepsi birarada raintank/graphite-stack (Grafana'nın yazarlarından) resim ve psutil ve statsd müşteri. procmon.py bir uygulama sağlar.

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

Ardından başka bir terminalde, hedef işleme başladı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: 808 adresinde açın, kimlik doğrulaması admin:admin, veri kaynağı ayarlama https: // localhost , şuna benzer bir grafik çizebilirsiniz:

grafana chart

grafit yığını ve telgraf

Metrikleri Statsd'ye gönderen Python komut dosyası yerine telegraf (ve procstat giriş eklentisi) metrikleri göndermek için kullanılabilir doğrudan grafit.

Minimum telegraf yapılandırması şuna benzer:

[agent]
  interval = "1s"

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

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

Sonra telegraf --config minconf.conf. Grafana bölümü, metrik adları hariç aynıdır.

pidstat

pidstat (sysstat paketinin bir parçası) kolayca ayrıştırılabilecek çıktılar üretebilir. İşlemlerden ek metriklere ihtiyacınız olduğunda, ör. en kullanışlı 3 grup (CPU, bellek ve disk) şunları içerir: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Ben ilgili bir cevap .

87
saaj

htoptop yerine harika bir alternatiftir. Renkleri var! Basit klavye kısayolları! Ok tuşlarını kullanarak listeyi kaydırın! Bir süreci terk etmeden ve PID'yi not etmeden öldür! Birden çok işlemi işaretleyin ve hepsini öldürün!

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

Gerçekten, htop'yi denemelisiniz. top 'i bir daha asla başlatmadım, ilk kez htop kullandım.

Tek bir işlem görüntüle:

htop -p PID

67
Denilson Sá Maia

Bu bilgileri bir komut dosyasında kullanmak için şunları 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 kullanın: calcPercCpu.sh 1234 burada 1234 pid'dir

Belirtilen $ nPid için, cpu kullanımının 10 anlık görüntüsünün ortalama değerini 1 saniyede ölçer (her biri 0,1 saniyelik gecikme * nTimes = 10); o anda olanların iyi ve hızlı bir doğru sonucunu verir.

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

8
Aquarius Power

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

  1. HP kaliper : süreçleri izlemek için çok iyi bir araç, çağrı grafiğini ve diğer düşük seviye bilgilerini de kontrol edebilirsiniz. Ancak lütfen sadece kişisel kullanım için ücretsiz olduğunu unutmayın.

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

5
Hemant

top ve awk kullanılarak kolayca bir örnek oluşturulabilir; % CPU'nun virgülle ayrılmış günlüğü ($9) +% MEM ($10) daha sonra herhangi bir istatistik ve grafik aracına beslenebilecek kullanım.

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() }'

Çıktı şöyle 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 $delay, ancak yazdırılan zaman damgası aslında $delay arkası top çıktısının nasıl çalıştığı nedeniyle. Çok fazla ayrıntıya girmeden, bunun için 1 basit yol top tarafından sağlanan zamanı günlüğe kaydetmektir:

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 çıktı $delay.

5
xebeche

İşlem adını biliyorsanız kullanabilirsiniz

top -p $(pidof <process_name>)
2
user4757345

Burada biraz geç kaldım ama sadece varsayılan ps kullanarak komut satırı numaramı paylaşacağım

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 tek astar olarak kullanıyorum. Burada ilk satır komutu çalıştırır ve PID'yi değişkende saklar. Daha sonra ps geçen süreyi, kullanılan CPU yüzdesini, PID yüzdesini ve RSS belleğini yazdıracaktır. Başka alanlar da ekleyebilirsiniz.

İşlem biter bitmez ps komutu "başarılı" döndürmez ve while döngüsü sona erer.

Profil oluşturmak istediğiniz PID zaten çalışıyorsa ilk satırı yoksayabilirsiniz. İstediğiniz kimliği değişkene yerleştirmeniz yeterlidir.

Bunun gibi bir çıktı alırsı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
  ....
2
theist

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

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

Top işlem başına (-p) seçeneği veya ilgili seçeneklerin bulunmadığı bir Linux dağıtımınız varsa, işlem başına CPU kullanım bilgilerini almak için işlem adınızın üst komutunun çıktısını ayrıştırabilirsiniz.

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
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

her 2 saniyede bir yazdırma işlemi 7994 işlemci kullanımı

0
赵宝磊

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

top -c a -pid PID

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

Scientific Linux için, etkileşimli olarak ayarlanabilen -S seçeneğidir.

0
Kieleth