Ứng dụng này sử dụng bao nhiêu RAM?


10

Nếu tôi chạy top -choặc htoptôi nhận được các quy trình với mức tiêu thụ bộ nhớ của họ, nhưng đó không phải là điều tôi muốn thấy.

Có một dòng lệnh cho phép xem mức tiêu thụ RAM của một ứng dụng nhất định không?

Ví dụ, tôi muốn xem mức tiêu thụ RAM của máy chủ web Apache (không phải bằng cách kiểm tra tất cả các quy trình mà nó chạy, thay vào đó)

ram 


Cảm ơn. Điều tốt nhất tôi có thể tìm thấy trong đó là mức tiêu thụ bộ nhớ theo quy trình, thứ mà top -c đã mang lại cho tôi

Câu trả lời:


4

Có một lời giải thích chi tiết rất hay ở đây: https://bloss.kde.org/2005/09/15/measuring-memory-usage

Nhưng về cơ bản: Bạn phải thực sự đào sâu và hiểu cách ứng dụng được thiết lập.

Vì vậy, ví dụ, nhìn vào mysql:

  PID  PPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                    
 6004 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:40.33 mysqld                                                                                                                                            
16115 16085 composit  20   0 37900  27m 2908 S    0  0.2   0:00.37 mysqld                                                                                                                                            
16116 16115 composit  20   0 37900  27m 2908 S    0  0.2   2:07.34 mysqld                                                                                                                                            
16117 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.00 mysqld                                                                                                                                            
16118 16116 composit  20   0 37900  27m 2908 S    0  0.2   3:19.79 mysqld                                                                                                                                            
16119 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.01 mysqld                                                                                                                                            
16120 16116 composit  20   0 37900  27m 2908 S    0  0.2   5:31.09 mysqld                                                                                                                                            
16121 16116 composit  20   0 37900  27m 2908 S    0  0.2  14:19.53 mysqld                                                                                                                                            
16122 16116 composit  20   0 37900  27m 2908 S    0  0.2  36:13.67 mysqld                                                                                                                                            
16123 16116 composit  20   0 37900  27m 2908 S    0  0.2  30:30.64 mysqld                                                                                                                                            
16124 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.15 mysqld                                                                                                                                            
16493 16116 composit  20   0 37900  27m 2908 S    0  0.2   0:00.00 mysqld    

Tổng bộ nhớ được sử dụng là khoảng 25 MB (Lấy 27 MB RES và trừ đi chia sẻ (SHR))

Tôi đã xác thực điều này bằng cách kiểm tra tổng mức sử dụng bộ nhớ (miễn phí -m, + / bộ đệm / bộ đệm) trước và sau khi phát hành "killall mysqld". Sau khi giết tất cả các quy trình mysqld, mức sử dụng bộ nhớ giảm 25 MB theo "free -m".

Nếu bạn thấy rằng mỗi quy trình có các cột VIRT, RES và SHR giống hệt nhau, thì chúng có thể chỉ là các luồng của cùng một quy trình. (Các thư viện Linux cũ hơn đã xử lý luồng bằng cách sinh ra nhiều tiến trình thực sự chiếm cùng một bộ nhớ)

Nếu chúng khác nhau, bạn có thể ước tính nó bằng cách thực hiện SUM của (RES - SHR). Nhưng điều đó chỉ hoạt động nếu các quy trình trong thực tế là các quy trình riêng biệt và không chỉ là các luồng của cùng một quy trình. Nhìn vào PPID (ID quy trình phụ huynh) cũng có ích. Nếu tất cả họ có cùng cha mẹ, họ có thể chỉ là chủ đề (Mặc dù không nhất thiết).

Thật không may, không có cách nào thực sự dễ dàng để trả lời điều này trong Linux. Cách dễ dàng duy nhất là kiểm tra "miễn phí" ngay lập tức trước khi kết thúc quá trình và kiểm tra lại ngay sau đó. nhìn vào dòng "- / + bộ đệm / bộ đệm:" và xem mức độ sử dụng bộ nhớ giảm và điều đó sẽ cho bạn biết nó đã sử dụng bao nhiêu.


2

Với một chút giúp đỡ từ man pscâu trả lời tuyệt vời này ...

ps -up $(pidof PROCESS_NAME)

Ví dụ:

[wilf@comp ~]$ ps -up $(pidof firefox)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
wilf      1619  8.9  5.6 1464216 342396 ?      Sl   17:56   1:36 /usr/lib64/firefox/firefox
[wilf@comp ~]$ 

Những cách khác:

cat /proc/$(pidof firefox)/status | grep VmSize

Điều này có thể chạy mà không cần -xtail -1:

pmap -x $(pidof firefox) | tail -1

chỉ hiển thị phần trăm:

top -p $(pidof firefox)

Ngoài ra, trong khi sử dụng, topbạn có thể nhấn iđể bỏ qua các quá trình nhàn rỗi / zombie để dễ đọc hơn: sản lượng hàng đầu nhỏ hơn nhiều


nhưng một ứng dụng khởi chạy một số quy trình, làm thế nào tôi có thể biết cái nào là chính?

phỏng đoán? tôi nghĩ pmapcho thấy rất nhiều thứ về tài nguyên mà PID đang sử dụng. Thông tin được cung cấp dựa trên tên của quy trình và PID được tìm thấy từ nó bằng cách sử dụng pidof, vì vậy quy trình chính được hiển thị nếu bất kỳ tên nào bạn cung cấp (tôi nghĩ, không biết liệu nó có liên quan đến các quy trình cha hay không)
Wilf

2
Điều này phân tách đầu ra theo quy trình. Bạn sẽ không nhận được tổng số bộ nhớ được sử dụng bởi tất cả các quy trình Apache theo cách này. Bạn cần tổng hợp, nhưng chỉ tính các vùng được chia sẻ một lần (đây là bit khó).
Gilles 'SO- ngừng trở nên xấu xa'
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.