Sử dụng bộ nhớ tối đa của quy trình linux / unix


376

Có công cụ nào sẽ chạy một dòng lệnh và báo cáo tổng mức sử dụng RAM cao nhất không?

Tôi đang tưởng tượng một cái gì đó tương tự / usr / bin / time

Câu trả lời:


28

Đây là một lớp lót không yêu cầu bất kỳ tập lệnh hoặc tiện ích bên ngoài nào và không yêu cầu bạn bắt đầu quá trình thông qua một chương trình khác như Valgrind hoặc thời gian, vì vậy bạn có thể sử dụng nó cho bất kỳ quy trình nào đang chạy:

grep VmPeak /proc/$PID/status

(thay thế $PIDbằng PID của quy trình bạn quan tâm)


4
Điều gì xảy ra nếu tôi không biết về PID? Ví dụ: trong trường hợp khi chương trình chạy một lượng thời gian nhỏ (<1s)
diralik

4
"VmHWM: Kích thước cài đặt thường trú cao nhất" có thể được sử dụng nhiều hơn để đo mức sử dụng RAM (thay vì VmPeak bao gồm rất nhiều thứ khác nữa).
jfs

@jfs nó thực sự phụ thuộc vào những gì bạn muốn tìm hiểu. IIRC VmPeak là tổng mức sử dụng bộ nhớ tối đa bao gồm cả bộ nhớ ảo, trong khi VmHWM là mức sử dụng RAM cao nhất. Vì vậy, nếu bạn muốn biết tổng dung lượng bộ nhớ mà chương trình của bạn đã yêu cầu, hãy sử dụng VmPeak; nếu bạn muốn biết nó thực sự đã sử dụng bao nhiêu RAM tại một thời điểm nhất định, hãy sử dụng VmHWM.
erobertc

1
@dirusik nếu bạn đang kiểm tra một chương trình do chính mình viết, bạn có thể nhúng một dòng mã để xem xét tệp "/ Proc / self / status".
Fileland

404

[ Chỉnh sửa : Hoạt động trên Ubuntu 14.04: /usr/bin/time -v command Đảm bảo sử dụng đường dẫn đầy đủ.]

Có vẻ như /usr/bin/timesẽ cung cấp cho bạn thông tin đó, nếu bạn vượt qua -v(đây là trên Ubuntu 8.10). Xem, ví dụ, Maximum resident set sizedưới đây:

$ / usr / bin / time -v ls /
....
        Lệnh đang được định thời gian: "ls /"
        Thời gian của người dùng (giây): 0,00
        Thời gian hệ thống (giây): 0,01
        Phần trăm CPU công việc này có: 250%
        Thời gian đã trôi qua (đồng hồ treo tường) (h: mm: ss hoặc m: ss): 0: 00.00
        Kích thước văn bản được chia sẻ trung bình (kbytes): 0
        Kích thước dữ liệu không chia sẻ trung bình (kbytes): 0
        Kích thước ngăn xếp trung bình (kbyte): 0
        Tổng kích thước trung bình (kbyte): 0
        Kích thước cài đặt thường trú tối đa (kbyte): 0
        Kích thước bộ cư dân trung bình (kbytes): 0
        Lỗi trang chính (yêu cầu I / O): 0
        Lỗi trang (lấy lại khung) nhỏ: 315
        Công tắc bối cảnh tự nguyện: 2
        Công tắc bối cảnh không tự nguyện: 0
        Hoán đổi: 0
        Đầu vào hệ thống tệp: 0
        Đầu ra hệ thống tệp: 0
        Tin nhắn ổ cắm đã gửi: 0
        Tin nhắn ổ cắm nhận được: 0
        Tín hiệu được gửi: 0
        Kích thước trang (byte): 4096
        Trạng thái thoát: 0

4
Có lẽ nó luôn trả về 0 vì tôi không làm được gì nhiều. Hãy thử một lệnh chuyên sâu CPU hơn.
Jon Ericson

