Cái gì đã sử dụng bộ nhớ Linux? Bộ nhớ cache thấp, bộ đệm thấp, không phải là VM


11

Trước hết, vâng, tôi đã đọc LinuxAteMyRAM , không giải thích được tình huống của tôi.

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Như được hiển thị ở trên, -/+ buffers/cache:dòng hiển thị cho biết tốc độ bộ nhớ được sử dụng là rất cao. Tuy nhiên, từ đầu ra của top, tôi không thấy bất kỳ quá trình nào sử dụng hơn 100 MB bộ nhớ.

Vì vậy, những gì sử dụng bộ nhớ?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

Đây là máy x86_64 (không phải máy chủ thương hiệu chung) chạy x84_64 Linux, không phải là bộ chứa trong máy ảo. Hạt nhân ( uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Nội dung của /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dfbáo cáo không có mức tiêu thụ bộ nhớ lớn từ các tmpfshệ thống tập tin.


2
Đầu ra của ps -eo pid,user,args,pmem --sort pmemcái gì?
Braiam

Dán ở đây liên kết , đã thử một vài lần, có cùng một đầu ra.
Jason

3
Đừng dùng head! Tôi muốn đầu ra hoàn chỉnh của lệnh hoàn chỉnh. Nếu tôi muốn bạn sử dụng headtôi sẽ đưa nó vào lệnh của tôi. Xin vui lòng, luôn luôn cung cấp đầu ra đầy đủ cho lệnh mọi người yêu cầu.
Braiam

3
Trên điện thoại, đừng nhớ cú pháp trên đỉnh đầu của tôi, nhưng hãy kiểm tra bộ nhớ chia sẻ sysv. Lệnh là ipcs, tôi nghĩ vậy.
derobert

5
Bạn đã bao giờ tìm thấy một giải pháp cho điều này? - Tôi đang gặp vấn đề tương tự ở đây: superuser.com/questions/793192/
mẹo

Câu trả lời:


4

Bộ nhớ trên Linux có thể là một con thú kỳ lạ để chẩn đoán và hiểu.

Trong hầu hết các hoạt động bình thường, nếu không phải tất cả, bộ nhớ của bạn sẽ được phân bổ cho nhiệm vụ này hay nhiệm vụ khác. Một số sẽ được phân bổ cho các quy trình tiền cảnh hiện đang chạy. Một số sẽ được lưu trữ dữ liệu lưu trữ từ đĩa. Một số người sẽ giữ dữ liệu liên quan đến các quy trình không tích cực thực hiện tại một thời điểm cụ thể.

Một quy trình trong Linux có không gian địa chỉ ảo riêng (VIRT ở đầu ra top). Điều này chứa tất cả các dữ liệu liên quan đến quá trình và có thể được coi là quá trình "lớn" như thế nào. Tuy nhiên, rất hiếm khi tất cả bộ nhớ đó là một phần tích cực của bản đồ bộ nhớ "thực" (RES ở đầu ra của top). RES, hoặc bộ nhớ lưu trú, là dữ liệu có thể truy cập trực tiếp vào RAM tại thời điểm đó. Sau đó, cũng có bộ nhớ chia sẻ (SHR) trên đó. Điều đó có thể được chia sẻ giữa nhiều trường hợp của cùng một quá trình. Vì vậy, bộ nhớ được sử dụng bởi một quá trình tại bất kỳ thời điểm nào RES cộng với SHR, nhưng nếu có nhiều hơn một phiên bản của quá trình sử dụng bộ nhớ dùng chung thì việc sử dụng là RES cộng với RES cộng với RES ... cộng với SHR.

Vậy tại sao sự khác biệt giữa RES và VIRT? Chắc chắn nếu một tiến trình có một khối bộ nhớ được phân bổ thì đó là bộ nhớ được phân bổ, phải không? Không. Bộ nhớ được phân bổ trong các trang và các trang có thể là Hoạt động hoặc Không hoạt động. Những người tích cực là những gì trong RES. Không hoạt động là "phần còn lại". Chúng có thể bị đẩy sang một bên vì chúng không được truy cập vào lúc này. Điều đó có nghĩa là chúng có thể được hoán đổi ra đĩa nếu bộ nhớ bị hạn chế. Nhưng họ không đi thẳng vào đĩa. Đầu tiên họ ngồi trong một bộ đệm. Bạn không muốn hoán đổi mọi lúc, vì vậy có một bộ đệm giữa ứng dụng và không gian hoán đổi. Các bộ đệm đó liên tục thay đổi khi bộ trao đổi chọn một quy trình khác để thực thi và các trang khác nhau trở nên hoạt động và không hoạt động. Và tất cả điều đó xảy ra là cách nhanh chóng để một người đơn thuần theo kịp.

Và trên hết là bộ đệm đĩa. Bộ nhớ không hoạt động không chỉ chuyển đến bộ đệm, mà khi bộ đệm đó được hoán đổi sang đĩa, trước tiên, nó sẽ chuyển đến bộ đệm đĩa để được xếp hàng để ghi. Vì vậy, đó là một lớp bộ đệm thứ hai trong hỗn hợp. Và các bộ đệm đĩa cũng được sử dụng bởi các bộ phận khác của hệ thống để đệm IO chung. Vì vậy, họ liên tục thay đổi quá.

Vì vậy, những gì bạn đang thấy trong những thứ như topfreevv là ảnh chụp nhanh tức thì về trạng thái hiện tại của máy hoặc thống kê tổng hợp trong một khoảng thời gian. Vào thời điểm bạn đọc dữ liệu, nó đã lỗi thời.

Bất kỳ một quá trình nào cũng có thể truy cập một lượng lớn bộ nhớ, nhưng hiếm khi có thể làm như vậy. Dù sao thì nó cũng không thể truy cập tất cả bộ nhớ, vì vậy bộ nhớ mà hiện tại nó không nhìn vào được chuyển sang bộ đệm trừ khi nó được gắn cờ cụ thể là "bị khóa trong lõi".

Vì vậy, dung lượng bộ nhớ "được sử dụng" bởi một ứng dụng và dung lượng bộ nhớ mà nó "có" là hai thứ hoàn toàn khác nhau. Phần lớn không gian dữ liệu của ứng dụng thực sự nằm trong bộ đệm, không phải trong bộ nhớ "lõi", nhưng vì bộ nhớ cache nằm trong RAM nên hầu hết thời gian có sẵn và chỉ cần "kích hoạt" để trở thành bộ nhớ "lõi". Đó là trừ khi nó được hoán đổi ra đĩa, khi đó nó cần được giải mã (có thể nhanh nếu nó nằm trong bộ đệm).

Do bản chất của con thú tốc độ cao và thực tế là các con số luôn thay đổi, các con số thậm chí có thể thay đổi một phần thông qua việc tính toán chúng là gì, do đó không bao giờ có thể nói chính xác "đây là bộ nhớ được sử dụng" một quan điểm của người dùng. Meminfo là một ảnh chụp nhanh trong thời gian do kernel cung cấp, nhưng vì đó là kernel đang thực thi nên nó không nhất thiết phải hiển thị trạng thái thực của bất kỳ một quá trình sử dụng bộ nhớ nào, vì không có quá trình nào được thực thi tại thời điểm đó - đó là giữa các tiến trình.

Như tôi đã nói, tất cả đều rất khó hiểu.

Nhưng vào cuối ngày, nó thực sự không thành vấn đề. Vấn đề không phải là bạn có bao nhiêu bộ nhớ "miễn phí", mà là bạn đã sử dụng bao nhiêu dung lượng trao đổi và tần suất trao đổi không gian được truy cập. Đó là sự hoán đổi làm chậm hệ thống, không thiếu bộ nhớ (mặc dù thiếu bộ nhớ gây ra sự hoán đổi quá mức). Nếu bạn có nhiều bộ nhớ đã sử dụng, nhưng bạn không sử dụng bất kỳ dung lượng trao đổi (hoặc rất ít) nào, thì mọi thứ đều bình thường. Nói chung, bộ nhớ trống không phải là mong muốn và thường hoàn toàn là chuyển tiếp, vì nó được sử dụng cho một mục đích, nhưng chưa được phân bổ cho mục đích khác - ví dụ, đó là bộ nhớ cache và được đổi sang đĩa, nhưng nó chưa được sử dụng cho bất cứ điều gì khác, hoặc đó là bộ đệm đĩa, bộ đệm đã được xóa vào đĩa, nhưng chưa có ứng dụng nào yêu cầu nó cho bộ đệm.


6
Điều này thực sự thú vị nhưng không trả lời câu hỏi tại sao OP lại quan sát sự khác biệt cụ thể này.
terdon

Tôi nghĩ rằng sự khác biệt thực sự duy nhất nằm giữa kỳ vọng của OP và những gì Linux đang cung cấp. Tức là, các giá trị mà Linux cung cấp không tăng lên và đó là vì chúng đã thay đổi.
Majenko

Vì OP dường như không thực sự hiểu câu hỏi mà anh ấy đang hỏi nên tôi không thấy câu trả lời "đúng" có thể được chọn như thế nào. Chúng tôi có thể giải thích cách hệ thống hoạt động cho đến khi chúng tôi xanh mặt, nhưng nếu anh ta không nắm bắt được những điều cơ bản đó và nhận ra rằng câu hỏi của anh ta thực sự vô nghĩa, chúng tôi sẽ không bao giờ có câu trả lời "đúng".
Majenko

Đánh giá cao cho việc viết này nhưng thành thật tôi không thích giai điệu bất khả tri đằng sau nó. Tôi đồng ý với lý thuyết "ảnh chụp nhanh" nhưng nếu ảnh chụp tiếp tục đưa ra cùng một con số cho biết mức sử dụng RAM cao trong khi bạn không thể tìm hiểu nó đã xảy ra như thế nào, bạn có tò mò không?
Jason

5
Bạn nên đăng bài này lên blog của bạn. Nó tốt, nhưng nó không liên quan ở đây. Có điều gì đó kỳ lạ đang xảy ra (và ý tôi là kỳ lạ đến từ một người hiểu những gì bạn đã viết), vì VIRT của các quy trình không giải thích cho tất cả việc sử dụng RAM và hệ thống không bị tráo đổi mặc dù áp lực phải làm như vậy.
Gilles 'SO- ngừng trở nên xấu xa'

0

Đây là một phần của câu trả lời:

Có một sự khác biệt giữa những gì được chỉ định là bộ nhớ "Được sử dụng" (trong lệnh "miễn phí") và "Bộ nhớ được phân bổ cho các quy trình (người dùng) đang hoạt động" (trong / Proc / meminfo). Ok, vậy là hệ thống của bạn có tổng cộng 48049 MB (khoảng 47Gb)

Nếu bạn nhìn vào / Proc / meminfo, bạn sẽ thấy: Không hoạt động: 17296272 kB = (khoảng 16,5 Gb) - Bộ nhớ không hoạt động có thể là từ các quá trình đã kết thúc. Nó cũng có thể là bộ nhớ không được sử dụng trong một thời gian dài bởi một quá trình đang hoạt động. Bộ nhớ không được "giải phóng" chỉ vì quá trình kết thúc. Tại sao? bởi vì nó làm việc nhiều hơn Cùng một trang bộ nhớ có thể được sử dụng lại, do đó, nhân linux chỉ để dữ liệu ở đó trong danh sách "không hoạt động" cho đến khi một tiến trình cần nó.

Trang này giải thích một số điều đó. http://careers.directi.com/display/tu/Under Hiểu + and + optimizing + Memory + sử dụng ; Đọc phần trên PFRA (Thuật toán lấy lại khung trang) được sử dụng bởi nhân Linux: "Các trang được bao gồm trong bộ nhớ cache và bộ nhớ không được tham chiếu bởi bất kỳ quy trình nào nên được lấy lại trước khi các trang thuộc không gian địa chỉ Chế độ người dùng của các quy trình" "Lấy lại" nghĩa là chuyển chúng ra khỏi "đã sử dụng" (không hoạt động + hoạt động) và thành "miễn phí".

Điều này giải thích việc quản lý bộ nhớ chi tiết hơn: Cách danh sách hoạt động và không hoạt động và cách các trang di chuyển giữa chúng https://www.cs.columbia.edu/~smb/groupes/s06-4118/l19.pdf

Tôi tin rằng cũng có bộ nhớ được sử dụng bởi kernel cho cấu trúc dữ liệu và điều này hiển thị dưới dạng "phiến 1049464 kb" (~ 1 GB) tôi tin, nhưng không tích cực rằng điều này được tính riêng.


Chỉ muốn nói thêm rằng trong quá khứ tôi đã có kinh nghiệm với một hệ thống hết bộ nhớ do một ứng dụng được viết kém phân bổ các phân đoạn bộ nhớ chia sẻ, nhưng không phát hành chúng. Các phân đoạn bộ nhớ dùng chung vẫn tồn tại ngay cả khi tất cả các quá trình sử dụng chúng bị chết. Đây không phải là Linux, nhưng nó cũng có thể đúng trong linux. như đã đề cập ở trên, xem ipcs để biết thông tin về điều này. xem makelinux.net/alp/035 Nó nói rằng bạn cần giải phóng bộ nhớ chia sẻ rõ ràng.
ssl

1
Tôi không hiểu tất cả mọi thứ mà câu trả lời của bạn là về, nhưng bộ nhớ Không hoạt động có thể là từ các quá trình đã chấm dứt, chắc chắn là sai. Bộ nhớ người dùng có hai loại: ánh xạ hoặc ẩn danh. Bộ nhớ đã ánh xạ luôn có thể được lấy lại vì dữ liệu có thể được tải lại từ một tệp. Bộ nhớ ẩn danh có thể được lấy lại nếu nó bị tráo đổi. Bộ nhớ không hoạt động là bộ nhớ là một ứng cử viên tốt để đòi lại; tuy nhiên nội dung phải ở trong một tệp hoặc trao đổi ở đâu đó, vì bộ nhớ đó vẫn đang được sử dụng. Khi một quá trình chết, bộ nhớ của nó trở nên miễn phí và không còn được tính vào hoạt động + không hoạt động.
Gilles 'SO- ngừng trở nên xấu xa'

1
Một số tài liệu tham khảo: Điều gì có thể gây ra sự gia tăng bộ nhớ không hoạt động và làm thế nào để lấy lại nó? trên Lỗi máy chủ; lời khuyên cũ nhưng vẫn chủ yếu áp dụng từ Red Hat . Và bài viết của Bhavin Turakhia mà bạn cũng trích dẫn; nó không rõ ràng về vấn đề này, nhưng nó giải thích về các trang ẩn danh và được ánh xạ trong phần Hiểu về PFRA.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi có suy nghĩ về các trang không hoạt động không được tham chiếu bởi một quy trình từ bài viết này: kernel.org/doc/gorman/html/understand/understand013.html Mặc dù tôi cho rằng đó có thể là các trang được giải phóng bởi một quy trình vẫn đang chạy. phần "Lấy lại các trang từ danh sách LRU"
ssl

Nhưng có lẽ điều đó chỉ đề cập đến các trang trong bộ đệm trao đổi?
ssl

-2

Bạn có sử dụng NFS không?
Nó có thể là giá trị chạy slabtop -omột trong hai cách, nfs_inode_cachecó thể ra khỏi tầm tay.


-4

Con số bạn nên xem là trao đổi được sử dụng , trong đầu ra của bạn là "0" có nghĩa là bạn KHÔNG hết RAM. Miễn là hệ thống của bạn không hoán đổi bộ nhớ, bạn không nên lo lắng về các số liệu khác, điều này rất khó diễn giải.

Chỉnh sửa: Ok, có vẻ như câu trả lời của tôi đang được coi là khó hiểu hơn là súc tích. Vì vậy, hãy để tôi giải thích.

Tôi đoán vấn đề chính ở đây là trong việc diễn giải đầu ra của top / ps, điều này không chính xác lắm. Ví dụ như nhiều công dụng của các thư viện chia sẻ cùng không được tính như bạn mong đợi, thấy ví dụ http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

Tuy nhiên, điều chính xác là nếu kích thước trao đổi chính xác bằng 0, thì hệ thống của bạn vẫn chưa hết bộ nhớ. Tất nhiên, đó là một tuyên bố rất khóa học, nhưng để định hình hệ thống sử dụng bộ nhớ thực tế của bạn, hàng đầu sẽ không phải là điều đúng đắn. (Và nếu bạn nhìn từ trên xuống, ít nhất hãy sắp xếp đầu ra cho virt hoặc% mem.)

Xem thêm http://elinux.org/R.78_Memory_Measairs


1
Bạn không nên lo lắng nếu hệ thống của bạn hoán đổi, điều đó là bình thường. Bạn nên lo lắng nếu hệ thống của bạn hoán đổi quá thường xuyên (điều này không giống với việc có một không gian hoán đổi được sử dụng lớn). Thực tế là hoán đổi được sử dụng là 0 tự nó rất kỳ lạ, với rất ít bộ nhớ vật lý miễn phí.
Gilles 'SO- ngừng trở nên xấu xa'

tốt, đầu ra của anh ấy chỉ ra rằng hệ thống của anh ấy đã không trao đổi gì cả. Đó chắc chắn là tỷ lệ hoán đổi tối ưu. Tôi không nói kích thước trao đổi nhỏ là một điều tốt, nhưng chắc chắn là không có kích thước. Và miễn là hệ thống không thực sự hết bộ nhớ trống, tại sao nó phải bắt đầu hoán đổi?
Echsecutor

Không, sự vắng mặt của trao đổi là xa tối ưu. Bộ nhớ của các chương trình không được sử dụng tại thời điểm này nên được hoán đổi để nhường chỗ cho bộ đệm đĩa cho các tệp được sử dụng thường xuyên. Đối với bit bạn vừa thêm về đầu ra của free, tôi nghĩ bạn có ý đó top- nhưng ngay cả khi đó tổng chỉ có thể nhiều hơn tổng (vì bộ nhớ chia sẻ được tính nhiều lần), không ít hơn.
Gilles 'SO- đừng trở nên xấu xa'

ý của bạn là gì chỉ có thể nhiều hơn không ít hơn? top chỉ hiển thị bao nhiêu tiến trình vừa với màn hình, tôi khá chắc chắn rằng ở trên không phải là tất cả các tiến trình đang chạy, do đó chúng không được sắp xếp theo cách sử dụng bộ nhớ, phần đầu ra đó khá vô dụng đối với câu hỏi 'sử dụng bộ nhớ' là gì .
Echsecutor

ồ, và tôi không muốn tham gia một cuộc tranh luận khi nào thời điểm tối ưu để bắt đầu hoán đổi là, nhưng mặc định của máy chủ linux là không trao đổi bộ nhớ chỉ vì nó "không được sử dụng tại thời điểm này".
Echsecutor
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.