Trong Linux, sự khác biệt giữa bộ đệm của bộ đệm và bộ nhớ cache Bộ nhớ cache được báo cáo bởi lệnh miễn phí là gì?


73

Đây là một câu hỏi cũ mà thỉnh thoảng tôi đã thấy. Sự hiểu biết của tôi về nó khá hạn chế (đã đọc về sự khác biệt từ lâu, nhưng thực tế liên quan không bao giờ thực sự bị mắc kẹt).

Như tôi hiểu nó,

  • Bộ đệm

    Được sử dụng bởi các chương trình có hoạt động I / O hoạt động, tức là dữ liệu đang chờ để ghi vào đĩa

  • Bộ nhớ cache

    Là kết quả của các hoạt động I / O đã hoàn thành, tức là bộ đệm đã bị xóa hoặc đọc dữ liệu từ đĩa để đáp ứng yêu cầu.

Tôi có thể có được một lời giải thích rõ ràng cho hậu thế?



Nó giống như siêu dữ liệu mà bạn tìm thấy trong bộ đệm, nó không liên quan đến bộ đệm io. Một số bộ đệm kernel được tính trong bộ cấp phát bản mỏng nhưng hoàn toàn không được tính vào bộ đệm hoặc bộ nhớ đệm.
eckes

Câu trả lời:


42

Tổng số "được lưu trong bộ nhớ cache" cũng sẽ bao gồm một số phân bổ bộ nhớ khác, chẳng hạn như bất kỳ tập tin tmpfs nào. Để thấy điều này có hiệu lực hãy thử:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

và bạn sẽ thấy giá trị "bộ đệm" giảm xuống 100Mb mà bạn đã sao chép vào hệ thống tệp dựa trên ram (giả sử có đủ RAM miễn phí, bạn có thể thấy một số giá trị đó đã bị hoán đổi nếu máy đã quá hạn sử dụng bộ nhớ). "Đồng bộ hóa; echo 3> / Proc / sys / vm / drop_caches" trước mỗi cuộc gọi để giải phóng nên ghi bất cứ điều gì đang chờ xử lý trong tất cả các bộ đệm ghi (đồng bộ hóa) và xóa tất cả các khối đĩa được lưu trong bộ nhớ cache / bộ đệm khỏi bộ nhớ để chỉ đọc phân bổ trong giá trị "lưu trữ".

RAM được sử dụng bởi các máy ảo (chẳng hạn như các máy chạy trong VMWare) cũng có thể được tính vào giá trị "được lưu trong bộ nhớ cache" miễn phí, cũng như RAM được sử dụng bởi các tệp ánh xạ bộ nhớ hiện tại (điều này sẽ thay đổi tùy theo trình ảo hóa / phiên bản bạn đang sử dụng và có thể giữa các phiên bản kernel quá).

Vì vậy, nó không đơn giản như "bộ đệm đếm tập tin / mạng đang chờ xử lý và bộ nhớ được lưu trong bộ nhớ cache được ghi trong RAM để lưu các lần đọc vật lý trong tương lai", mặc dù đối với hầu hết các mục đích, mô tả đơn giản này sẽ làm được.


1
+1 cho các sắc thái thú vị. Đây là loại thông tin tôi đang tìm kiếm. Trên thực tế, tôi nghi ngờ rằng các số liệu rất phức tạp, liên quan đến rất nhiều hoạt động khác nhau, rằng chúng ở các chỉ số chung tốt nhất.
Avery Payne

