11/08/2018, 21:14

Sự khác nhau giữa Buffers và Cached

1. Trả lời ngắn Cached là kích thước của page cache. Buffers là kích thước của in-memory block I/O buffers. 2. Trả lời dài: Cả Cached và Buffers đều có ý nghĩa là vùng lưu trữ tạm, nhưng mục đích sử dụng thì khác nhau, tổng quan thì có một số điểm sau: Mục đích của cached là ...

1. Trả lời ngắn

  • Cached là kích thước của page cache.
  • Buffers là kích thước của in-memory block I/O buffers.

2. Trả lời dài:

Cả Cached và Buffers đều có ý nghĩa là vùng lưu trữ tạm, nhưng mục đích sử dụng thì khác nhau, tổng quan thì có một số điểm sau:

  • Mục đích của cached là tạo ra một vùng nhớ tốc độ cao nhằm tăng tốc quá trình đọc/ghi file ra đĩa, trong khi buffers là tạo ra 1 vùng nhớ tạm có tốc độ bình thường, mục đích để gom data hoặc giữ data để dùng cho mục đích nào đó.
  • Cached được tạo từ static RAM (SRAM) nên nhanh hơn dynamic RAM (DRAM) dùng để tạo ra buffers.
  • Buffers thường dùng cho các tiến trình input/output, trong khi cached chủ yếu được dùng cho các tiến trình đọc/ghi file ra đĩa
  • Cached có thể là một phần của đĩa (đĩa có tốc độ cao) hoặc RAM trong khi buffers chỉ là một phần của RAM (không thể dùng đĩa để tạo ra buffers)

2.1 Cached

Cached là kích thước của Linux page cache, không bao gồm bộ nhớ trong swap cached thường được gọi là SwapCached (như vậy tổng kích thước page cache là Cached + SwapCached). Linux thực thi tất cả các thao tác I/O file thông qua page cache. Vùng nhớ này được dùng để tăng tốc quá trình đọc ghi file theo mô tả dưới đây.

Write được implement rất đơn giản là đánh dấu các trang tương ứng trong page cache là dirty (dirty corresponding pages), các flusher thread sau đó sẽ định kỳ ghi vô đĩa bất kỳ một dirty page nào. Có thể xem ví dụ sau để hiểu về cơ chế ghi

~$ dd if=/dev/zero of=/tmp/test.txt bs=1M count=10 && grep -i dirty /proc/meminfo && sync && grep -i dirty /proc/meminfo
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.00854088 s, 1.2 GB/s
Dirty:               712 kB
Dirty:                 0 kB

Giải thích như sau:

  • Lệnh đầu tiên ghi 1 file có kích thước 10MB
  • Như ta thấy thì dữ liệu của file được đánh dấu là dirty trong page cached bằng cách kiểm tra trong lệnh số 2, ở đây là 712 kB được đánh dấu là dirty
  • Lệnh số 3 giúp ta buộc sync dữ liệu từ page cached vào đĩa
  • Lệnh số 4 kiểm tra lại trong page cached xem có dữ liệu nào được đánh dấu dirty hay không, như ta thấy thì không còn (lưu ý là có thể >0 kB do có các tiến trình khác)

Kernel linux có một tiến trình là flush để định kì ghi dữ liệu từ page cached vào đĩa, có thể kiểm tra như sau

ps -eaf | grep -i [f]lush
root       867     2  0 Apr26 ?        00:00:20 [flush-8:0]

Read được implement bằng cách trả về dữ liệu từ page cached, nếu dữ liệu đó không có trong cached, data đó sẽ được di cư lần đầu tiên từ đĩa vào page cache. Trên các hệ thống Linux hiện đại, cached dễ dàng có thể lên tới hàng GB, và nó sẽ co giãn để đáp ứng áp lực của bộ nhớ. Hệ thống sẽ "xóa" page cache cùng với việc swap data từ page cache ra đĩa để làm trống bộ nhớ nhiều hơn nếu cần.

2.2 Buffers

Buffers là vùng đệm mục đích để tổ chức và giữ dữ liệu trong một vùng nhớ nào đó cho đến khi dữ liệu này được chuyển qua nơi khác. Thông thường buffers được dùng trong các quá trình input/output mà tốc độ nhận và xuất dữ liệu khác biệt lớn ( CPU và máy in).