17
Từ trang man: Hầu hết thông tin hiển thị theo thời gian được lấy từ cuộc gọi hệ thống Wait3 (2). Các con số chỉ tốt bằng những con số được trả về bởi Wait3 (2). Trên các hệ thống không có cuộc gọi Wait3 (2) trả về thông tin trạng thái, thay vào đó, lần gọi (2) hệ thống được sử dụng. Tuy nhiên, nó cung cấp ít thông tin hơn nhiều so với Wait3 (2), do đó, trên các hệ thống đó thời gian báo cáo phần lớn các tài nguyên là 0.
lothar

79
"Bash: -v: lệnh không tìm thấy" có nghĩa là bash chặn thời gian để sử dụng nó. /bin/time -vgiải quyết nó
gcb

3
Nó sẽ là giá trị nó để làm một kiểm tra nhanh để đảm bảo đầu ra có ý nghĩa. Thời gian của Gnu có một lỗi trong đó nó sẽ báo cáo gấp 4 lần sử dụng bộ nhớ thực tế: stackoverflow.com/questions/10035232/ Kẻ
Ian

24
@skalee Hãy thử time -ltrên MacOS, cho đầu ra tương tự.
Volker Stolz

96

(Đây là một câu hỏi đã được trả lời, câu hỏi cũ .. nhưng chỉ dành cho hồ sơ :)

Tôi đã được truyền cảm hứng từ kịch bản của Yang, và đã đưa ra công cụ nhỏ này, được đặt tên là memusg . Tôi chỉ đơn giản là tăng tỷ lệ lấy mẫu lên 0,1 để xử lý nhiều quá trình sống ngắn. Thay vì theo dõi một quy trình đơn lẻ, tôi đã thực hiện nó đo tổng rss của nhóm quy trình. (Vâng, tôi viết rất nhiều chương trình riêng biệt hoạt động cùng nhau) Nó hiện đang hoạt động trên Mac OS X và Linux. Việc sử dụng phải tương tự như time:

ghi nhớ ls -alR /> / dev / null

Nó chỉ hiển thị mức cao nhất vào lúc này, nhưng tôi quan tâm đến các tiện ích mở rộng nhẹ để ghi lại các số liệu thống kê (thô) khác.

Thật tốt khi có công cụ đơn giản như vậy chỉ để xem trước khi chúng tôi bắt đầu bất kỳ hồ sơ nghiêm túc nào.


1
tất cả vẫn sử dụng PS và chỉ tốt để xác định bộ nhớ trên được quan sát. không bộ nhớ thực sự hàng đầu. bạn luôn có thể bỏ lỡ một cái gì đó giữa khoảng này và khoảng khác.
gcb

6
Các đơn vị cho đầu ra của tập lệnh memusg là gì? Byte? Kilobyte?
Daniel Standage

1
@DanielStandage: có thể bằng Kilobytes. Nó chỉ đơn giản xem các giá trị được hiển thị ps -o rss=trong đó rss là kích thước bộ nhớ thực (bộ thường trú) của quá trình (tính theo đơn vị 1024 byte) từ trang man BSD của tôi.
netj

3
@gcb Vậy thì, đó là những gì bạn nhận được khi đo mẫu.
Volker Stolz

2
Liên kết đến memusg được đưa ra trong câu trả lời dường như bị phá vỡ. Dù sao, / usr / bin / time làm điều này rất tốt.
Tom Cornebize

65

Valgrind một lớp lót:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

Lưu ý sử dụng --pages-as-heap để đo tất cả bộ nhớ trong một quy trình. Thêm thông tin ở đây: http://valgrind.org/docs/manual/ms-manual.html


14
time, Tôi đang rời xa bạn.
jbeard4

1
Kịch bản tiện dụng, nhưng tôi cần sắp xếp -g trên hệ thống Slackware của tôi (tôi cho rằng bạn đang tìm kiếm giá trị cao nhất).
Nick Coleman

3
+1 cho valgrind --massif. Bạn cũng có thể sử dụng ms_printcông cụ đi kèm với nó cho đầu ra tiện dụng (bao gồm cả biểu đồ sử dụng ascii theo thời gian)
Eli Bendersky

