Buffer và cache

Đây là hai khái niệm không mới nhưng lại rất dễ gây nhầm lẫn.

Khi thực hiện free -m, hẳn bạn đã từng thấy các tham số buffer và cache này.

total used free shared buffers cached
Mem: 31790 31600 190 0 143 23248
-/+ buffers/cache: 8207 23582
Swap: 15967 0 15967

Trên server này, tôi có buffers là 143M còn cached là 23248M (khoảng 23G rất lớn)

Buffer

Là một vùng nhớ physical memory được dùng để làm vùng chứa data tạm thời trước khi chuyển đến một nơi khác. Ví dụ khi bạn cần đọc/ghi data từ/ra một thiết bị ngoại vi như disk, network, màn hình hoặc keyboard… Đây là vùng physical memory được cấp sẵn. Nhờ vậy, hệ thống sẽ không cần tốn công điều tác để cấp phát vùng nhớ mỗi khi sử dụng.

Buffer sẽ giải quyết được vấn đề đồng bộ thời gian giữa hai đầu gửi và nhận. Ví dụ process cần ghi data xuống disk. Process sẽ gọi một system call nhưng do tốc độ xử lý của disk khá chậm so với memory nên hàm system call sẽ phải chờ. Thời gian chờ này rất lãng phí vì khi đó process không thể làm gì được cho đến khi system call return. Buffer sẽ khắc phục sự lãng phí này. Data thay vì đẩy ngay xuống disk thì đẩy trước vào buffer, system call sẽ trả kết quả về ngay lập tức. Data sau đó sẽ dần được đẩy từ buffer xuống disk.

Một lợi thế nữa khi dùng buffer là cho phép tái điều chỉnh kích cỡ các block data. Nếu process ghi block data có kích cỡ nhỏ hơn block size trên disk thì khi qua buffer, data sẽ được gom lại để khớp với block size của disk rồi mới flush xuống disk.

Buffer xuất hiện ở cả hai đầu đọc/ghi và thường được implement ở dạng queue, một đầu đọc, một đầu ghi.

Buffer cũng có thể làm trung gian để truyền data giữa hai process.

Cache
Thường là một lớp lưu trữ memory để giữ lại các data thường được sử dụng nhằm giảm việc truy cập đến các storage có tốc độ chậm hơn. Một data vừa được ghi thì sẽ sớm được đọc. Nguyên tắc này dẫn đến các data vừa ghi sẽ được đưa vào cache ngay để phục vụ cho thao tác đọc sau này.

Mở rộng ra, cache còn có thể là các static file được sử dụng thường xuyên, nằm trên proxy nhằm giảm việc truy cập đến các backend hoặc cũng có thể là một container chứa các object, nằm trên tầng web nhằm giảm truy cập đến db.

Comments

comments