Ví dụ

  • Thao tác in văn bản: CPU là thiết bị có tốc độ cao, trong khi máy in là một thiết bị có tốc độ xử lí chậm. Khi một người ra lệnh in, dữ liệu in sẽ được đẩy vào vùng buffers (điểm khác biệt với cached là vùng này không cần tốc độ cao). Sau đó máy in có thể truy cập vào vùng buffers đó với tốc độ rùa bò trong khi CPU đã đc giải phóng để đi làm nhiệm vụ khác.
  • Thao tác burn đĩa CD: quá trình tương tự máy in nhưng có một điểm là nếu data có kích thước nhỏ, khi được đưa vào vùng buffers thì các data này sẽ được gom lại thành từng block có kích thước bằng kích thước của block size .

Trước Linux kernel 2.4, có 2 loại cached riêng biệt, file thì trong page cache, disk block thì trong buffers cache. Đây là một cách đơn giản để implement, nó khá rõ ràng nhưng kém hiệu quả. Từ phiên bản 2.4, nội dung của 2 loại cache này được hợp nhất.

~$ free -m
             total       used       free     shared    bufferss     cachedd
Mem:         15950      14771       1179          0        248      10306
-/+ bufferss/cached:       4216      11733
Swap:            0          0          0

Như ta thấy dòng -/+ bufferss/cached đã được hợp nhất, nếu cộng cột buffers và cached ở dòng thứ nhất và cột free của dóng số 1 sẽ thấy bằng tổng cột số 3 dòng số 3

1179 + 248 + 10306 = 11733

Next-step: tìm hiểu thuật toán áp dụng cho page cache và buffers (khả năng là LRU với page cache và FIFO với buffers, nên ta thấy buffers khá là giống queue)

3. Ref

  • https://www.quora.com/What-is-the-difference-between-Buffers-and-Cached-columns-in-proc-meminfo-output
  • http://www.differencebetween.net/technology/hardware-technology/difference-between-cache-and-buffer/
Bài liên quan

So sánh sự khác nhau giữa ObjectiveC và Swift (Phần 1)

Nội dung Giới thiệu Variables and Constants Optionals String Interpolation Functions Enumerations Tuples Tổng kết Giới thiệu Vào năm 2008, Apple đã công bố và phát hành bộ SDK phát triển với tên gọi iPhone SDK 2.0. Sự kiện này đã bắt đầu một cuộc cách mạng trang phát triển ...

Tạ Quốc Bảo viết 13:24 ngày 12/08/2018

Nghiên cứu : Sự khác nhau giữa Swift và Object-C ?

Hôm nay mình sẽ cùng các bạn nghiên cứu về Swift , Về Swift định nghĩa thì ở trên mạng cũng có rất nhiều , như "Swift là một ngôn ngữ lập trình mới dành cho các nhà phát triển ứng dụng dành cho iOS và OS X. Nhiều phần của Swift sẽ rất thân quen với những người đã có kinh nghiệm lập trình bằng C ...

Bùi Văn Nam viết 21:49 ngày 11/08/2018

Sự khác nhau giữa Buffers và Cached

1. Trả lời ngắn Cached là kích thước của page cache. Buffers là kích thước của in-memory block I/O buffers. 2. Trả lời dài: Cả Cached và Buffers đều có ý nghĩa là vùng lưu trữ tạm, nhưng mục đích sử dụng thì khác nhau, tổng quan thì có một số điểm sau: Mục đích của cached là ...

Tạ Quốc Bảo viết 21:14 ngày 11/08/2018

Tìm hiểu về sự khác nhau giữa eql? và equal? trong Ruby

Tìm hiểu về sự khác nhau giữa eql? và equal? trong Ruby Tiếp nối bài viết Bạn biết gì về toán tử "===" triple equals (case equality operator) trong Ruby? , ở bài viết này mình sẽ giải thích rõ hơn về sự khác nhau giữa eql? và equal? trong Ruby. Các bạn có thể đọc lại Bạn biết gì về toán ...

Trịnh Tiến Mạnh viết 21:12 ngày 11/08/2018

Sự khác nhau giữa Scala và Java 8 (Phần 1)

1. Scala - ngôn ngữ lập trình hàm (Functional Language) "write less, do more" Ví dụ , nhu cầu ứng dụng của bạn cần lựa chọn một số từ (string) thích hợp thỏa mãn tiêu chí điều kiện của bạn từ một danh sách các từ - List(). Để thực hiện logic này trong Java (7, 6), cú pháp sẽ có ...

Hoàng Hải Đăng viết 20:19 ngày 11/08/2018
0