Linux: tìm hiểu quá trình sử dụng tất cả RAM?


127

Trước khi thực sự hỏi, chỉ cần rõ ràng: có, tôi biết về bộ đệm đĩa, và không, đó không phải là trường hợp của tôi :) Xin lỗi, vì lời mở đầu này :)

Tôi đang sử dụng CentOS 5. Mọi ứng dụng trong hệ thống đều bị tráo đổi rất nhiều và hệ thống rất chậm. Khi tôi làm free -m, đây là những gì tôi nhận được:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Vì vậy, tôi thực sự chỉ có 42 Mb để sử dụng! Theo như tôi hiểu, -/+ buffers/cachethực sự không tính bộ nhớ cache của đĩa, vì vậy tôi thực sự chỉ có 42 Mb, phải không? Tôi nghĩ, tôi có thể sai, vì vậy tôi đã cố gắng tắt bộ nhớ đệm đĩa và nó không có tác dụng - hình ảnh vẫn giữ nguyên.

Vì vậy, tôi quyết định tìm ra ai đang sử dụng tất cả RAM của mình và tôi đã sử dụng topnó. Nhưng, rõ ràng, nó báo cáo rằng không có quá trình sử dụng RAM của tôi. Quá trình duy nhất trong top của tôi là MySQL, nhưng nó đang sử dụng 0,1% RAM và 400Mb trao đổi. Hình ảnh tương tự khi tôi cố chạy các dịch vụ hoặc ứng dụng khác - tất cả đều được trao đổi, topcho thấy MEM không được sử dụng (tối đa 0,1% cho bất kỳ quy trình nào).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Khởi động lại không giúp được gì, và theo cách của họ thì rất chậm, điều mà tôi thường không mong đợi ở máy này (4 lõi, RAM 4Gb, RAID1).

Vì vậy, với điều đó - tôi khá chắc chắn rằng đây không phải là bộ đệm đĩa, người đang sử dụng RAM, vì thông thường nó nên được giảm và để các quá trình khác sử dụng RAM, sau đó chuyển sang trao đổi.

Vì vậy, cuối cùng, câu hỏi là - nếu ai đó có bất kỳ ý tưởng nào để tìm ra quá trình thực sự sử dụng bộ nhớ quá nhiều?


1
Bạn đã bao giờ tìm thấy câu trả lời cho điều này?
Hackeron

@Hackeron: OP chấp nhận câu trả lời này . Tôi biết rằng câu trả lời không giải quyết câu hỏi của bạn , mặc dù. Tôi đã có thể tái tạo vấn đề của bạn trên một trong các máy chủ của mình và hiện tôi đang nghiên cứu xem có cách nào để khắc phục sự cố không.
Deltik

@Deltik À, ok. Cảm ơn bạn :) - Tôi có 2 máy chủ ở đây rò rỉ tất cả bộ nhớ khả dụng trong khoảng 12 giờ, hãy cho tôi biết nếu có bất cứ điều gì tôi có thể làm để giúp chẩn đoán điều này. Tôi có thể truy cập với biệt danh "hackeron" trên IRC (irc.freenode.org).
Hackeron

@ Hackeron: Tôi không thể tìm thấy bạn là "hackeron" irc.freenode.org. Tôi đã tạo một phòng chat để thảo luận mở rộng ở đây .
Deltik

Đáng lưu ý rằng bộ đệm trong bộ nhớ ARC (và / hoặc L2ARC) trong bộ nhớ ZFS không hiển thị free -m, nhưng kích thước của nó có thể được truy vấn trên Linux cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Câu trả lời:


112

Trên Linux trong topquá trình bạn có thể nhấn <phím để dịch chuyển loại hiển thị đầu ra sang trái. Theo mặc định, nó được sắp xếp theo %CPUvì vậy nếu bạn nhấn phím 4 lần, bạn sẽ sắp xếp nó theo VIRTđó là kích thước bộ nhớ ảo cho bạn câu trả lời.

Một cách khác để làm điều này là:

ps -e -o pid,vsz,comm= | sort -n -k 2

sẽ cung cấp cho bạn và đầu ra được sắp xếp theo quy trình kích thước ảo.

Đây là phiên bản dài:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

Điều đó mang lại cho tôi Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmltrên máy chủ Ubuntu 11.10.
Der Hochstapler

1
@OliverSalzburg Vấn đề là -otùy chọn. RHEL4 này hoạt động. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2hoạt động. Tôi sẽ thử 11.10 sau tối nay nhưng nếu bạn tìm thấy các tùy chọn sắp xếp phù hợp trước khi vui lòng cho tôi biết. ps -e -o pid,vsz,comm | sort -n -k 2có thể hoạt động nhưng tôi không có nơi để xác minh vào lúc này.
Karlson

2
Tôi không thực sự quen thuộc với -eftùy chọn này. Nhưng điều này dường như tạo ra đầu ra hợp lý:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler

1
Ty, tôi thích đề xuất hàng đầu của <tôi không biết điều đó là có thể, fedora
SSH vào

