Làm thế nào để đo mức sử dụng bộ nhớ thực tế của một ứng dụng hoặc quá trình?


712

Câu hỏi này được đề cập ở đây rất chi tiết.

Làm thế nào để bạn đo mức sử dụng bộ nhớ của một ứng dụng hoặc quy trình trong Linux?

Từ bài viết trên blog về Tìm hiểu sử dụng bộ nhớ trên Linux , pskhông phải là một công cụ chính xác để sử dụng cho mục đích này.

Tại sao ps"sai"

Tùy thuộc vào cách bạn nhìn vào nó, pskhông báo cáo việc sử dụng bộ nhớ thực của các quá trình. Những gì nó thực sự đang làm là hiển thị bao nhiêu bộ nhớ thực mỗi quá trình sẽ chiếm nếu nó là quá trình duy nhất đang chạy . Tất nhiên, một máy Linux điển hình có vài chục tiến trình đang chạy tại bất kỳ thời điểm nào, điều đó có nghĩa là các số VSZ và RSS được báo cáo psgần như chắc chắn sai .


6
Câu hỏi này có lẽ thuộc về serverfault.com thay vì ngày nay, mặc dù nó nói với tôi rằng "quá cũ để di chuyển". Đừng thực sự muốn đóng nó mặc dù ...
thomasrutter


2
Trên thực tế pskhông thể hiện điều đó - nó hiển thị số bộ nhớ ảo và bộ nhớ trong, trong đó bộ nhớ ảo là số lượng bộ nhớ tối đa theo lý thuyết có thể sử dụng nó, đó là quy trình duy nhất (không bao giờ như vậy), được sử dụng cho mỗi trang được phân bổ (không bao giờ xảy ra) và không ánh xạ hoặc bỏ sơ đồ bất kỳ trang nào (không chắc). Trong khi cư dân cho thấy có bao nhiêu bộ nhớ ảo được ánh xạ tới vật lý ngay bây giờ. virt > usage > resTuy nhiên, thông thường trên hệ thống 64 bit virt ~= res*10, phạm vi rất rộng.
Dima Tisnek

5
Đoạn trích từ bài viết được liên kết là tổng số vô nghĩa. RSS là bộ nhớ vật lý thực sự được sử dụng và VSZ có thể hoặc không thể dịch sang sử dụng bộ nhớ vật lý ngay cả khi quá trình này là duy nhất đang chạy.
David Schwartz

Câu trả lời:


356

Với pshoặc các công cụ tương tự, bạn sẽ chỉ nhận được số lượng trang bộ nhớ được phân bổ theo quy trình đó. Con số này là chính xác, nhưng:

  • không phản ánh dung lượng bộ nhớ thực tế mà ứng dụng sử dụng, chỉ phản hồi dung lượng bộ nhớ dành cho nó

  • có thể gây hiểu nhầm nếu các trang được chia sẻ, ví dụ như bởi một số chủ đề hoặc bằng cách sử dụng các thư viện được liên kết động

Nếu bạn thực sự muốn biết dung lượng bộ nhớ mà ứng dụng của bạn thực sự sử dụng, bạn cần chạy nó trong một hồ sơ. Ví dụ, valgrindcó thể cung cấp cho bạn thông tin chi tiết về dung lượng bộ nhớ được sử dụng và quan trọng hơn là về rò rỉ bộ nhớ có thể có trong chương trình của bạn. Công cụ profiler heap của valgrind được gọi là 'massif':

Massif là một hồ sơ heap. Nó thực hiện hồ sơ heap chi tiết bằng cách chụp ảnh nhanh thường xuyên của heap chương trình. Nó tạo ra một biểu đồ cho thấy việc sử dụng heap theo thời gian, bao gồm thông tin về phần nào của chương trình chịu trách nhiệm phân bổ bộ nhớ nhiều nhất. Biểu đồ được bổ sung bởi một tệp văn bản hoặc tệp HTML bao gồm nhiều thông tin hơn để xác định nơi nhiều bộ nhớ nhất được phân bổ. Massif chạy các chương trình chậm hơn khoảng 20 lần so với bình thường.

Như đã giải thích trong tài liệu valgrind , bạn cần chạy chương trình thông qua valgrind:

valgrind --tool=massif <executable> <arguments>

Massif viết một đống ảnh chụp sử dụng bộ nhớ (ví dụ massif.out.12345). Chúng cung cấp, (1) dòng thời gian sử dụng bộ nhớ, (2) cho mỗi ảnh chụp nhanh, bản ghi vị trí trong bộ nhớ chương trình của bạn được phân bổ. Một công cụ đồ họa tuyệt vời để phân tích các tệp này là massif-visualizer . Nhưng tôi thấy ms_print, một công cụ dựa trên văn bản đơn giản được vận chuyển với valgrind, đã giúp ích rất nhiều rồi.

Để tìm rò rỉ bộ nhớ, sử dụng memcheckcông cụ (mặc định) của valgrind.


44
Để diễn giải các kết quả được tạo ra bởi valgrind, tôi có thể đề xuất hẻm. Nó không quá lạ mắt và chỉ cho bạn biết những gì bạn cần biết để xác định nguồn rò rỉ. Một cặp tiện ích tốt đẹp.
Dan

6
Mục (a) là chính xác. Có một sự khác biệt giữa các trang được sử dụng và bộ nhớ thực sự được phân bổ bởi ứng dụng thông qua các cuộc gọi đến malloc (), mới, v.v ... Việc sử dụng thường trú chỉ cho thấy bao nhiêu bộ nhớ phân trang nằm trong RAM.
jcoffland

63
Điều này không thực sự cho biết làm thế nào để có được việc sử dụng bộ nhớ bằng cách sử dụng valgrind?
Matt Joiner

11
công cụ valgrind mặc định, memcheck, rất hữu ích để phát hiện rò rỉ bộ nhớ, nhưng nó không thực sự là một trình lược tả bộ nhớ. Đối với điều đó, bạn muốn valgrind --tool = massif.
Todd giải phóng