Tôi không nghĩ rằng RAM được sử dụng bởi các máy ảo được tính là "bộ nhớ cache", ít nhất là cho qemu-kvm. Tôi nhận thấy rằng trên máy chủ KVM của mình, giá trị bộ đệm không chỉ quá nhỏ để có thể chính xác (ở mức 1.9 Gig), nhưng nó không thay đổi nếu tôi phá hủy / khởi động một trong các máy ảo của mình. Nó cũng không thay đổi nếu tôi thực hiện thủ thuật gắn kết tmpfs trên một trong các máy ảo. Tôi đã tạo một phân vùng tmpfs 800Meg ở đó và "lưu trữ" cho thấy các giá trị phù hợp trên VM nhưng nó không thay đổi trên máy chủ VM. Nhưng giá trị "đã sử dụng" đã thu hẹp / tăng lên khi tôi phá hủy / khởi động VM của mình.
Mike S

... Tôi đã chạy thử nghiệm trên máy chủ Centos 7.2.1511 VM chạy kernel 3.10.0-327.
Mike S

@MikeS: Các giải pháp ảo hóa khác nhau xử lý bộ nhớ có thể thay đổi như thế nào, trên thực tế, cách thức hạt nhân đo lường việc sử dụng bộ nhớ khác nhau có thể thay đổi giữa các phiên bản chính.
David Spillett

@MikeS: Liên quan đến "thực hiện thủ thuật gắn kết tmpfs trên một trong các máy ảo" - Tôi sẽ không ảnh hưởng đến các bài đọc của máy chủ nếu chúng không hiển thị các mem khác được VM sử dụng. Tôi thấy hiệu ứng trong chính máy ảo KVM: trước dd free = 2020, sau dd free = 1899, sau khi thả fs free = 2001 (sự khác biệt 19Mb sẽ là do các quá trình khác trên VM, nó không hoạt động khi tôi chạy các bài kiểm tra). Máy chủ có thể không thấy sự thay đổi: bộ nhớ có thể vẫn được phân bổ cho VM mặc dù nó được sử dụng miễn phí bởi các quy trình trong VM.
David Spillett


5

Tôi đang tìm kiếm mô tả rõ ràng hơn về bộ đệm và tôi đã tìm thấy trong "Professional Linux® Kernel Architecture 2008"

Chương 16: Bộ đệm và trang bộ đệm

Sự tương tác

Thiết lập liên kết giữa các trang và bộ đệm phục vụ mục đích nhỏ nếu không có lợi ích cho các phần khác của kernel. Như đã lưu ý, một số thao tác chuyển đến và từ thiết bị khối có thể cần được thực hiện trong các đơn vị có kích thước phụ thuộc vào kích thước khối của thiết bị bên dưới, trong khi nhiều phần của hạt nhân thích thực hiện thao tác I / O với độ chi tiết của trang vì điều này làm cho mọi thứ dễ dàng hơn nhiều - đặc biệt là về mặt quản lý bộ nhớ. Trong kịch bản này, bộ đệm đóng vai trò trung gian giữa hai thế giới.


3

Giải thích bởi RedHat :

Trang bộ nhớ cache:

Bộ đệm là một phần của bộ nhớ lưu trữ dữ liệu một cách trong suốt để các yêu cầu trong tương lai cho dữ liệu đó có thể được phục vụ nhanh hơn. Bộ nhớ này được nhân sử dụng để lưu trữ dữ liệu đĩa và cải thiện hiệu năng i / o.

Nhân Linux được xây dựng theo cách nó sẽ sử dụng nhiều RAM nhất có thể để lưu trữ thông tin từ các hệ thống tệp và đĩa cục bộ và từ xa. Khi thời gian trôi qua các lần đọc và ghi khác nhau được thực hiện trên hệ thống, kernel cố gắng lưu trữ dữ liệu trong bộ nhớ cho các quy trình khác nhau đang chạy trên hệ thống hoặc dữ liệu của các quy trình có liên quan sẽ được sử dụng trong tương lai gần. Bộ nhớ cache không được lấy lại tại thời điểm khi tiến trình dừng / thoát, tuy nhiên khi các quá trình khác cần thêm bộ nhớ thì bộ nhớ còn trống, kernel sẽ chạy heuristic để lấy lại bộ nhớ bằng cách lưu trữ dữ liệu bộ đệm và cấp phát bộ nhớ đó cho quy trình mới.

