วิธีการวัดบน Linux หน่วยความจำสูงสุดของแอปพลิเคชันหลังจากสิ้นสุด


11

ฉันจะวัดหน่วยความจำสูงสุดของแอปพลิเคชันที่ทำงานบน Linux ได้อย่างไร

ฉันรันแอพนี้ในแบทช์ดังนั้นฉันจึงไม่สามารถใช้ RSS ได้เพราะมันรายงานหน่วยความจำปัจจุบัน ฉันต้องการหน่วยความจำสูงสุดที่แอปพลิเคชั่นเคยรายงานไว้ในตอนท้าย

VmPeak ไม่ใช่วิธีการแก้ปัญหาอย่างใดอย่างหนึ่งเนื่องจากมันรายงานหน่วยความจำที่จัดสรรและยังไม่ได้คำนวณจาก Ram จริง แต่ยังมาจากฮาร์ดดิสก์


คุณใช้ระบบปฏิบัติการอะไรบนแอปพลิเคชัน
CVn

ฉันทำงานบน Linux
des_user

หัวข้อนี้ควรจะช่วยคุณ: serverfault.com/questions/387268/ …
Jacob Coleman

คำตอบ:


13

ต่อไปนี้เป็น 2 วิธีในการติดตามการใช้หน่วยความจำสูงสุดของกระบวนการ

เป็นน้ำเชื่อม

ฉันไม่ได้ใช้เครื่องมือนี้ แต่ดูเหมือนว่าคุณกำลังมองหา มันเรียกว่าเป็นน้ำเชื่อม

ลักษณะ

Syrupy เป็นสคริปต์ Python ที่นำสแน็ปช็อตของหน่วยความจำและโหลด CPU ของกระบวนการที่กำลังทำงานอยู่อย่างน้อยหนึ่งกระบวนการเป็นประจำเพื่อสร้างโปรไฟล์ของการใช้ทรัพยากรระบบของพวกเขาแบบไดนามิก

ตัวอย่าง

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

ใช่แดกดันคำสั่งเวลา GNU สามารถให้คุณใช้หน่วยความจำสูงสุดของกระบวนการ Maximum resident set size (kbytes)จะรายงานหน่วยความจำสูงสุดเช่นดังนั้น:

ตัวอย่าง

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

อ้างอิง


3

แม้ว่าหัวข้อจะค่อนข้างเก่า แต่ฉันต้องการแบ่งปันโครงการอื่นที่เกิดจากคุณลักษณะเคอร์เนลของกลุ่ม cgroups

https://github.com/gsauthof/cgmemtime :

cgmemtime วัดการใช้หน่วยความจำสูง RSS + CACHE ของกระบวนการและกระบวนการที่สืบทอด

เพื่อให้สามารถทำเช่นนั้นมันทำให้กระบวนการใน cgroup ของตัวเอง

ตัวอย่างเช่นกระบวนการ A จัดสรร 10 MiB และส้อมเด็ก B ที่จัดสรร 20 MiB และส้อมเด็ก C ที่จัดสรร 30 MiB กระบวนการทั้งสามนี้แบ่งปันหน้าต่างเวลาที่การจัดสรรผลการใช้งานหน่วยความจำ RSS (ขนาดชุดที่อยู่อาศัย) ที่สอดคล้องกัน

คำถามในตอนนี้คือ: มีการใช้งานหน่วยความจำเท่าไหร่ซึ่งเป็นผลมาจากการรัน A

คำตอบ: 60 MiB

cgmemtime เป็นเครื่องมือในการตอบคำถามดังกล่าว

ตัวอย่างการใช้จะเป็น:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB

ดังนั้นเครื่องมือนี้สามารถใช้เพื่อรายงานการใช้ RAM สูงสุดของโปรแกรมหลังจากออกจากโปรแกรมได้อย่างไร
terdon

@terdon มันใช้wait4เพื่อจับกระบวนการออกในการรวมกันกับ cgroups ( memory.max_usage_in_bytes) ซึ่งดูเหมือนจะทำให้รู้สึก รายละเอียดเพิ่มเติมมีอยู่ใน README บน gitHub
Vlad Frolov

ขอบคุณ แต่ประเด็นของฉันคือเพิ่มเติมเกี่ยวกับคำตอบของคุณ เนื่องจากมันไม่ได้ตอบคำถามเพียงชี้ไปที่ทรัพยากรภายนอกบางอย่างที่อาจทำได้ นอกจากนี้คุณได้โพสต์คำตอบเดียวกันทุกที่ซึ่งทำให้เกิดการตั้งค่าสถานะอัตโนมัติ โปรดแก้ไขคำตอบของคุณและรวมถึงตัวอย่างที่แสดงว่าโปรแกรมนี้สามารถทำสิ่งที่ OP ขอมาได้อย่างไร
terdon

2
@terdon ใช่ฉันทำแล้ว! เพราะฉันได้ค้นหาคำถามเดียวกันและคำถามนั้นเหมือนกันมากและคำตอบก็เหมือนกันทั้งหมด: 'แยกวิเคราะห์เอาต์พุต ps' ซึ่งบ้าไปแล้ว! ฉันใช้เวลาหนึ่งสัปดาห์ก่อนที่จะชนโครงการ cgmemtime โดยไม่ตั้งใจซึ่งเป็นคู่ที่สมบูรณ์แบบสำหรับคำถามเหล่านั้นทั้งหมดที่ฉันได้แสดงความคิดเห็น!
Vlad Frolov

1
ยุติธรรมพอสมควร มันจะดีมากถ้าคุณสามารถยกตัวอย่างวิธีใช้มันได้ มันจะปรับปรุงคำตอบของคุณ ไม่ว่าในกรณีใดขอบคุณที่สละเวลาโพสต์ข้อความนี้ฉันมั่นใจว่าคนอื่นจะเห็นว่ามีประโยชน์
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.