Đo mức sử dụng RAM của chương trình


46

time là một lệnh tuyệt vời nếu bạn muốn tìm ra thời gian CPU cho một lệnh đã cho.

Tôi đang tìm kiếm một cái gì đó tương tự có thể đo mức sử dụng RAM tối đa của chương trình và bất kỳ trẻ em nào. Tốt nhất là nên phân biệt giữa bộ nhớ được phân bổ đã được sử dụng và không được sử dụng. Có lẽ nó thậm chí có thể cung cấp cho việc sử dụng bộ nhớ trung bình (vì vậy việc sử dụng bộ nhớ mà bạn nên mong đợi khi chạy trong một thời gian dài).

Vì vậy, tôi muốn làm:

rammeassure my_program my_args

và nhận đầu ra tương tự như:

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

Tôi đã xem memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 nhưng tôi coi đó là một phần của hack.

Câu trả lời:


24

Bạn có thể sử dụng thời gian để đo mức sử dụng bộ nhớ nước cao (RSS và ảo) của một quy trình.

Ví dụ:

$ 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

Nó cũng hỗ trợ chế độ phân tích đầu ra dễ dàng hơn ( -t).


Tôi thích nó. Nó thậm chí đã làm The Right Thing with./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange

3
"Sử dụng RAM theo quy trình" không phải là một giá trị được xác định rõ: Nếu có một số phiên bản của cùng một chương trình đang chạy, chúng sẽ chia sẻ tệp thực thi. Hầu hết các chương trình chia sẻ glibc(và các thư viện các loại khác, chúng được gọi là "chia sẻ" cho một cái gì đó). Nhiều daemon tải cấu hình vào bộ nhớ và fork (2) con, sau đó chúng chia sẻ dữ liệu cấu hình. Sau đó, có dữ liệu trong bộ đệm readahead / writebehind được quản lý bởi kernel. Và sau đó, có các dịch vụ là một loạt các quá trình kết hợp lỏng lẻo (nghĩ về môi trường máy tính để bàn của bạn và tất cả các applet và công cụ nền của nó).
vonbrand

@vonbrand, cách Linux-Kernel tính toán các giá trị RSS / VSS được xác định rõ.
maxschlepzig

@maxschlepzig, nó cũng có thể tính toán một số giá trị ngẫu nhiên, điều đó không có nghĩa là chúng có nghĩa như bạn nghĩ: Bộ thường trú chỉ là các trang trong không gian địa chỉ của quy trình hiện đang nằm trong bộ nhớ. Đó không phải là "bộ nhớ được sử dụng bởi quá trình này", nó bao gồm bất cứ thứ gì nó đang chia sẻ.
vonbrand

@vonbrand Hầu hết các trường hợp sử dụng đo lường mức sử dụng bộ nhớ của một quá trình sẽ muốn đo các trang ẩn danh không chia sẻ, điều này rất dễ đoán với cùng một đầu vào.
Vladimir Panteleev

28

timelà một tích hợp của vỏ của bạn. Nếu bạn thích timenhưng cần thêm thông tin, hãy thử GNU time-vchế độ 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

Tìm kiếm gói "thời gian" hoặc "gnutime" trong trình quản lý gói của bạn.


3
Lưu ý rằng một số thông tin được báo cáo theo thời gian GNU có thể không chính xác. Ví dụ, trong Ubuntu 10.04: Trang hướng dẫn 'Các số chỉ tốt bằng số được trả về bởi Wait3 (2)'. Tức là wait3điền vào một cấu trúc được mô tả trong getrusage(2): 'Không phải tất cả các trường đều có ý nghĩa trong Linux. [..] '.
maxschlepzig

4
Ví dụ: trên một chương trình thử nghiệm phân bổ chính xác 10 MB (và chạm vào từng trang) - Thời gian GNU báo cáo maxRSS là 42608 KiB - và tstimebáo cáo 10652 KiB. Một lần nữa trong Ubuntu 10.04.
maxschlepzig

Tôi sẽ yêu nếu nó đơn giản. Trên máy Ubuntu của tôi, tôi đã thử : /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top cho biết nó mất khoảng 570 MB, nhưng thời gian nói là 2,3 GB. Trong thực tế con số đó không thể sử dụng được với tôi.
Ole Tange

Hệ số 4 được cố định trong thời gian GNU 1.7 và do đó hoạt động như mong đợi.
Ole Tange

Lưu ý quan trọng: "Kích thước bộ cư trú tối đa" chỉ hoạt động kể từ Linux 2.6.32.
Jan Hudec

17

Có thể quá mức cần thiết, nhưng tôi chỉ thấy rằng valgrindcó một công cụ tốt đẹp được đặt tên massif. Tôi đã thử nó trên xterm:

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

Và bạn có được một biểu đồ sử dụng bộ nhớ đẹp:

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

cùng với thông tin sử dụng bộ nhớ quá chi tiết. Chi tiết trong hướng dẫn sử dụng valgrind .

Các chương trình sẽ chạy chậm hơn khoảng 20 lần. Ngoài ra, tôi đã chạy một số lệnh bên trong xterm. Dấu chân bộ nhớ của họ đã được tính đến vì --trace-children=yestùy chọn là có!


1
Hình phạt tốc độ 20 lần khiến nó không phù hợp với tình huống của tôi. Nếu không thì đồ thị rất đẹp!
Ole Tange

1
Có vẻ như vậy, ít nhất là trong phiên bản 3.8.1 của valgrind mà tôi đang sử dụng, booleans chỉ được chấp nhận ở dạng "có / không" và không "đúng / sai". Của tôi phàn nàn! :-)
MakisH

6

Mặc dù chủ đề này khá cũ, tôi muốn chia sẻ một dự án khác xuất hiện từ tính năng nhân Linux của cgroups.

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

cgmemtime đo mức sử dụng bộ nhớ RSS + CACHE nước cao của một quá trình và các quá trình hậu duệ của nó.

Để có thể làm như vậy, nó đặt quá trình vào nhóm riêng của mình.

Ví dụ quy trình A phân bổ 10 MiB và trao cho một đứa trẻ B phân bổ 20 MiB và cho phép một đứa trẻ C phân bổ 30 MiB. Tất cả ba quy trình chia sẻ một cửa sổ thời gian trong đó phân bổ của chúng dẫn đến việc sử dụng bộ nhớ RSS (kích thước cài đặt thường trú) tương ứng.

Câu hỏi bây giờ là: Bao nhiêu bộ nhớ thực sự được sử dụng như là kết quả của việc chạy A?

Trả lời: 60 MiB

cgmemtime là công cụ để trả lời những câu hỏi như vậy.


3

Có vẻ như tstime không hoạt động nữa trong phần không root trong Linux> = 3.0. Đây là một tiện ích bỏ phiếu mà tôi đã viết để hack xung quanh vấn đề này: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vđưa ra đầu ra chính xác trong các phiên bản mới hơn. Trong các phiên bản cũ hơn, bạn chỉ cần chia cho 4 để có được số tiền chính xác.
Ole Tange

Tuy nhiên, tôi không nghĩ time -v hỗ trợ kích thước vmemory cao nhất (chỉ RSS). Bất cứ ai có thể xác nhận điều này trên phiên bản mới nhất?
jhclark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.