7
Massif có chi phí hoạt động cao hơn nhiều so với timemặc dù, mất ít nhất 10 lần thời gian cho một lệnh như thế nào ls.
Timothy Gu

8
Đó là cách quá lớn thực sự. Câu trả lời này nên đề cập đến sự chậm lại. Lệnh tôi muốn đo thường mất 35 giây để hoàn thành. Tôi đã chạy lệnh valgrind này để đo nó hơn nửa giờ trước và nó vẫn chưa hoàn thành được
unagi

35

Trên Linux:

Sử dụng /usr/bin/time -v <program> <args>và tìm kiếm " Kích thước bộ cư dân tối đa ".

(Không nên nhầm lẫn với lệnh tích hợp Bash time! Vì vậy, hãy sử dụng đường dẫn đầy đủ , /usr/bin/time)

Ví dụ:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

Trên BSD, MacOS:

Sử dụng /usr/bin/time -l <program> <args>, tìm kiếm " kích thước bộ cư dân tối đa ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
Rolf

2
Không phải mặt đất này đã được bao phủ bởi một câu trả lời được thêm vào hai năm trước sao?
Charles Duffy

34

Có lẽ (gnu) thời gian (1) đã làm những gì bạn muốn. Ví dụ:

$ /usr/bin/time -f "%P %M" command
43% 821248

Nhưng các công cụ định hình khác có thể cho kết quả chính xác hơn tùy thuộc vào những gì bạn đang tìm kiếm.


Tôi dường như luôn nhận được số không với điều này, ngay cả đối với các lệnh lớn
jes5199

Tôi nhận được kết quả khác nhau, như 400% 0 và 0% 0 trên cùng một chương trình .. có lẽ nên chạy trong khoảng thời gian lớn hơn để chính xác?
Liran Orevi

Tôi không biết phải đề nghị gì. Đoạn mã trên chính xác là những gì tôi đã chạy một lệnh latex đã xảy ra trong lịch sử. Như tôi nói, kết quả chính xác hơn có thể thu được bằng các công cụ khác.
Jon Ericson

2
Điều đó hoạt động trên ít nhất các hệ thống CentOS (và do đó, tôi đặt cược, cũng là RHEL). % P đưa ra số liệu thống kê không liên quan (% CPU) phụ thuộc vào bộ lập lịch và do đó khá thay đổi.
Blaisorblade

2
@Deleteman: timelà một lệnh tích hợp khi sử dụng csh. Nếu bạn sử dụng đường dẫn chính xác, nó sẽ cho phép bạn chạy lệnh bên ngoài. Theo tôi biết, chỉ có phiên bản GNU hỗ trợ tùy chọn định dạng.
Jon Ericson

18

/ usr / bin / time có thể làm những gì bạn muốn, thực sự. Cái gì đó như.

 / usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'

Xem thời gian (1) để biết chi tiết ...


1
Tôi dường như luôn nhận được số không với điều này, ngay cả đối với các lệnh lớn
jes5199

jes5199, Liran, nhìn vào các bình luận ở trên, dường như thời gian (1) có thể bị phá vỡ để báo cáo bộ nhớ trên một số linux ...
simon

Trên Ubuntu 16.04, văn bản và dữ liệu bằng 0, nhưng tối đa là khác không và tạo ra giá trị có ý nghĩa. Tôi hạnh phúc với nó.
Stéphane Gourichon

Tôi hy vọng Mmax có nghĩa là những gì chúng tôi muốn nó có nghĩa là .... trang người đàn ông có một chút ngắn gọn về điều đó
matanster

17

Trên MacOS Sierra sử dụng:

/usr/bin/time -l commandToMeasure

Bạn có thể sử dụng grepđể lấy những gì bạn muốn có thể.


5
Điều này! Tôi thực sự đã dành một giờ để cố gắng để có được dụng cụ.app và dtrace để cung cấp cho tôi một hồ sơ bộ nhớ với tính toàn vẹn hệ thống được bật (không thể tắt), trong khi tất cả những gì tôi cần chỉ là lệnh đơn giản này. Một lưu ý nhỏ, bạn có thể sử dụng command time -lthay vì /usr/bin/time -lđiều đó sẽ khiến shell của bạn thực sự gọi một nhị phân được gọi timethay vì hàm dựng sẵn. (Vâng, commandkhông phải là một người giữ chỗ, command timekhác với chỉ time.)
Jakub Arnold

