Ubuntu Linux: Quá trình trao đổi bộ nhớ và sử dụng bộ nhớ


14

Ubuntu của tôi ăn nhiều bộ nhớ hơn trình quản lý tác vụ đang hiển thị:

sudo ps -e --format rss  | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29

free -m

             total       used       free     shared    buffers     cached
Mem:          3860       2765       1094          0          3        300
-/+ buffers/cache:       2461       1398
Swap:         2729       2374        354

Điều đó thật lạ. Ai đó có thể giải thích sự khác biệt này?

Nhưng điều quan trọng hơn: tôi muốn biết một quá trình thực sự sử dụng bao nhiêu bộ nhớ. Tôi không muốn biết kích thước bộ nhớ ảo, mà là bộ nhớ lưu trú cộng với hoán đổi của một quá trình.

Tôi cũng đã cố gắng xuất định dạng param "sz" của 'ps', nhưng tổng số này là cao (16000 MB) (kích thước param 'cho 36700 MB). Có sự lựa chọn nào khác không?

Tôi thực sự muốn sử dụng cái này, để xác định chương trình / quy trình nào đang ăn nhiều bộ nhớ (và trao đổi), để tiêu diệt chúng, bởi vì bộ nhớ rất có giá trị :-) Điều này thực sự không có ý nghĩa, vì vậy tôi đang hỏi ở đây.

Đầu ra của / Proc / meminfo:

MemTotal:        3952812 kB                
MemFree:         1119192 kB
Buffers:            2676 kB
Cached:           290068 kB
SwapCached:       160980 kB
Active:          1805396 kB
Inactive:         731680 kB
Active(anon):    1745820 kB
Inactive(anon):   689184 kB
Active(file):      59576 kB
Inactive(file):    42496 kB
Unevictable:         148 kB
Mlocked:             148 kB
SwapTotal:       2795272 kB
SwapFree:         390900 kB
Dirty:              1984 kB
Writeback:             0 kB
AnonPages:       2085472 kB
Mapped:            67432 kB
Shmem:            190676 kB
Slab:              88012 kB
SReclaimable:      42704 kB
SUnreclaim:        45308 kB
KernelStack:        5496 kB
PageTables:        87860 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4771676 kB
Committed_AS:    9522364 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      374404 kB
VmallocChunk:   34359330144 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       61440 kB
DirectMap2M:     4030464 kB

Tôi nên chỉ ra rằng "1043.84" không quá xa so với "1178", đó là con số bạn sẽ thực hiện với phép tính mà bạn đang thực hiện.
cjc

Tôi đã có câu hỏi giống hệt nhau trên unix.stackexchange (+1). Patrick cũng thổi bay tâm trí của tôi ở đó: P-- unix.stackexchange.com/questions/34795/ khăn
GoldenNewby

Câu trả lời:


10

Hệ thống bộ nhớ ảo linux không đơn giản như vậy. Bạn không thể thêm tất cả các trường RSS và nhận giá trị được báo cáo usedbởi free. Có nhiều lý do cho việc này, nhưng tôi sẽ đánh một vài trong số những lý do lớn nhất.

  • Khi một quá trình rẽ nhánh, cả cha mẹ và đứa trẻ sẽ hiển thị với cùng một RSS. Tuy nhiên, linux sử dụng copy-on-writeđể cả hai quá trình thực sự sử dụng cùng một bộ nhớ. Chỉ khi một trong các quy trình sửa đổi bộ nhớ thì nó mới thực sự được nhân đôi. Vì vậy, điều này sẽ khiến freesố lượng nhỏ hơn toptổng RSS.

  • Giá trị RSS không bao gồm bộ nhớ dùng chung. Bởi vì bộ nhớ dùng chung không thuộc sở hữu của bất kỳ một quá trình nào, topnên không bao gồm nó trong RSS. Vì vậy, điều này sẽ khiến freesố lượng lớn hơn toptổng RSS.


Ồ, cảm ơn bạn! Tôi luôn nghĩ rằng, phần mềm miễn phí này hiển thị tổng bộ nhớ được chia sẻ thực tế của toàn bộ hệ thống. Nhưng như "man ps" chỉ ra: "Cột bộ nhớ dùng chung nên bị bỏ qua; nó đã lỗi thời."
David Halter

Xin lỗi, tôi không thể chấp nhận câu trả lời này, vì nó không trả lời được vấn đề hoán đổi, nhưng dù sao cũng cảm ơn bạn!
David Halter

@DavidHalter vấn đề hoán đổi gì? Thông tin tôi cung cấp áp dụng cho tất cả bộ nhớ, bao gồm trao đổi.
Patrick

Bộ nhớ chia sẻ không thực sự lớn, bình thường? Ít nhất đó là những gì tôi thấy trong trình quản lý tác vụ. Nhưng trao đổi của tôi được sử dụng khá nhiều: 1035 MB; Tổng của PS là 1 GB và tổng số trao đổi + rss là> 2 GB. Tôi muốn xem một quá trình thực sự sử dụng bao nhiêu bộ nhớ, không chỉ rss. Thậm chí nhiều sự xen kẽ sẽ là bao nhiêu bộ nhớ hoán đổi mà một quá trình đang sử dụng.
David Halter

1
@DavidHalter nếu bạn muốn xem quá trình sử dụng bao nhiêu bộ nhớ (bao gồm cả chia sẻ), sau đó xem cột 'VSZ'.
Patrick

1

Tôi nghĩ rằng tốt hơn hết là bạn nên tin tưởng vào đầu ra "miễn phí" theo tổng mức sử dụng bộ nhớ của bạn và tin tưởng "ps" cho ý tưởng chung về việc sử dụng bao nhiêu bộ nhớ.

Chỉ vì tổng giá trị RSS "ps" không bằng "miễn phí" không ngăn bạn sắp xếp các quy trình của mình bằng RSS và đánh giá các quy trình lớn nhất để tiêu diệt.

Điều đó đang được nói, nếu tất cả nỗ lực của bạn chỉ nhằm phục vụ cho việc đảm bảo máy có thể ngủ đông, tạo ra nhiều trao đổi (dưới dạng tệp trên đĩa, nếu cần) có lẽ là một cách dễ dàng hơn.


1

Cuối cùng tôi đã có câu trả lời cho câu hỏi của mình. Có một chương trình gọi là smem (trên Ubuntu / Debian apt install smem) cho phép bạn liệt kê riêng bộ nhớ trao đổi và sử dụng bộ nhớ.

Một vài cách khác nhau để hoán đổi danh sách có thể được tìm thấy ở đây: https://www.cyberciti.biz/faq/linux-which- Process-is-USE-swap / .

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.