3
@DavidSchwartz Tôi không thấy tuyên bố của bạn mâu thuẫn với tôi như thế nào. Tôi có cảm giác rằng bạn quá quan tâm đến quan điểm của tôi về việc tôi "sai" hơn là thực sự đọc những gì tôi đang nói. Toàn bộ quan điểm của tôi ở đây là RSS là một biện pháp không phù hợp cho việc sử dụng bộ nhớ thực của ứng dụng và bạn đang đưa ra quan điểm giống nhau trong hai câu cuối của bạn. Thực sự, những gì bạn thậm chí nghĩ là lý do cho tôi để đưa ra sự thu hẹp RSS ở nơi đầu tiên? Vì vậy, bạn đánh vần nó trở lại với tôi để chứng minh tôi "sai" bởi chính xác những gì tôi đang đề cập đến? Thái độ của bạn đối với tôi là mệt mỏi.
ypnos

280

Hãy thử lệnh pmap :

sudo pmap -x <process pid>

45
chạy với sudo hoặc nó không có lỗi và hiển thị không có bộ nhớ tiêu thụ.
Matt

22
Không tồn tại trên OSX (cho bất kỳ ai đến đây từ google)
jcollum

3
Đó là một câu trả lời đầy đủ cho câu hỏi! ps. Trong shell của tôi, pmap có thể đọc tiến trình mà không cần sudo.
MasterControl

7
Re OS X (dường như không phải là mối quan tâm của OP), bạn có thể thấy một số dữ liệu tương tự bằng vmmap (1)
jrg

lưu ý: đưa ra câu trả lời hoàn toàn khác vớignome-system-monitor
ribamar

190

Khó có thể nói chắc chắn, nhưng đây là hai điều "gần gũi" có thể giúp ích.

$ ps aux 

sẽ cung cấp cho bạn Kích thước ảo (VSZ)

Bạn cũng có thể nhận được số liệu thống kê chi tiết từ hệ thống tập tin / Proc bằng cách đi đến /proc/$pid/status

Điều quan trọng nhất là VmSize, gần với những gì ps auxmang lại.

/ Proc / 19420 $ trạng thái con mèo
Tên: firefox
Bang: S (đang ngủ)
Tgid: 19420
Pid: 19420
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Nhóm: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 
VmPeak: 222956 kB
Kích thước VmS: 212520 kB
VmLck: 0 kB
VmHWM: 127912 kB
VmRSS: 118768 kB
VmData: 170180 kB
VmStk: 228 kB
VmExe: 28 kB
VmLib: 35424 kB
VmPTE: 184 kB
Chủ đề: 8
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 03
Mems_allowed: 1
tự nguyện_ctxt_switches: 63422
nonvoluntary_ctxt_switches: 7171


21
Tui bỏ lỡ điều gì vậy? Câu hỏi hỏi làm thế nào để đo lường mức độ sử dụng bộ nhớ tốt hơn theo một quy trình, do VSZ và RSS được báo cáo trong ps là sai lệch. Câu trả lời của bạn chi tiết cách tra cứu VSZ - cùng một giá trị được đề cập là sai lệch.
thomasrutter

16
@thomasrutter Có, bạn đang thiếu câu hỏi ban đầu (rev 1), nó đã được chỉnh sửa nhiều lần và khá cũ (2008). Câu hỏi ban đầu chỉ hỏi làm thế nào để đo mức sử dụng bộ nhớ của một quá trình. Tuy nhiên, hãy chỉnh sửa câu hỏi và câu trả lời, nếu mọi thứ đã lỗi thời. :)
DustinB

1
lưu ý: đưa ra câu trả lời hoàn toàn khác vớignome-system-monitor
ribamar

131

Trong các phiên bản gần đây của linux, hãy sử dụng hệ thống con smaps . Ví dụ: đối với quy trình có PID là 1234:

cat /proc/1234/smaps

Nó sẽ cho bạn biết chính xác dung lượng bộ nhớ đang sử dụng tại thời điểm đó. Quan trọng hơn, nó sẽ phân chia bộ nhớ thành tin và chia sẻ, vì vậy bạn có thể nói bao nhiêu bộ nhớ của bạn ví dụ của chương trình đang sử dụng, mà không bao gồm bộ nhớ chia sẻ giữa nhiều trường hợp của các chương trình.


tôi đoán pmaplà một giao diện đơn giản hơn cho nó.
ribamar

126

Không có cách dễ dàng để tính toán này. Nhưng một số người đã cố gắng để có được một số câu trả lời tốt:


kết quả tốt đẹp một danh sách sạch bộ nhớ và quá trình
Rubytastic

Rất đẹp, với nhóm khá thông minh.
Rohmer

Yeap, thực sự khá tốt đẹp. Tôi thấy ps_memsmemrất hữu ích cho các biện pháp của người dùng cuối, trong khi, ví dụ. pmapĐầu ra rất chi tiết được hướng tới các nhà phát triển ... cho phép truy xuất mức sử dụng Bộ nhớ của Firefox cho từng phông chữ, addons, lib cho ex. Cảm ơn tất cả các bạn. @Bash, @thomasruther.
tuk0z

cái này cho đến nay là cái duy nhất khớp với đầu ra củagnome-system-monitor
ribamar

110

Sử dụng smem , một giải pháp thay thế cho ps tính toán USS và PSS cho mỗi quy trình. Những gì bạn muốn có lẽ là PSS.

  • USS - Kích thước cài đặt độc đáo. Đây là số lượng bộ nhớ không chia sẻ duy nhất cho quá trình đó (nghĩ về nó như U cho bộ nhớ duy nhất ). Nó không bao gồm bộ nhớ chia sẻ. Do đó, điều này sẽ thể hiện dưới mức bộ nhớ mà một quá trình sử dụng, nhưng rất hữu ích khi bạn muốn bỏ qua bộ nhớ dùng chung.

  • PSS - Kích thước cài đặt theo tỷ lệ. Đây là cái bạn muốn. Nó kết hợp thêm bộ nhớ duy nhất (USS), cùng với tỷ lệ bộ nhớ dùng chung chia cho số lượng quá trình chia sẻ bộ nhớ đó. Do đó, nó sẽ cung cấp cho bạn một đại diện chính xác về số lượng bộ nhớ vật lý thực tế đang được sử dụng cho mỗi quá trình - với bộ nhớ chia sẻ thực sự được biểu thị như được chia sẻ. Hãy nghĩ về P là cho bộ nhớ vật lý .

