Bir uygulamanın bellek ve işlemci kullanımı nasıl kaydedilir?


16

Soruya benzer CPU yükü nasıl kaydedilir? , Bir işlemin belleğini günlüğe kaydetmek istiyorum.

Günlüğe kaydetmek istediğim işlem uzak bir sunucuda öldürüldü ve CPU yükünü ve bellek kullanımını öldürülmeden hemen önce öğrenmek istiyorum.

[Güncelleme]

Stefano Palazzo'nun düzgün küçük python senaryosu ve

Michał'ın topCPU ve Mem için olandan daha küçük bir hat çıkış değerleri . Neden olduğu hakkında bir fikrin var mı?

çıkış üst:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

Stefano Palazzo'nun python betiğini çıktılar:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Ben ne yazık ki burada henüz yorum yapamam ama niye anlatılırken bu ilgi yayın bulabilirsiniz psfarklı olabilir top: stackoverflow.com/questions/131303/...
PM

Yanıtlar:


16

Kabukta bir astar oluşturabilirsiniz:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

işlemi pid = 123 ile kaydetmek için:

logpid 123

veya günlüğü görmek ve dosyaya yazmak için:

logpid $$ | tee /tmp/pid.log

Diğer verilerin günlüğe kaydedilmesini istiyorsanız -o {this}seçenekleri değiştirin . man psKullanılabilecek parametreler için "STANDART FORMAT NUMUNELERİ" bölümüne bakın . Farklı zaman çözünürlüğü istiyorsanız, sleep {this}işlevde değişiklik yapın logpid().


Basit ve iş yapar!
rafaelbattesti

3

topİstatistiklerin tam olarak toppeşindeyseniz, takip ettiğiniz işlemin pidini belirterek toplu modda çalışabilirsiniz . Bu sayfadan örneği ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) yazdıysanız

top -b -d 10 -n 3 >> top-file

Toplu iş modunda (-b) en iyi çalışırsınız. Gecikme (-d) bayrağıyla belirtildiği gibi toplam 3 yineleme (-n) sayısı için her 10 saniyede bir yenilenir. Çıktı gönderilir bir dosyaya. " -pSiz de dahil olmak pidüzere sürecin belirtebilirsiniz . Bu elbette tamamen cpu ve koçtan daha fazla geri dönecek, ancak thos alanlarını içerecek. Benim durumumda örneğin pid 9189 kullanarak izlerken aşağıdakileri alırım top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

Bu sayfa, bir dosyaya yeniden yönlendirme yapmasa da, yalnızca yazdırılan CPU'yu elde etmenizi sağlayan daha karmaşık değişiklikler yapar. Birisi çıktıyı bir dosyaya yönlendirmek ve periyodik olarak güncellemesini sağlamak için iyi bir yol biliyorsa bilmek isterim. watchbunun için benim için ideal görünmüyor: superuser.com/questions/281347/filtering-top-command-output
PM

2

Bu basit python betiği istediğinizi yapmalıdır:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Öncelikle izlemek istediğiniz programın işlem kimliğini bulmanız gerekir, daha sonra komut dosyasını PID ile bağımsız değişken olarak çalıştırabilirsiniz:

python log.py 3912

İşlemci kullanımını ve ram kullanımını saniyede iki kez yazdıracaktır:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Daha sonra çıktısını daha sonra bir e-tabloya içe aktarmak için bir dosyaya yönlendirebilirsiniz ( python log.py 9391 > firefox_log.txt) ve Tabayırıcı olarak seçerek verileri bir e-tabloya alabilirsiniz .

Ctrl + C tuşlarına bastığınızda veya işlem öldürüldüğünde program kapanır.


Sevgili Stefano, senaryonuz için çok teşekkür ederim. Ne yazık ki yanlış sonuçlar veriyor gibi görünüyor. neden olduğu hakkında bir fikrin var mı? Lütfen güncellenmiş soruma bakın.
Framester

Ps man sayfasından man7.org/linux/man-pages/man1/ps.1.html ps, "kullanılan CPU süresinin, işlemin çalıştığı süreye bölünerek (işlem zamanı / gerçek zamanlı oran) yüzde olarak ifade edilir "- yani başladığından beri ortalama CPU kullanımı elde edersiniz
Nicolas Charles
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.