จะบันทึกหน่วยความจำและการใช้งาน cpu ของแอปพลิเคชันได้อย่างไร?


16

คล้ายกับคำถามวิธีบันทึกการโหลดของ CPU?ฉันต้องการบันทึกหน่วยความจำของกระบวนการ

กระบวนการที่ฉันต้องการบันทึกถูกฆ่าในเซิร์ฟเวอร์ระยะไกลและฉันต้องการค้นหาโหลด CPU และการใช้หน่วยความจำก่อนที่มันจะถูกฆ่า

[อัพเดต]

สคริปต์หลามเล็ก ๆ ของ Stefano Palazzo ทั้งสองและ

ค่าเอาต์พุตบรรทัดเดียวของMichałที่เล็กกว่าtopสำหรับ CPU และ Mem คุณมีความคิดว่าทำไม?

เอาท์พุทด้านบน:

 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 

สคริปต์ python ของ Stefano Palazzo เอาต์พุต:

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

ฉันโชคไม่ดีที่ยังไม่ได้แสดงความคิดเห็นที่นี่ แต่คุณอาจพบว่าข้อความนี้แสดงความสนใจว่าทำไมถึงpsแตกต่างจากtop: stackoverflow.com/questions/131303/…
PM

คำตอบ:


16

คุณสามารถสร้างหนึ่งซับในเชลล์:

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

เพื่อเข้าสู่กระบวนการด้วย pid = 123 เพียง:

logpid 123

หรือเพื่อดูและเขียนบันทึกลงในไฟล์:

logpid $$ | tee /tmp/pid.log

หากคุณต้องการบันทึกข้อมูลอื่นให้แก้ไข-o {this}ตัวเลือก ดูman psหัวข้อ "มาตรฐานรูปแบบตัวระบุ" สำหรับพารามิเตอร์ที่มีให้ใช้ หากคุณต้องการความละเอียดเวลาที่แตกต่างเปลี่ยนฟังก์ชั่นsleep {this}logpid()


เรียบง่ายและทำงานได้!
rafaelbattesti

3

หากคุณแม่นยำหลังtopสถิติคุณสามารถทำงานtopในโหมดแบทช์ระบุ pid ของกระบวนการที่คุณมีหลังจาก รับตัวอย่างจากหน้านี้ ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) หากคุณพิมพ์

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

คุณจะ "มีการทำงานสูงสุดในโหมดแบทช์ (-b) มันจะรีเฟรชทุก ๆ 10 วินาทีตามที่ระบุโดยการหน่วงเวลา (-d) สำหรับการนับทั้งหมด 3 ซ้ำ (-n) การส่งออกจะถูกส่งออก ไปยังไฟล์ " รวมถึง-pคุณสามารถระบุpidกระบวนการที่คุณเป็นหลังจากนั้น แน่นอนว่าสิ่งนี้จะส่งคืนมากกว่าซีพียูและ ram อย่างหมดจด แต่มันจะมีฟิลด์ thos ในกรณีของฉันเช่นฉันจะได้รับต่อไปนี้เมื่อตรวจสอบ pid 9189 ใช้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

หน้านี้ถึงแม้ว่ามันจะไม่ทำการเปลี่ยนเส้นทางไปยังไฟล์ แต่ก็มีการดัดแปลงที่ซับซ้อนมากขึ้นช่วยให้คุณได้รับ CPU ที่พิมพ์ออกมาเท่านั้น หากคุณมีคนรู้วิธีที่ดีในการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์และมีการปรับปรุงเป็นระยะฉันอยากจะรู้ watchดูเหมือนจะไม่เหมาะกับฉันสำหรับสิ่งนี้: superuser.com/questions/281347/filtering-top-command-output
PM

2

สคริปต์ python ง่าย ๆ นี้ควรทำสิ่งที่คุณต้องการ:

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)

คุณต้องค้นหารหัสกระบวนการของโปรแกรมที่คุณต้องการตรวจสอบจากนั้นคุณสามารถเรียกใช้สคริปต์ด้วย PID เป็นอาร์กิวเมนต์:

python log.py 3912

มันจะพิมพ์การใช้งานซีพียูและการใช้งาน RAM ในอัตราร้อยละสองครั้งต่อวินาที:

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

จากนั้นคุณสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์เพื่อนำเข้าสู่สเปรดชีตในภายหลัง (python log.py 9391 > firefox_log.txt ) และนำเข้าข้อมูลไปยังการเลือกสเปรดชีตTabเป็นตัวคั่นของคุณ

โปรแกรมออกจากเมื่อคุณกด Ctrl + C หรือเมื่อกระบวนการถูกฆ่า


เรียนสเตฟาโนขอบคุณมากสำหรับบทของคุณ น่าเสียดายที่ผลลัพธ์ออกมาผิดพลาด คุณมีความคิดใด ๆ ว่าทำไม? โปรดดูคำถามที่อัปเดตของฉัน
Framester

จากหน้า man ps man7.org/linux/man-pages/man1/ps.1.html ps จะแสดงผล "เวลา CPU ที่ใช้หารด้วยเวลาที่กระบวนการทำงาน (อัตราส่วน cputime / เรียลไทม์) ซึ่งแสดงเป็นเปอร์เซ็นต์ "- ดังนั้นคุณจะได้รับการใช้งาน CPU โดยเฉลี่ยตั้งแต่เริ่มต้น
Nicolas Charles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.