it-swarm-vi.tech

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

Đâ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ế có 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ế?

73
Avery Payne

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 miễn phí 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ộ nhớ đệm để bộ nhớ miễn phí sẽ chỉ được đọc khá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 dưới VMWare) cũng có thể được tính vào giá trị "được lưu trong bộ nhớ cache" miễn phí, như will RAM được sử dụng bởi hiện đang mở các tập tin ánh xạ bộ nhớ (điều này sẽ thay đổi tùy thuộc vào 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).

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ớ cache được lưu trong các khối đã đọc/ghi gần đây được giữ 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 hơn này sẽ làm.

41
David Spillett

Câu hỏi khó. Khi bạn tính toán dung lượng trống, bạn thực sự cần phải thêm bộ đệm và bộ đệm. Đây là những gì tôi có thể tìm thấy

Một bộ đệm là một cái gì đó chưa được "ghi" vào đĩa. Bộ nhớ cache là thứ đã được "đọc" từ đĩa và được lưu trữ để sử dụng sau.

http://visualbasic.ittoolbox.com/document/difference-b between-buffer-and-cache-12135

8
Viky

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 một 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ừ các 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 các 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.

5
c4f4t0r

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 càng nhiều RAM vì nó có thể lưu trữ thông tin từ các hệ thống tệp và ổ đĩa cục bộ và từ xa của bạn. được thực hiện trên hệ thống, kernel cố gắng giữ dữ liệu được lư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ộ đệm không được lấy lại tại thời điểm xử lý được dừng/thoát, tuy nhiên khi các quá trình khác đòi hỏi nhiều bộ nhớ hơn thì bộ nhớ khả dụng miễn phí, kernel sẽ chạy heuristic để lấy lại bộ nhớ bằng cách lưu trữ dữ liệu bộ đệm và phân bổ 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 so với 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ý.

3
Ijaz Ahmad Khan

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 đề xuất 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ó sự cố.

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

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.

Nota : 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

$ 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 đã thực hiện việc 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.

2
F. Hauri