2
Phiên bản được sửa đổi một chút để có được các quy trình chiếm RAM và hiển thị lệnh đầy đủ:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

Hiển thị bộ nhớ tiến trình tính bằng megabyte và đường dẫn quy trình.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
Chào mừng đến với Siêu người dùng. Bạn có thể mở rộng câu trả lời của mình để giải thích mã này làm gì và cách giải quyết vấn đề không? Mã không giải thích được khuyến khích , bởi vì nó không dạy giải pháp. Cảm ơn.
fixer1234

9
Tôi ngạc nhiên câu trả lời này bị hạ thấp và có một bình luận yêu cầu giải thích nó .. nó đủ ngắn để nó rõ ràng những gì nó làm (ống dẫn ps vào awk và sau đó sắp xếp), và trong bối cảnh của câu hỏi, nó cho thấy quá trình nào đang sử dụng nhiều RAM nhất. Tôi nghĩ đó là một câu trả lời tốt.
Giăng

14

Chỉ là một ghi chú bên trên một máy chủ hiển thị các triệu chứng tương tự nhưng vẫn hiển thị cạn kiệt bộ nhớ. Điều cuối cùng tìm thấy là một sysctl.conf từ một hộp có 32 GB RAM và thiết lập cho một DB với các trang khổng lồ được cấu hình thành 12000. Hộp này chỉ có 2 GB RAM nên nó đã gán tất cả RAM miễn phí cho các trang lớn (chỉ 960 trong số họ). Đặt các trang lớn thành 10, vì dù sao cũng không được sử dụng, giải phóng tất cả bộ nhớ.

Việc kiểm tra nhanh / Proc / meminfo để tìm các cài đặt HugePages_ có thể là một khởi đầu tốt để khắc phục sự cố ít nhất một hog bộ nhớ bất ngờ.


2
Gần đây tôi đã có một máy chủ khác, đây là vấn đề. Nếu tổ chức của bạn có nhân viên cũ của Oracle trong đó, cài đặt này có thể là thủ phạm của bạn.
các trường

5

Trong trường hợp của tôi, vấn đề là máy chủ là máy chủ ảo VMware có vmw_balloonbật mô-đun:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Đang chạy:

$ vmware-toolbox-cmd stat balloon
5189 MB

Vì vậy, khoảng 5 GB bộ nhớ trong thực tế đã được chủ nhà thu hồi. Vì vậy, mặc dù có 8 GB cho VM của tôi "chính thức", nhưng trên thực tế, nó ít hơn nhiều:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

Bạn cũng có thể sử dụng lệnh ps để có thêm thông tin về quy trình.

ps aux | less

Vì tò mò, cách chính xác để thoát lệnh này là gì? Nó hiển thị END ocne tôi đến dòng cuối cùng, nó không giết tiến trình khi tôi Ctrl + C nó.
KingsInnerSoul

1
@KingsInnerSoul nhấn 'q'
enobayram

2

Tôi tham khảo điều nàyTổng bộ nhớ được sử dụng bởi quá trình Python? - Stack Overflow , đó là câu trả lời của tôi. Bây giờ tôi có một công cụ đếm quy trình cụ thể (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Đính kèm danh sách quá trình của tôi.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Tài liệu tham khảo


1

Tạo một kịch bản được gọi show-memory-usage.shvới nội dung:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
Tại sao? Cái này làm gì Làm thế nào nó hoạt động? Đừng bảo mọi người chạy mã ngẫu nhiên; giải thích mục đích của nó và làm thế nào nó hoạt động.
một CVn

2
Hình tôi sẽ giải thích mã cho những người không hiểu vì nó có vẻ an toàn để chạy, nhưng downvote có thể tránh được những mã mà nó sẽ hữu ích đối với. Nó đang chạy lệnh tương tự như trong các câu trả lời ở trên , nhưng nó đang thêm định dạng với AWK. Tôi đã không đích thân chạy tập lệnh vì tôi không sử dụng nó, nhưng giải thích nó giúp những người cần một số định dạng.
Dooley_labs

1
Tôi đã đọc mã và chạy nó. Nó căn chỉnh các trường như bảng và định dạng tiêu thụ bộ nhớ lưu trú với tiền tố (như 1,12 GB, 582,79 MB).
Stéphane Gourichon

0

Điều này cũng lấy id quá trình, sắp xếp theo MB được sử dụng và phác thảo lệnh (đã tạo ra quy trình):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Máy chủ Ubuntu của tôi DISTRIB RELEASE = 18.04 trên Hyper-V có hầu hết bộ nhớ được sử dụng, nhưng tất cả các quy trình đều ổn. (Phải thừa nhận rằng tôi đã xóa các gói snapd và không giám sát, nhưng 95% bộ nhớ vẫn được sử dụng.)

Câu trả lời là Hyper-V có bộ nhớ động, do đó, nó lấy bộ nhớ để sử dụng hệ thống chính và ubfox gắn cờ nó là sử dụng.

Hy vọng nó sẽ giúp được ai đó.

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.