การวัดการใช้ RAM ของโปรแกรม


46

time เป็นคำสั่งที่ยอดเยี่ยมถ้าคุณต้องการที่จะคำนวณเวลาของ CPU ที่คำสั่งที่ได้รับ

ฉันกำลังมองหาสิ่งที่คล้ายกันซึ่งสามารถวัดการใช้ RAM สูงสุดของโปรแกรมและเด็ก ๆ ควรแยกความแตกต่างระหว่างหน่วยความจำที่จัดสรรที่ใช้และไม่ได้ใช้ บางทีมันอาจให้การใช้หน่วยความจำมัธยฐาน (ดังนั้นการใช้หน่วยความจำที่คุณควรคาดหวังเมื่อทำงานเป็นเวลานาน)

ดังนั้นฉันต้องการทำ:

rammeassure my_program my_args

และรับเอาต์พุตคล้ายกับ:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

ฉันดูmemusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82แต่ฉันคิดว่ามันค่อนข้างแฮ็ค

คำตอบ:


24

คุณสามารถใช้tstimeเพื่อวัดการใช้หน่วยความจำ highwater (RSS และเสมือน) ของกระบวนการ

ตัวอย่างเช่น:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

นอกจากนี้ยังรองรับโหมดการแยกวิเคราะห์ออกได้ง่ายขึ้น ( -t)


ฉันชอบมัน. มันได้ทำสิ่งที่ถูกต้องด้วย./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange

3
"การใช้ RAM ตามกระบวนการ" ไม่ใช่ค่าที่กำหนดอย่างชัดเจน: หากมีหลายอินสแตนซ์ของโปรแกรมเดียวกันที่ทำงานอยู่พวกเขาจะใช้งานโปรแกรมร่วมกันได้ โปรแกรมส่วนใหญ่ใช้ร่วมกันglibc(และไลบรารีอื่น ๆ ที่แตกต่างกันเรียกว่า "แบ่งใช้" สำหรับบางสิ่ง) daemons จำนวนมากโหลดการกำหนดค่าลงในหน่วยความจำและ fork (2) ชายด์จากนั้นแชร์ข้อมูลการกำหนดค่า จากนั้นมีข้อมูลในบัฟเฟอร์ readahead / writebehind ที่จัดการโดยเคอร์เนล และจากนั้นก็มีบริการที่เป็นกระบวนการที่เชื่อมโยงกันอย่างแน่นหนา (นึกถึงสภาพแวดล้อมเดสก์ท็อปของคุณและแอปเพล็ตและพื้นหลังทั้งหมด)
vonbrand

@ vonbrand วิธีที่ Linux-Kernel คำนวณค่า RSS / VSS มีการกำหนดอย่างดี
maxschlepzig

@maxschlepzig อาจคำนวณค่าสุ่มบางอย่างได้ดีซึ่งไม่ได้หมายความว่าพวกเขาหมายถึงสิ่งที่คุณคิดว่าหมายความว่า: ชุดที่อาศัยอยู่เป็นเพียงหน้าในพื้นที่ที่อยู่ของกระบวนการที่อยู่ในหน่วยความจำ นั่นไม่ใช่ "หน่วยความจำที่ใช้โดยกระบวนการนี้" ซึ่งรวมถึงสิ่งที่แบ่งปัน
vonbrand

@vonbrand กรณีการใช้งานส่วนใหญ่ในการวัดการใช้หน่วยความจำของกระบวนการจะต้องการวัดหน้าเว็บที่ไม่เปิดเผยตัวซึ่งไม่สามารถแชร์ได้ซึ่งควรจะคาดเดาได้มากด้วยอินพุตเดียวกัน
Vladimir Panteleev

28

timeเป็นเปลือกในตัวของคุณ หากคุณต้องการtimeแต่ต้องการข้อมูลเพิ่มเติมลองใช้ GNU timeใน-vโหมดverbose ( ):

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

ค้นหาแพ็คเกจ "เวลา" หรือ "gnutime" ในเครื่องมือจัดการแพ็กเกจของคุณ


3
โปรดทราบว่าข้อมูลบางส่วนที่รายงานโดยเวลา GNU อาจไม่ถูกต้อง เช่นภายใต้ Ubuntu 10.04: หน้า man ระบุว่า 'ตัวเลขนั้นดีเท่ากับที่ส่งคืนโดย wait3 (2)' Ie wait3เติมโครงสร้างที่อธิบายไว้ในgetrusage(2): 'ไม่ใช่ทุกฟิลด์ที่มีความหมายภายใต้ Linux [ .. ]
maxschlepzig

4
ตัวอย่างเช่นในโปรแกรมทดสอบที่จัดสรร 10 MB (และสัมผัสแต่ละหน้า) - เวลา GNU รายงานค่าสูงสุดของ 42608 KiB - และtstimeรายงาน 1,0652 KiB อีกครั้งภายใต้ Ubuntu 10.04
maxschlepzig

ฉันจะรักถ้ามันเรียบง่ายนี้ /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'บนเครื่องอูบุนตูของฉันฉันพยายาม: ด้านบนบอกว่าใช้เวลาประมาณ 570 MB แต่เวลาบอกว่า 2.3 GB ในทางปฏิบัติหมายเลขนั้นไม่สามารถใช้ได้กับฉัน
Ole Tange

ตัวประกอบของ 4 ได้รับการแก้ไขในเวลา GNU 1.7 และทำงานได้ตามที่คาดไว้
Ole Tange

หมายเหตุสำคัญ: "ขนาดชุดที่พักอาศัยสูงสุด" ใช้งานได้ตั้งแต่ Linux 2.6.32 เท่านั้น
Jan Hudec

17

บางที overkill แต่ฉันก็พบว่ามีเครื่องมือที่ดีที่มีชื่อว่าvalgrind massifฉันทดสอบกับxterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

และคุณได้รับกราฟการใช้หน่วยความจำที่ดี:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

พร้อมกับข้อมูลการใช้หน่วยความจำที่มีรายละเอียดมากเกินไป รายละเอียดในคู่มือ valgrind

โปรแกรมจะทำงานช้าลงประมาณ 20 เท่า xtermนอกจากนี้ผมวิ่งคำสั่งบางอย่างภายใน รอยเท้าหน่วยความจำของพวกเขาได้รับการพิจารณาเพราะ--trace-children=yesตัวเลือกอยู่ที่นั่น!


1
การลงโทษด้วยความเร็ว 20 เท่าทำให้ไม่สามารถทำได้สำหรับสถานการณ์ของฉัน มิฉะนั้นกราฟที่สวยมาก!
Ole Tange

1
ดูเหมือนว่าอย่างน้อยในรุ่น 3.8.1 ของ valgrind ที่ฉันใช้ booleans ได้รับการยอมรับในรูปแบบ "ใช่ / ไม่ใช่" และไม่ใช่ "จริง / เท็จ" ฉันบ่น! :-)
MakisH

6

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

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

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

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

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

คำถามในตอนนี้คือ: มีการใช้หน่วยความจำจริงเท่าใดเนื่องจากการรัน A

คำตอบ: 60 MiB

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


3

ดูเหมือนว่า tstime จะไม่ทำงานภายใต้ non-root ภายใต้ Linux> = 3.0 อีกต่อไป นี่คือเครื่องมือสำรวจที่ฉันเขียนเพื่อแฮ็คปัญหา: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vให้เอาต์พุตที่ถูกต้องในเวอร์ชันที่ใหม่กว่า ในรุ่นเก่าคุณเพียงแค่หารด้วย 4 เพื่อให้ได้จำนวนที่ถูกต้อง
Ole Tange

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