Cách đo trên Linux bộ nhớ cao nhất của ứng dụng sau khi kết thúc


11

Làm cách nào để đo bộ nhớ tối đa của một ứng dụng chạy trên Linux?

Tôi chạy ứng dụng này hàng loạt vì vậy tôi không thể sử dụng RSS vì nó báo cáo bộ nhớ hiện tại. Tôi cần bộ nhớ cao nhất mà ứng dụng đã sử dụng được báo cáo ở cuối.

VmPeak cũng không phải là một giải pháp, vì nó báo cáo bộ nhớ được phân bổ và cũng không tính toán từ Ram thực mà còn từ Đĩa cứng.


Hệ điều hành nào bạn đang chạy ứng dụng trên?
CVn

Tôi đang làm việc trên Linux
des_user

Chủ đề này sẽ giúp ích cho bạn: serverfault.com/questions/387268/
Jacob Coleman

Câu trả lời:


13

Dưới đây là 2 phương pháp để theo dõi việc sử dụng bộ nhớ cao nhất của một quá trình.

Xi-rô

Tôi đã không sử dụng công cụ này nhưng nó có vẻ như những gì bạn đang tìm kiếm. Nó được gọi là Syrupy .

Sự miêu tả

Syrupy là một tập lệnh Python thường xuyên chụp nhanh bộ nhớ và tải CPU của một hoặc nhiều quá trình đang chạy, để tự động xây dựng hồ sơ về việc sử dụng tài nguyên hệ thống của họ.

Thí dụ

$ 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

Đúng là trớ trêu, lệnh thời gian GNU có thể cung cấp cho bạn mức sử dụng bộ nhớ cao nhất của một tiến trình. Nó báo cáo bộ nhớ cao điểm như vậy : Maximum resident set size (kbytes).

Thí dụ

$ /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

Người giới thiệu


3

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 nó.

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.

Ví dụ sử dụng sẽ là:

$ 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

Vậy, làm thế nào công cụ này có thể được sử dụng để báo cáo mức sử dụng RAM cao nhất của một chương trình sau khi chương trình đó đã thoát ?
terdon

@terdon Nó sử dụng wait4để bắt quá trình thoát trong sự kết hợp với cgroups ( memory.max_usage_in_bytes), có vẻ như có ý nghĩa. Thêm chi tiết có sẵn trong README trên github.
Vlad Frolov

Cảm ơn, nhưng quan điểm của tôi là nhiều hơn về câu trả lời của bạn. Khi nó đứng, nó không trả lời câu hỏi, chỉ trỏ đến một số tài nguyên bên ngoài có thể có thể. Ngoài ra, bạn đã đăng cùng một câu trả lời chính xác ở nơi khác có cờ tự động. Vui lòng chỉnh sửa câu trả lời của bạn và bao gồm một ví dụ cho thấy chương trình này có thể làm những gì OP yêu cầu.
terdon

2
@terdon Vâng, tôi đã làm! Bởi vì tôi đã tìm kiếm cùng một câu hỏi và các câu hỏi khá giống nhau, và các câu trả lời đều giống nhau: 'parse ps output', thật là điên rồ! Tôi đã dành một tuần trước khi vô tình va vào dự án cgmemtime, đây là kết hợp hoàn hảo cho tất cả những câu hỏi mà tôi đã nhận xét!
Vlad Frolov

1
Đủ công bằng. Sẽ thật tuyệt nếu bạn có thể đưa ra một ví dụ về cách sử dụng nó. Nó sẽ cải thiện câu trả lời của bạn. Trong mọi trường hợp, cảm ơn bạn đã dành thời gian để đăng bài này, tôi chắc chắn những người khác sẽ thấy nó hữu ích.
terdon
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.