Làm thế nào điều này so sánh với RSS như được báo cáo bởi ps và các tiện ích khác:

  • RSS - Kích thước cài đặt thường trú. Đây là dung lượng bộ nhớ dùng chung cộng với bộ nhớ không chia sẻ được sử dụng bởi mỗi quá trình. Nếu bất kỳ quy trình nào chia sẻ bộ nhớ, điều này sẽ vượt quá số lượng bộ nhớ thực sự được sử dụng, bởi vì cùng một bộ nhớ sẽ được tính nhiều lần - xuất hiện lại trong mỗi quy trình có chung bộ nhớ. Do đó, nó khá không đáng tin cậy, đặc biệt là khi các quy trình bộ nhớ cao có rất nhiều nhánh - thường thấy trong một máy chủ, với những thứ như các quy trình Apache hoặc PHP (fastcgi / FPM).

Lưu ý: smem cũng có thể (tùy chọn) các biểu đồ đầu ra như biểu đồ hình tròn và tương tự. IMO bạn không cần bất kỳ điều đó. Nếu bạn chỉ muốn sử dụng nó từ dòng lệnh như bạn có thể sử dụng ps -A v, thì bạn không cần phải cài đặt phụ thuộc được đề nghị python-matplotlib.


2
Một điểm quan trọng về RSS là hầu hết các ứng dụng ngày nay chia sẻ rất nhiều trang mã. Mỗi thư viện chia sẻ (ví dụ libc và libstdc ++) sẽ được tính cho mọi quy trình sử dụng nó. Và nếu có nhiều phiên bản của một tiến trình đang chạy, tất cả mã đó sẽ được tính hai lần.
David C.

1
Chính xác, đó là lý do tại sao RSS báo cáo quá mức về bộ nhớ vật lý thực tế trên mỗi quy trình.
thomasrutter

3
smem là những gì tôi cần Bằng cách chạy nó với -t mỗi khi tôi bắt đầu một cá thể quy trình mới, tôi có thể thấy bộ nhớ mà mỗi cá thể tiêu thụ. Đối với chrome: smem -t -P '/ opt / google / chrome'
xtian

Tôi đang gặp khó khăn khi tìm tài liệu cho smem .. nó có xuất ra byte, kilobyte hoặc megabyte theo mặc định không ??
ZN13

4
TL; DR: USS = Lượng bộ nhớ vật lý sẽ được giải phóng nếu quá trình bị hủy, PSS = Lượng bộ nhớ vật lý mà quá trình này cần từ hệ thống nếu không có quá trình hiện tại nào bị giết, RSS = Số lượng bộ nhớ vật lý có thể truy cập được quá trình này (nhưng không phải lúc nào cũng độc quyền truy cập).
Mikko Rantalainen

95
ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1

Sử dụng điều này như root và bạn có thể nhận được một đầu ra rõ ràng cho việc sử dụng bộ nhớ theo từng quy trình.