Khi bất kỳ loại tệp / dữ liệu nào được yêu cầu thì kernel sẽ tìm một bản sao của phần mà người dùng đang thực hiện và nếu không có bản sao đó tồn tại, nó sẽ phân bổ một trang mới của bộ nhớ đệm và điền vào nó các nội dung thích hợp đọc ra từ đĩa.

Dữ liệu được lưu trữ trong bộ đệm có thể là các giá trị đã được tính toán trước đó hoặc trùng lặp với các giá trị gốc được lưu trữ ở nơi khác trong đĩa. Khi một số dữ liệu được yêu cầu, bộ đệm được kiểm tra trước tiên để xem liệu nó có chứa dữ liệu đó không. Dữ liệu có thể được truy xuất nhanh hơn từ bộ đệm hơn từ nguồn gốc của nó.

Các phân đoạn bộ nhớ dùng chung SysV cũng được tính là bộ đệm, mặc dù chúng không thể hiện bất kỳ dữ liệu nào trên các đĩa. Người ta có thể kiểm tra kích thước của các phân đoạn bộ nhớ dùng chung bằng lệnh ipcs -m và kiểm tra cột byte.

Bộ đệm:

Bộ đệm là biểu diễn khối đĩa của dữ liệu được lưu trữ dưới bộ đệm trang. Bộ đệm chứa siêu dữ liệu của các tệp / dữ liệu nằm trong bộ đệm của trang. Ví dụ: Khi có yêu cầu về bất kỳ dữ liệu nào có trong bộ đệm của trang, trước tiên, kernel sẽ kiểm tra dữ liệu trong bộ đệm chứa siêu dữ liệu trỏ đến các tệp / dữ liệu thực tế có trong bộ đệm của trang. Một khi từ siêu dữ liệu, địa chỉ khối thực tế của tệp được biết đến, nó được chọn bởi kernel để xử lý.


2

Giải phóng bộ đệm / bộ đệm

Cảnh báo Điều này giải thích một phương pháp mạnh không được khuyến nghị trên máy chủ sản xuất! Vì vậy, bạn đã cảnh báo, đừng đổ lỗi cho tôi nếu có gì sai.

Để hiểu, điều này, bạn có thể buộc hệ thống của mình ủy quyền càng nhiều bộ nhớ càng tốt cachehơn là thả tệp được lưu vào bộ nhớ cache:

Lời nói đầu

Trước khi thực hiện bài kiểm tra, bạn có thể mở một cửa sổ khác:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

để theo dõi sự tiến hóa của trao đổi trong thời gian thực.

Lưu ý: Bạn phải loại bỏ càng nhiều đĩa miễn phí trên thư mục hiện tại, bạn có mem + hoán đổi

Bản demo
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

Đáng chú ý, máy chủ lưu trữ tôi đã làm điều này được sử dụng mạnh mẽ. Điều này sẽ có ý nghĩa hơn trên một máy thực sự yên tĩnh.


1
-1 nếu tôi có thể. Đây là cả hai (A) không liên quan đến câu hỏi được hỏi và (B) một cách mạnh mẽ khủng khiếp để kích hoạt giải phóng mặt bằng bộ đệm. Tồn tại những cách trực tiếp để thực hiện cái sau, vì vậy không thể phòng thủ để lừa hệ thống tuân thủ bằng cách spam dữ liệu cho đến khi nó bị xóa như một hiệu ứng phụ
underscore_d

Ôi trời ơi! Xin đừng bao giờ làm điều đó trên các máy chủ thực sự!
tamerlaha

@Tamerlaha Tôi đồng ý, nhưng vui lòng đọc lại đoạn 1: bạn đã cảnh báo, đừng đổ lỗi cho tôi ! Mục tiêu của việc này là hiển thị hàm ý bộ đệm / bộ đệm.
F. Hauri
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.