Làm thế nào để xem các quá trình hàng đầu được sắp xếp theo sử dụng bộ nhớ thực tế?


240

Tôi có một máy chủ với 12G bộ nhớ. Một mảnh trên cùng được hiển thị dưới đây:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

Các free -mchương trình sau đây:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

Nếu tôi hiểu chính xác, hệ thống chỉ có 362 MB bộ nhớ khả dụng. Câu hỏi của tôi là: Làm thế nào tôi có thể tìm ra quá trình nào đang chiếm phần lớn bộ nhớ?

Cũng như thông tin cơ bản, hệ thống đang chạy 64bit OpenSuse 12.


Câu trả lời:


280

Đầu tiên, lặp lại câu thần chú này một chút: "bộ nhớ không sử dụng là bộ nhớ lãng phí". Nhân Linux giữ khoảng một lượng lớn siêu dữ liệu tệp và các tệp được yêu cầu, cho đến khi thứ gì đó có vẻ quan trọng hơn sẽ đẩy dữ liệu đó ra. Đó là lý do tại sao bạn có thể chạy:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

và có phiên bản thứ hai findchạy với tốc độ vô lý.

Linux chỉ để lại một chút bộ nhớ 'miễn phí' để xử lý các đột biến trong việc sử dụng bộ nhớ mà không cần quá nhiều nỗ lực.

Thứ hai, bạn muốn tìm các quá trình đang ăn tất cả bộ nhớ của bạn; trong topsử dụng Mlệnh để sắp xếp theo sử dụng bộ nhớ. Hãy bỏ qua VIRTcột, nó chỉ cho bạn biết bao nhiêu bộ nhớ ảo đã được phân bổ, chứ không phải bao nhiêu bộ nhớ mà quá trình đang sử dụng. RESbáo cáo bao nhiêu bộ nhớ là thường trú , hoặc đang trong ram (như trái ngược với hoán đổi vào đĩa hoặc không bao giờ thực sự được phân bổ ở nơi đầu tiên, dù đã được yêu cầu).

Nhưng, vì RESsẽ tính ví dụ /lib/libc.so.6bộ nhớ một lần cho gần như mọi quy trình, nên nó không chính xác là thước đo tuyệt vời cho việc sử dụng bao nhiêu bộ nhớ. Các SHRbáo cáo cột bao nhiêu bộ nhớ được chia sẻ với các quá trình khác, nhưng không có sự đảm bảo rằng quá trình khác là thực sự chia sẻ - nó có thể là thể chia sẻ, chỉ cần không ai mong muốn khác để chia sẻ.

Công smemcụ này được thiết kế để giúp người dùng đo tốt hơn bao nhiêu bộ nhớ thực sự nên bị đổ lỗi cho mỗi quy trình riêng lẻ. Nó thực hiện một số công việc thông minh để tìm ra cái gì thực sự độc đáo, cái gì được chia sẻ và cân đối tỷ lệ bộ nhớ được chia sẻ với các quy trình chia sẻ nó. smemcó thể giúp bạn hiểu trí nhớ của bạn sẽ tốt hơn nơi nào top, nhưng toplà một công cụ đầu tiên tuyệt vời.


Vì vậy, nếu chỉ giảm số liệu thống kê cột "miễn phí", top hiển thị không có gì khác, chúng ta có thể kết luận bộ nhớ được cấp phát bởi kernel linux để lưu trữ các tập tin và sẽ cung cấp bộ nhớ cho các tiến trình khác khi không cần thiết?
Al2O3

@Rubby, điều đó có lẽ đúng; các /proc/meminfo/proc/slabinfocác file cụ thể những gì hạt nhân đang sử dụng lưu trữ cho - các slabtopchương trình rất giống top, nhưng chương trình nào trong số allocators phiến đã được phân bổ bao nhiêu, những gì tỷ lệ của họ là như thế nào, vv
sarnold

Cảm ơn mẹo về 'smem' - Tôi muốn Linux "lãng phí" một số RAM để máy của tôi có thể chạy nhanh. Nếu 'find' mất nhiều thời gian hơn trên đường chuyền thứ 2 thì không sao. Một con chuột bị kẹt và các cửa sổ đóng băng trong khi Linux quyết định RAM nào (mà nó đã bị ăn cắp một cách không cần thiết), cần phải được xóa và phân bổ lại cho những gì tôi đang làm NGAY BÂY GIỜ - hoặc thậm chí hoán đổi vào đĩa - không phải là một lựa chọn. Tôi có 16 GB ram trên hộp này và tôi hy vọng một vài GB trong số đó sẽ được giữ miễn phí và có sẵn cho các ứng dụng đang chạy.
JosephK

@JosephK, di chuyển một con chuột có liên quan nhiều hơn đến các ưu tiên và thuật toán lập lịch; nếu việc phân bổ bộ nhớ là cần thiết để di chuyển con trỏ chuột thì có vấn đề nghiêm trọng với phần mềm bạn đang sử dụng. :)
đăng

2
@JosephK Thực sự mất ít thời gian hơn để tái sử dụng bộ nhớ từ việc sử dụng này sang việc sử dụng khác so với việc đưa bộ nhớ trống vào sử dụng. Một yêu cầu đánh giá và sửa đổi danh sách miễn phí, cái còn lại thì không. Thật không may, đây là một câu hỏi XY. Vấn đề liên quan đến hiệu năng và có thể hoàn toàn không liên quan đến mức tiêu thụ bộ nhớ (mặc dù bằng chứng giúp giải phóng bộ nhớ nhiều hơn, đó có thể là lý do phức tạp hơn so với nghi ngờ của OP) nhưng thay vào đó họ hỏi về việc phân tích việc sử dụng bộ nhớ. Điều đó nhận được câu trả lời ít hữu ích hơn so với hỏi về vấn đề thực tế.
David Schwartz