VÍ DỤ ĐẦU RA:

     0.00 Mb COMMAND 
  1288.57 Mb /usr/lib/firefox
   821.68 Mb /usr/lib/chromium/chromium 
   762.82 Mb /usr/lib/chromium/chromium 
   588.36 Mb /usr/sbin/mysqld 
   547.55 Mb /usr/lib/chromium/chromium 
   523.92 Mb /usr/lib/tracker/tracker
   476.59 Mb /usr/lib/chromium/chromium 
   446.41 Mb /usr/bin/gnome
   421.62 Mb /usr/sbin/libvirtd 
   405.11 Mb /usr/lib/chromium/chromium 
   302.60 Mb /usr/lib/chromium/chromium 
   291.46 Mb /usr/lib/chromium/chromium 
   284.56 Mb /usr/lib/chromium/chromium 
   238.93 Mb /usr/lib/tracker/tracker
   223.21 Mb /usr/lib/chromium/chromium 
   197.99 Mb /usr/lib/chromium/chromium 
   194.07 Mb conky 
   191.92 Mb /usr/lib/chromium/chromium 
   190.72 Mb /usr/bin/mongod 
   169.06 Mb /usr/lib/chromium/chromium 
   155.11 Mb /usr/bin/gnome
   136.02 Mb /usr/lib/chromium/chromium 
   125.98 Mb /usr/lib/chromium/chromium 
   103.98 Mb /usr/lib/chromium/chromium 
    93.22 Mb /usr/lib/tracker/tracker
    89.21 Mb /usr/lib/gnome
    80.61 Mb /usr/bin/gnome
    77.73 Mb /usr/lib/evolution/evolution
    76.09 Mb /usr/lib/evolution/evolution
    72.21 Mb /usr/lib/gnome
    69.40 Mb /usr/lib/evolution/evolution
    68.84 Mb nautilus
    68.08 Mb zeitgeist
    60.97 Mb /usr/lib/tracker/tracker
    59.65 Mb /usr/lib/evolution/evolution
    57.68 Mb apt
    55.23 Mb /usr/lib/gnome
    53.61 Mb /usr/lib/evolution/evolution
    53.07 Mb /usr/lib/gnome
    52.83 Mb /usr/lib/gnome
    51.02 Mb /usr/lib/udisks2/udisksd 
    50.77 Mb /usr/lib/evolution/evolution
    50.53 Mb /usr/lib/gnome
    50.45 Mb /usr/lib/gvfs/gvfs
    50.36 Mb /usr/lib/packagekit/packagekitd 
    50.14 Mb /usr/lib/gvfs/gvfs
    48.95 Mb /usr/bin/Xwayland :1024 
    46.21 Mb /usr/bin/gnome
    42.43 Mb /usr/bin/zeitgeist
    42.29 Mb /usr/lib/gnome
    41.97 Mb /usr/lib/gnome
    41.64 Mb /usr/lib/gvfs/gvfsd
    41.63 Mb /usr/lib/gvfs/gvfsd
    41.55 Mb /usr/lib/gvfs/gvfsd
    41.48 Mb /usr/lib/gvfs/gvfsd
    39.87 Mb /usr/bin/python /usr/bin/chrome
    37.45 Mb /usr/lib/xorg/Xorg vt2 
    36.62 Mb /usr/sbin/NetworkManager 
    35.63 Mb /usr/lib/caribou/caribou 
    34.79 Mb /usr/lib/tracker/tracker
    33.88 Mb /usr/sbin/ModemManager 
    33.77 Mb /usr/lib/gnome
    33.61 Mb /usr/lib/upower/upowerd 
    33.53 Mb /usr/sbin/gdm3 
    33.37 Mb /usr/lib/gvfs/gvfsd
    33.36 Mb /usr/lib/gvfs/gvfs
    33.23 Mb /usr/lib/gvfs/gvfs
    33.15 Mb /usr/lib/at
    33.15 Mb /usr/lib/at
    30.03 Mb /usr/lib/colord/colord 
    29.62 Mb /usr/lib/apt/methods/https 
    28.06 Mb /usr/lib/zeitgeist/zeitgeist
    27.29 Mb /usr/lib/policykit
    25.55 Mb /usr/lib/gvfs/gvfs
    25.55 Mb /usr/lib/gvfs/gvfs
    25.23 Mb /usr/lib/accountsservice/accounts
    25.18 Mb /usr/lib/gvfs/gvfsd 
    25.15 Mb /usr/lib/gvfs/gvfs
    25.15 Mb /usr/lib/gvfs/gvfs
    25.12 Mb /usr/lib/gvfs/gvfs
    25.10 Mb /usr/lib/gnome
    25.10 Mb /usr/lib/gnome
    25.07 Mb /usr/lib/gvfs/gvfsd 
    24.99 Mb /usr/lib/gvfs/gvfs
    23.26 Mb /usr/lib/chromium/chromium 
    22.09 Mb /usr/bin/pulseaudio 
    19.01 Mb /usr/bin/pulseaudio 
    18.62 Mb (sd
    18.46 Mb (sd
    18.30 Mb /sbin/init 
    18.17 Mb /usr/sbin/rsyslogd 
    17.50 Mb gdm
    17.42 Mb gdm
    17.09 Mb /usr/lib/dconf/dconf
    17.09 Mb /usr/lib/at
    17.06 Mb /usr/lib/gvfs/gvfsd
    16.98 Mb /usr/lib/at
    16.91 Mb /usr/lib/gdm3/gdm
    16.86 Mb /usr/lib/gvfs/gvfsd
    16.86 Mb /usr/lib/gdm3/gdm
    16.85 Mb /usr/lib/dconf/dconf
    16.85 Mb /usr/lib/dconf/dconf
    16.73 Mb /usr/lib/rtkit/rtkit
    16.69 Mb /lib/systemd/systemd
    13.13 Mb /usr/lib/chromium/chromium 
    13.13 Mb /usr/lib/chromium/chromium 
    10.92 Mb anydesk 
     8.54 Mb /sbin/lvmetad 
     7.43 Mb /usr/sbin/apache2 
     6.82 Mb /usr/sbin/apache2 
     6.77 Mb /usr/sbin/apache2 
     6.73 Mb /usr/sbin/apache2 
     6.66 Mb /usr/sbin/apache2 
     6.64 Mb /usr/sbin/apache2 
     6.63 Mb /usr/sbin/apache2 
     6.62 Mb /usr/sbin/apache2 
     6.51 Mb /usr/sbin/apache2 
     6.25 Mb /usr/sbin/apache2 
     6.22 Mb /usr/sbin/apache2 
     3.92 Mb bash 
     3.14 Mb bash 
     2.97 Mb bash 
     2.95 Mb bash 
     2.93 Mb bash 
     2.91 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.84 Mb bash 
     2.84 Mb bash 
     2.45 Mb /lib/systemd/systemd
     2.30 Mb (sd
     2.28 Mb /usr/bin/dbus
     1.84 Mb /usr/bin/dbus
     1.46 Mb ps 
     1.21 Mb openvpn hackthebox.ovpn 
     1.16 Mb /sbin/dhclient 
     1.16 Mb /sbin/dhclient 
     1.09 Mb /lib/systemd/systemd 
     0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data 
     0.97 Mb /lib/systemd/systemd 
     0.96 Mb /lib/systemd/systemd 
     0.89 Mb /usr/sbin/smartd 
     0.77 Mb /usr/bin/dbus
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.74 Mb /usr/bin/dbus
     0.71 Mb /usr/lib/apt/methods/http 
     0.68 Mb /bin/bash /usr/bin/mysqld_safe 
     0.68 Mb /sbin/wpa_supplicant 
     0.66 Mb /usr/bin/dbus
     0.61 Mb /lib/systemd/systemd
     0.54 Mb /usr/bin/dbus
     0.46 Mb /usr/sbin/cron 
     0.45 Mb /usr/sbin/irqbalance 
     0.43 Mb logger 
     0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" } 
     0.40 Mb /usr/bin/ssh
     0.34 Mb /usr/lib/chromium/chrome
     0.32 Mb cut 
     0.32 Mb cut 
     0.00 Mb [kthreadd] 
     0.00 Mb [ksoftirqd/0] 
     0.00 Mb [kworker/0:0H] 
     0.00 Mb [rcu_sched] 
     0.00 Mb [rcu_bh] 
     0.00 Mb [migration/0] 
     0.00 Mb [lru
     0.00 Mb [watchdog/0] 
     0.00 Mb [cpuhp/0] 
     0.00 Mb [cpuhp/1] 
     0.00 Mb [watchdog/1] 
     0.00 Mb [migration/1] 
     0.00 Mb [ksoftirqd/1] 
     0.00 Mb [kworker/1:0H] 
     0.00 Mb [cpuhp/2] 
     0.00 Mb [watchdog/2] 
     0.00 Mb [migration/2] 
     0.00 Mb [ksoftirqd/2] 
     0.00 Mb [kworker/2:0H] 
     0.00 Mb [cpuhp/3] 
     0.00 Mb [watchdog/3] 
     0.00 Mb [migration/3] 
     0.00 Mb [ksoftirqd/3] 
     0.00 Mb [kworker/3:0H] 
     0.00 Mb [kdevtmpfs] 
     0.00 Mb [netns] 
     0.00 Mb [khungtaskd] 
     0.00 Mb [oom_reaper] 
     0.00 Mb [writeback] 
     0.00 Mb [kcompactd0] 
     0.00 Mb [ksmd] 
     0.00 Mb [khugepaged] 
     0.00 Mb [crypto] 
     0.00 Mb [kintegrityd] 
     0.00 Mb [bioset] 
     0.00 Mb [kblockd] 
     0.00 Mb [devfreq_wq] 
     0.00 Mb [watchdogd] 
     0.00 Mb [kswapd0] 
     0.00 Mb [vmstat] 
     0.00 Mb [kthrotld] 
     0.00 Mb [ipv6_addrconf] 
     0.00 Mb [acpi_thermal_pm] 
     0.00 Mb [ata_sff] 
     0.00 Mb [scsi_eh_0] 
     0.00 Mb [scsi_tmf_0] 
     0.00 Mb [scsi_eh_1] 
     0.00 Mb [scsi_tmf_1] 
     0.00 Mb [scsi_eh_2] 
     0.00 Mb [scsi_tmf_2] 
     0.00 Mb [scsi_eh_3] 
     0.00 Mb [scsi_tmf_3] 
     0.00 Mb [scsi_eh_4] 
     0.00 Mb [scsi_tmf_4] 
     0.00 Mb [scsi_eh_5] 
     0.00 Mb [scsi_tmf_5] 
     0.00 Mb [bioset] 
     0.00 Mb [kworker/1:1H] 
     0.00 Mb [kworker/3:1H] 
     0.00 Mb [kworker/0:1H] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [jbd2/sda5
     0.00 Mb [ext4
     0.00 Mb [kworker/2:1H] 
     0.00 Mb [kauditd] 
     0.00 Mb [bioset] 
     0.00 Mb [drbd
     0.00 Mb [irq/27
     0.00 Mb [i915/signal:0] 
     0.00 Mb [i915/signal:1] 
     0.00 Mb [i915/signal:2] 
     0.00 Mb [ttm_swap] 
     0.00 Mb [cfg80211] 
     0.00 Mb [kworker/u17:0] 
     0.00 Mb [hci0] 
     0.00 Mb [hci0] 
     0.00 Mb [kworker/u17:1] 
     0.00 Mb [iprt
     0.00 Mb [iprt
     0.00 Mb [kworker/1:0] 
     0.00 Mb [kworker/3:0] 
     0.00 Mb [kworker/0:0] 
     0.00 Mb [kworker/2:0] 
     0.00 Mb [kworker/u16:0] 
     0.00 Mb [kworker/u16:2] 
     0.00 Mb [kworker/3:2] 
     0.00 Mb [kworker/2:1] 
     0.00 Mb [kworker/1:2] 
     0.00 Mb [kworker/0:2] 
     0.00 Mb [kworker/2:2] 
     0.00 Mb [kworker/0:1] 
     0.00 Mb [scsi_eh_6] 
     0.00 Mb [scsi_tmf_6] 
     0.00 Mb [usb
     0.00 Mb [bioset] 
     0.00 Mb [kworker/3:1] 
     0.00 Mb [kworker/u16:1] 

1
Bất kỳ cách nào để lọc danh sách để chỉ có các quy trình sử dụng nhiều hơn 25% bộ nhớ trong 30 giây? Tôi đang cố gắng xem các tiến trình đang chạy, như trình duyệt Chrome khi sử dụng trình gỡ lỗi PHPEclipse.
Stephane

bộ lọc đó sẽ rất tuyệt
aleix

1
Tôi sẽ đăng nó ngay khi tôi có thể.
Lokendra Singh Rawat

2
Tuyệt quá! Nhưng vòng lặp nên bắt đầu từ x=2pid đầu ra và người dùng.
Boris Brodski

70

Thế còn time ?

Không phải là nội dung Bashtime mà là cái bạn có thể tìm thấy which time, ví dụ/usr/bin/time

Đây là những gì nó bao gồm, trên một đơn giản ls:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
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:00.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): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Tôi cũng. Đó là cách tôi sử dụng để lập hồ sơ các tác vụ trong powercron.eu :)
Moonchild

5
brew install gnu-timesau đó sử dụng gtimenếu bạn đang dùng macOS
Nobu

4
Nhược điểm: Sẽ không nhận được kết quả cho đến khi quá trình hoàn thành việc thực hiện. Không thể được sử dụng để theo dõi thời gian thực của quá trình chạy.
Makesh

/ usr / bin / time -f '% M'
infomaniac

1
Bạn cũng có thể gọi nó bằng \ time (với dấu gạch chéo ngược để ngăn sử dụng thời gian bên trong của shell).
Raúl Salinas-Monteagudo

39

Đây là một bản tóm tắt tuyệt vời về các công cụ và vấn đề: link.org.org

Tôi sẽ trích dẫn nó, để nhiều nhà phát triển thực sự sẽ đọc nó.

Nếu bạn muốn phân tích việc sử dụng bộ nhớ của toàn bộ hệ thống hoặc để phân tích kỹ lưỡng việc sử dụng bộ nhớ của một ứng dụng (không chỉ sử dụng heap của nó), hãy sử dụng exmap . Để phân tích toàn bộ hệ thống, tìm các quy trình có mức sử dụng hiệu quả cao nhất, chúng chiếm nhiều bộ nhớ nhất trong thực tế, tìm các quy trình có mức sử dụng cao nhất, chúng tạo ra nhiều dữ liệu nhất (và do đó có thể bị rò rỉ hoặc rất không hiệu quả trong việc sử dụng dữ liệu của chúng). Chọn ứng dụng đó và phân tích ánh xạ của nó trong listview thứ hai. Xem phần exmap để biết thêm chi tiết. Cũng sử dụng xrestop để kiểm tra mức sử dụng cao của tài nguyên X, đặc biệt nếu quá trình máy chủ X chiếm nhiều bộ nhớ. Xem phần xrestop để biết chi tiết.

Nếu bạn muốn phát hiện rò rỉ, hãy sử dụng valgrind hoặc có thể là kmtrace .

Nếu bạn muốn phân tích việc sử dụng heap (malloc, v.v.) của ứng dụng, hãy chạy nó trong memprof hoặc với kmtrace , lập hồ sơ cho ứng dụng và tìm kiếm cây gọi hàm để phân bổ lớn nhất. Xem phần của họ để biết thêm chi tiết.


28

Bên cạnh các giải pháp được liệt kê trong câu trả lời của bạn, bạn có thể sử dụng lệnh Linux "top"; Nó cung cấp chế độ xem thời gian thực động của hệ thống đang chạy, nó cung cấp mức sử dụng CPU và Bộ nhớ cho toàn bộ hệ thống cùng với mọi chương trình, theo tỷ lệ phần trăm:

top

để lọc theo pid chương trình:

top -p <PID>

để lọc theo tên chương trình:

top | grep <PROCESS NAME>

"top" cũng cung cấp một số trường như:

VIRT - Ảnh ảo (kb): Tổng dung lượng bộ nhớ ảo được sử dụng bởi tác vụ

RES - Kích thước thường trú (kb): Bộ nhớ vật lý không tráo đổi mà một tác vụ đã sử dụng; RES = MÃ + SỐ LIỆU.

DATA - Dữ liệu + Kích thước ngăn xếp (kb): Lượng bộ nhớ vật lý dành cho ngoài mã thực thi, còn được gọi là kích thước 'tập dữ liệu thường trú' hoặc DRS.

SHR - Kích thước Mem được chia sẻ (kb): Lượng bộ nhớ chia sẻ được sử dụng bởi một tác vụ. Nó chỉ đơn giản phản ánh bộ nhớ có thể được chia sẻ với các quá trình khác.

Tham khảo tại đây .


20

Không có câu trả lời nào cho việc này vì bạn không thể xác định chính xác dung lượng bộ nhớ mà một quá trình sử dụng. Hầu hết các quy trình trong linux sử dụng các thư viện chia sẻ. Chẳng hạn, giả sử bạn muốn tính toán mức sử dụng bộ nhớ cho quy trình 'ls'. Bạn có chỉ đếm bộ nhớ được sử dụng bởi 'ls' thực thi (nếu bạn có thể cô lập nó)? Làm thế nào về libc? Hoặc tất cả các lib khác được yêu cầu để chạy 'ls'?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

Bạn có thể lập luận rằng chúng được chia sẻ bởi các quy trình khác, nhưng 'chúng ta không thể chạy trên hệ thống mà không được tải.

Ngoài ra, nếu bạn cần biết một quy trình cần bao nhiêu bộ nhớ để lập kế hoạch dung lượng, bạn phải tính toán mỗi bản sao bổ sung của quy trình sử dụng bao nhiêu. Tôi nghĩ / Proc / PID / status có thể cung cấp cho bạn đủ thông tin về việc sử dụng bộ nhớ AT một lần. Mặt khác, valgrind sẽ cung cấp cho bạn một cấu hình tốt hơn về việc sử dụng bộ nhớ trong suốt vòng đời của chương trình


Tôi đang cố gắng tìm ra bao nhiêu bộ nhớ mà một quá trình sử dụng VM và muốn sử dụng nó để thiết lập giới hạn bộ nhớ trong kubernetes, tôi đồng ý với câu trả lời này, vì vậy sẽ sử dụng bộ nhớ được hiển thị bởipmap
Deepak Deore

16

Nếu mã của bạn ở dạng C hoặc C ++, bạn có thể sử dụng getrusage()để trả về cho bạn các số liệu thống kê khác nhau về bộ nhớ và thời gian sử dụng quy trình của bạn.

Không phải tất cả các nền tảng đều hỗ trợ điều này và sẽ trả về 0 giá trị cho các tùy chọn sử dụng bộ nhớ.

Thay vào đó, bạn có thể xem tệp ảo được tạo trong /proc/[pid]/statm(nơi [pid]được thay thế bằng id tiến trình của bạn. Bạn có thể lấy tệp này từgetpid() ).

Tệp này sẽ trông giống như một tệp văn bản với 7 số nguyên. Bạn có thể quan tâm nhất đến các số đầu tiên (tất cả sử dụng bộ nhớ) và thứ sáu (sử dụng bộ nhớ dữ liệu) trong tệp này.


Lưu ý rằng điều này không được hỗ trợ trên tất cả các nền tảng.
CashCow

Theo trang man Linux ( linux.die.net/man/2/getrusage ), getrusage là một phần của thông số kỹ thuật SVr4, 4.3BSD và POSIX.1-2001 (lưu ý rằng POSIX chỉ chỉ định các trường utime và stime.) I sẽ không mong đợi nó hoạt động trên các nền tảng phi UNIX (ngoại trừ, có lẽ, thông qua một môi trường như Cygwin cung cấp các khả năng UNIX cho các nền tảng khác.)
David C.

@DavidC. OP đang hỏi về Linux.
Alexis Wilke

@CashCow, ý bạn là vậy getpid(), vì tôi không biết getprocessid()chức năng trong C / C ++ trong Linux.
Alexis Wilke

12

Valgrind có thể hiển thị thông tin chi tiết nhưng nó làm chậm ứng dụng mục tiêu một cách đáng kể và hầu hết thời gian nó thay đổi hành vi của ứng dụng.
Exmap là điều tôi chưa biết, nhưng có vẻ như bạn cần một mô-đun hạt nhân để có được thông tin, đây có thể là một trở ngại.

Tôi giả sử những gì mọi người muốn biết "sử dụng bộ nhớ" của WRT là như sau ...
Trong linux, lượng bộ nhớ vật lý mà một quá trình có thể sử dụng có thể được chia thành các loại sau.

  • Ma nhớ bản đồ ẩn danh

    • .p riêng tư
      • .d bẩn == malloc / mmapped heap và ngăn xếp được phân bổ và bộ nhớ bằng văn bản
      • .c sạch == malloc / mmaps heap và stack memory sau khi được phân bổ, ghi, sau đó được giải phóng, nhưng chưa được thu hồi
    • .s đã chia sẻ
      • .d bẩn == malloc / mmoped heap có thể nhận bản sao khi ghi và chia sẻ giữa các quy trình (được chỉnh sửa)
      • .c clean == malloc / mmoped heap có thể nhận được bản sao khi ghi và chia sẻ giữa các quy trình (được chỉnh sửa)
  • Mn đặt tên cho bộ nhớ ánh xạ

    • .p riêng tư
      • .d bẩn == tập tin mmapped bộ nhớ viết riêng tư
      • .c sạch == ánh xạ chương trình / thư viện văn bản riêng
    • .s đã chia sẻ
      • .d bẩn == tập tin mmapped bộ nhớ được chia sẻ
      • .c sạch == ánh xạ văn bản thư viện chia sẻ ánh xạ

Tiện ích có trong Android có tên là showmap khá hữu ích

virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL

10

Thêm ba phương pháp để thử:

  1. ps aux --sort pmem
    Nó sắp xếp đầu ra theo %MEM.
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    Nó sắp xếp bằng cách sử dụng đường ống.
  3. top -a
    Nó bắt đầu phân loại hàng đầu bởi %MEM

(Trích từ đây )


2
topvà có lẽ những người khác không đưa ra một đại diện chính xác của bộ nhớ thực sự được sử dụng bởi quá trình. Ví dụ: tôi có 64GiB RAM và tôi có 10 postgresquy trình mỗi báo cáo 16GiB RES và 25% MEM. Tất nhiên, tất cả họ không thể sử dụng 25% ... Mỗi người cũng có 15GiB SHR và dường như họ đang chia sẻ điều đó.
sudo

8
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'\n'

for line in $(</proc/$1/smaps)
do
   [[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb

5
ksh là một vỏ tiêu chuẩn. Nó có thể không được cài đặt theo mặc định trên các bản phân phối linux cho người dùng máy tính để bàn hoặc cho các mục đích tối giản, nhưng nó chỉ là một lệnh trong hầu hết mọi hệ điều hành unix- / linux. (tức là trên tất cả các BSD, trên tất cả UNIX thực, trên RHEL, trên SLES, trên Debian, trên Ubuntu, trên OSX)
Florian Heigl

Tập tin này có thể truy cập, theo mặc định, chỉ cho người dùng root.
Dmitry Ginzburg

Sau đây chỉ là phần được viết lại sed | awkvà hoạt động trong Busybox v1.23.2: sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Ján Sáreník

1
@Catskul - Tiêu chuẩn POSIX chỉ định lớp vỏ tiêu chuẩn của nó là một tập hợp con nghiêm ngặt của vỏ Korn, một phiên bản nâng cao của vỏ Bourne.
ceph3us

8

Tôi đang sử dụng htop; Đây là một chương trình điều khiển rất tốt tương tự như Windows Task Manager.


Tôi đã sử dụng htopvà tốt hơn so với đầu nhưng nó vẫn sẽ hiển thị cho bạn tất cả các chuỗi từ các ứng dụng khác nhau mà không nhóm chúng làm cho nó gần như vô dụng như trên.
sorin

1
$ htop -p $ (pgrep <tên quy trình của bạn> | xargs | tr '' ',')
Câu lạc bộ AAAfarm

6

Nếu quá trình không sử dụng quá nhiều bộ nhớ (vì bạn cho rằng đây là trường hợp hoặc một số lệnh khác đã đưa ra dấu hiệu ban đầu này) và quá trình có thể chịu được việc dừng lại trong một khoảng thời gian ngắn, bạn có thể thử sử dụng lệnh gcore.

gcore <pid>

Kiểm tra kích thước của tệp lõi được tạo để biết được một bộ nhớ cụ thể đang sử dụng bao nhiêu bộ nhớ.

Điều này sẽ không hoạt động tốt nếu quá trình sử dụng hàng trăm megs hoặc hợp đồng biểu diễn, vì thế hệ lõi có thể mất vài giây hoặc vài phút để được tạo tùy thuộc vào hiệu suất I / O. Trong quá trình tạo lõi, quá trình được dừng lại (hoặc "đóng băng") để ngăn thay đổi bộ nhớ. Vì vậy, hãy cẩn thận.

Ngoài ra, hãy đảm bảo điểm gắn kết nơi lõi được tạo có nhiều dung lượng đĩa và hệ thống sẽ không phản ứng tiêu cực với tệp lõi được tạo trong thư mục cụ thể đó.


6

Tôi đang sử dụng Arch Linux và có gói tuyệt vời này được gọi là ps_mem

ps_mem -p <pid>

Ví dụ đầu ra

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================

5

Dòng lệnh bên dưới sẽ cung cấp cho bạn tổng bộ nhớ được sử dụng bởi quy trình khác nhau đang chạy trên máy Linux tính bằng MB

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

5

Một thử nghiệm tốt về việc sử dụng "thế giới thực" hơn là mở ứng dụng, sau đó chạy vmstat -svà kiểm tra thống kê "bộ nhớ hoạt động". Đóng ứng dụng, đợi vài giây và chạy vmstat -slại. Tuy nhiên, nhiều bộ nhớ hoạt động đã được giải phóng rõ ràng là ứng dụng được sử dụng.


3
Làm thế nào điều này sẽ tốt hơn ps ?? Nó đi kèm với tất cả các giới hạn của ps và thậm chí còn không chính xác hơn ...
Lester Cheung

Một hệ thống Unix điển hình có nhiều quá trình bắt đầu và hoàn thiện mọi lúc. Bạn không thể dự đoán RAM miễn phí của bạn.
Raúl Salinas-Monteagudo

4

Nhận valgrind. cung cấp cho chương trình của bạn để chạy và nó sẽ cho bạn biết nhiều về việc sử dụng bộ nhớ của nó.

Điều này sẽ chỉ áp dụng cho trường hợp chương trình chạy một thời gian và dừng lại. Tôi không biết liệu valgrind có thể bắt tay vào một quy trình đã chạy hay không nên dừng các quy trình như daemon.


Không, không thể "đính kèm" valgrind vào một quy trình đang chạy. Đó là do thiết kế.
Dima Tisnek

3

Chỉnh sửa: điều này chỉ hoạt động tốt 100% khi mức tiêu thụ bộ nhớ tăng

Nếu bạn muốn theo dõi việc sử dụng bộ nhớ theo quy trình nhất định (hoặc nhóm chia sẻ tên chung được xử lý, ví dụ: google-chromebạn có thể sử dụng tập lệnh bash của tôi:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

điều này sẽ liên tục tìm kiếm các thay đổi và in chúng.

nhập mô tả hình ảnh ở đây


3

Nếu bạn muốn một cái gì đó nhanh hơn so với hồ sơ với Valgrind và hạt nhân của bạn đã cũ hơn và bạn không thể sử dụng smaps, một ps với các tùy chọn để hiển thị tập hợp quy trình (với ps -o rss,command) có thể cung cấp cho bạn nhanh chóng và hợp lý _aproximation_số lượng thực bộ nhớ không tráo đổi đang được sử dụng.


3

Tôi sẽ đề nghị bạn sử dụng trên đỉnh. Bạn có thể tìm thấy mọi thứ về nó trên trang này . Nó có khả năng cung cấp tất cả KPI cần thiết cho các quy trình của bạn và nó cũng có thể chụp vào một tệp.


2
Để hiển thị PSIZE ["kích thước bộ nhớ tỷ lệ của quá trình này (hoặc người dùng)] khởi chạy trên đỉnh bằng cách sử dụng atop -R. Để hiển thị một lần đẩy tóm tắt cho mỗi người dùng p, sắp xếp theo cách sử dụng bộ nhớ đẩy 'M' từ bên trong trên đỉnh. Điều này cho các số tương tự như smem.
Markus Strauss


1

Một phiếu khác cho ở đây, nhưng tôi muốn thêm rằng bạn có thể sử dụng một công cụ như Alleyoop để giúp bạn diễn giải các kết quả được tạo bởi valgrind.

Tôi sử dụng hai công cụ mọi lúc và luôn có mã nạc, không bị rò rỉ để tự hào hiển thị cho nó;)


1

Trong khi câu hỏi này dường như là về việc kiểm tra các quy trình hiện đang chạy, tôi muốn xem bộ nhớ tối đa được sử dụng bởi một ứng dụng từ đầu đến cuối. Bên cạnh valgrind, bạn có thể sử dụng tstime , đơn giản hơn nhiều. Nó đo mức sử dụng bộ nhớ "nước cao" (RSS và ảo). Từ câu trả lời này .


Hầu hết các ứng dụng - nghĩa là, những ứng dụng sử dụng thư viện bộ nhớ giống malloc () và malloc - không trả lại các trang cho HĐH cho đến khi chấm dứt. Vì vậy, số tiền bạn thấy với PS (hoặc bất kỳ công cụ nào khác không đào sâu vào đống quá trình) sẽ là dấu hiệu nước cao.
David C.

0

Dựa trên câu trả lời cho một câu hỏi liên quan .

Bạn có thể sử dụng SNMP để sử dụng bộ nhớ và cpu của một tiến trình trong một thiết bị cụ thể trong mạng :)

Yêu cầu:

  • thiết bị đang chạy quá trình nên cài đặt và chạy snmp
  • snmp nên được cấu hình để chấp nhận các yêu cầu từ nơi bạn sẽ chạy tập lệnh bên dưới (nó có thể được cấu hình trong snmpd.conf)
  • bạn nên biết id quá trình (pid) của quá trình bạn muốn theo dõi

Ghi chú:

  • HOST-TÀI NGUYÊN-MIB :: hrSWRunPerfCPU là số phần trăm giây của tổng tài nguyên CPU của hệ thống được tiêu thụ bởi quá trình này. Lưu ý rằng trên hệ thống đa bộ xử lý, giá trị này có thể tăng hơn một phần trăm giây trong một phần trăm giây của thời gian thực (đồng hồ treo tường).

  • HOST-TÀI NGUYÊN-MIB :: hrSWRunPerfMem là tổng số lượng bộ nhớ hệ thống thực được phân bổ cho quá trình này.

**

Kịch bản giám sát quá trình:

**

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done

0

/ prox / xxx / numa_maps cung cấp một số thông tin ở đó: N0 = ??? N1 = ???. Nhưng kết quả này có thể thấp hơn kết quả thực tế, vì nó chỉ tính những người đã chạm vào.


-1

Sử dụng công cụ GUI ' giám sát hệ thống ' tích hợp sẵn có trong Ubuntu


1
Ít nhất kể từ 16.04 hoạt động rất tốt. Mặc dù nó rất giống với đỉnh, bộ nhớ được sử dụng không phải là cực kỳ chính xác ...
Alexis Wilke
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.