16

Nếu quá trình diễn ra trong ít nhất vài giây, thì bạn có thể sử dụng tập lệnh bash sau, nó sẽ chạy dòng lệnh đã cho sau đó in ra để lấy lại RSS đỉnh (thay thế cho rssbất kỳ thuộc tính nào khác mà bạn quan tâm). Nó hơi nhẹ và nó hoạt động với tôi với psUbuntu 9.04 (mà tôi không thể nói cho time).

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
Hạn chế chính của phương pháp này là nếu quá trình phân bổ nhiều bộ nhớ trong một khoảng thời gian ngắn (ví dụ gần cuối), điều này có thể không được phát hiện. Giảm thời gian ngủ có thể giúp một chút.
vinc17


8

Chà, nếu bạn thực sự muốn hiển thị đỉnh bộ nhớ và một số thống kê chuyên sâu hơn, tôi khuyên bạn nên sử dụng một trình lược tả như valgrind . Một mặt trước valgrind tốt đẹp là hẻm .



5

Đây là (dựa trên các câu trả lời khác) một tập lệnh rất đơn giản theo dõi một quá trình đã chạy. Bạn chỉ cần chạy nó với pid của quá trình bạn muốn xem làm đối số:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

Ví dụ sử dụng:

max_mem_usage.sh 23423


1

Heaptrack là công cụ KDE có giao diện GUI và văn bản. Tôi thấy nó phù hợp hơn valgrind để hiểu cách sử dụng bộ nhớ của một quá trình bởi vì nó cung cấp nhiều chi tiết và hình ảnh ngọn lửa hơn. Nó cũng nhanh hơn bởi vì nó ít kiểm tra valgrind đó. Và nó cung cấp cho bạn việc sử dụng bộ nhớ cao điểm.

Dù sao, theo dõi rss và vss là sai lệch vì các trang có thể được chia sẻ, đó là lý do tại sao memusg. Những gì bạn thực sự nên làm là theo dõi tổng số Psstrong /proc/[pid]/smapshoặc sử dụng pmap. Trình giám sát hệ thống Gnome được sử dụng để làm như vậy nhưng nó quá đắt.


1

Phát minh lại bánh xe, với kịch bản bash làm bằng tay. Nhanh chóng và sạch sẽ.

Trường hợp sử dụng của tôi: Tôi muốn theo dõi một máy linux có ít RAM hơn và muốn chụp ảnh nhanh cho mỗi lần sử dụng container khi nó chạy dưới mức sử dụng nặng.

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

Đầu ra mẫu:

2017-10-12 13:29:33: Chạy màn hình bộ nhớ miễn phí với ngưỡng 30% ..

2017-10-12 13:29:33: Có đủ bộ nhớ trống: 69,4567%

2017-10-12 13:30:03: Có đủ bộ nhớ trống: 69,4567%

2017-10-12 16:47:02: Bộ nhớ miễn phí 18.9387% dưới 30%

đầu ra lệnh tùy chỉnh của bạn


1

Trên macOS, bạn có thể sử dụng DTrace thay thế. Ứng dụng "Dụng cụ" là một GUI đẹp cho điều đó, nó đi kèm với XCode afaik.



-2

Hãy chắc chắn để trả lời câu hỏi. Cung cấp chi tiết và chia sẻ nghiên cứu của bạn!

Xin lỗi, tôi lần đầu tiên đến đây và chỉ có thể đặt câu hỏi

Được sử dụng đề xuất:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

sau đó:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

điều này rất khác với những gì toplệnh hiển thị tại thời điểm tương tự:

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

đơn vị đo từ Valgrind là gì ??

Không /usr/bin/time -v ./test.shbao giờ trả lời - bạn phải trực tiếp cung cấp thực thi để /usr/bin/timethích:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    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): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
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.