321

sử dụng mẹo nhanh bằng cách sử dụng lệnh hàng đầu trong linux / unix

$ top

và sau đó nhấn Shift+ m(tức là viết hoa M).

Từ man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

Hoặc cách khác: nhấn Shift+ f, sau đó chọn màn hình để sắp xếp theo mức sử dụng bộ nhớ bằng cách nhấn phím nsau đó nhấn Enter. Bạn sẽ thấy quá trình hoạt động được sắp xếp theo cách sử dụng bộ nhớ


71
Hoặc bạn chỉ có thể nhấn M( Shift+ m)
Patryk

8
@risnandar có cách để hiển thị bộ nhớ trong MB chứ không phải%
codecowboy

2
hi codecowboy, có lẽ bạn có thể nhìn vào commandlinefu.com/commands/view/3/... cho bộ nhớ chi tiết được sử dụng trong máy chủ của tôi đang sử dụng ứng dụng của bên thứ ba như newrelic.com
risnandar

6
hoặc chỉ top -o mem -O cpu
bỏ qua

Trên Ubuntu 16, tôi cần top -o RES"tên trường không được nhận dạng '"
AdamS


28

Trước tiên, bạn nên đọc một lời giải thích về đầu ra củafree . Điểm mấu chốt: bạn có ít nhất 10,7 GB bộ nhớ có thể sử dụng được theo quy trình.

Sau đó, bạn nên xác định "sử dụng bộ nhớ" là gì cho một quá trình (nó không dễ dàng hoặc không mơ hồ, hãy tin tôi).

Sau đó, chúng tôi có thể giúp nhiều hơn :-)


Bạn lấy 10,7 từ đâu? Từ bộ đệm / bộ đệm [miễn phí]? Cảm ơn các liên kết, tôi sẽ đọc nó.
dùng3111525

3
Đúng. Điểm đáng chú ý là hầu hết bộ nhớ được sử dụng bởi bộ đệm và bộ đệm. Bộ nhớ này có thể bị "đổ" ngay lập tức nếu bất kỳ quá trình nào cần thêm bộ nhớ. Khi bạn trừ đi số lượng bộ nhớ được sử dụng cho bộ đệm / bộ đệm từ số lượng USED hoặc thêm nó vào số lượng MIỄN PHÍ, bạn sẽ nhận được các số trên dòng thứ hai, sau đó chỉ có 1,3 gig thực sự được sử dụng hoặc nhìn từ bên kia góc, bạn có bộ nhớ có sẵn 10,7 gigabyte (vì bộ đệm và bộ đệm có thể được đổ theo yêu cầu).
stolsvik

21

Liệt kê và sắp xếp các quy trình theo cách sử dụng bộ nhớ:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

7
Hoặc:ps -e -orss=,args= | sort -nr | head
kenorb

17

ps aux --sort '%mem'

từ ps của ps (mặc định trên Ubuntu 12.04) tạo đầu ra như:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

Vì vậy, Firefox là người tiêu dùng hàng đầu với 16% bộ nhớ của tôi.

Bạn cũng có thể quan tâm:

ps aux --sort '%cpu'

4

bạn có thể chỉ định cột nào sẽ được sắp xếp theo, với các bước sau:

các bước:
* hàng đầu
* thay đổi + F
* chọn một cột trong danh sách
    ví dụ n có nghĩa là sắp xếp theo bộ nhớ
* nhấn nút Enter
* đồng ý

1
Bản sao câu trả lời của risnandar ở trên.
benjaoming

3

Bạn có thể thấy việc sử dụng bộ nhớ bằng cách thực thi mã này trong thiết bị đầu cuối của mình:

$ watch -n2 free -m
$ htop

3

Cách tổng bộ nhớ đã sử dụng theo tên tiến trình:

Đôi khi, ngay cả khi nhìn vào các tiến trình đơn lớn nhất, vẫn còn rất nhiều bộ nhớ được sử dụng chưa được tính đến. Để kiểm tra xem có nhiều quá trình nhỏ hơn bằng cách sử dụng bộ nhớ hay không, bạn có thể sử dụng một lệnh như sau sử dụng awk để tổng hợp bộ nhớ được sử dụng bởi các quy trình có cùng tên:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

ví dụ đầu ra

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

Điều này rất thứ hai trong thời gian

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Cập nhật liên tục

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

Tôi cũng đã thêm một vài món quà ở đây bạn có thể đánh giá cao (hoặc bạn có thể bỏ qua)

-n 1 xem và cập nhật mỗi giây

-U $(whoami)Để chỉ hiển thị các quy trình của bạn. $ (một số lệnh) đánh giá ngay bây giờ

| head -n4 Để chỉ hiển thị tiêu đề và 3 quy trình tại một thời điểm bc, bạn chỉ cần các chi tiết đơn hàng sử dụng cao

${1-4} nói lý lẽ đầu tiên của tôi $1 tôi muốn mặc định là 4, trừ khi tôi cung cấp nó

Nếu bạn đang sử dụng máy Mac, bạn có thể cần cài đặt đồng hồ trước

brew install watch 

Ngoài ra, bạn có thể sử dụng một chức năng

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

Và bạn có thể dễ dàng sắp xếp theo cpu nếu bạn đổi -mthành-r
jasonleonhard

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.