Làm thế nào để ghi bộ đệm hoạt động với một đĩa hệ thống tập tin với tốc độ khác nhau?


9

Trên một hệ thống Linux hiện đại có nhiều đĩa và RAID phần mềm bao gồm cả ổ đĩa chậm (HDD) và ổ đĩa nhanh (SSD), làm thế nào để ghi vào hệ thống tập tin được lưu trong bộ nhớ cache?

Đối với md-raid RAID1, mảng có thể được cấu hình với các đĩa --write-mostly--write-behindđiều đó cho thấy việc đọc được thực hiện từ đĩa nhanh hơn và việc ghi vào đĩa chậm hơn có thể bị tụt lại phía sau. Nhưng làm thế nào mà được lưu trữ ở cấp độ kernel? Liệu kernel cache mà đĩa ghi trước hay sau lớp md-raid? Vào cuối cuộc gọi write (), dữ liệu có được đảm bảo được ghi vào một trong các --write-behindđĩa không?

Đối với btrfsRAID1, tình huống tương tự sẽ diễn ra như thế nào? Không có --write-behindchức năng, vậy các trang bẩn có được tính ở cấp thiết bị hoặc cấp hệ thống tệp không? Tại điểm nào thì một write () trở lại?

Làm thế nào để điều chỉnh vm.dirty_*ratioảnh hưởng đến các thiết lập?

Câu trả lời:


7

Các --write-mostly, --write-behindđược xử lý bởi các mdtrình điều khiển trong nội bộ. mdgiữ siêu dữ liệu, như bitmap có mục đích ghi (bắt buộc đối với tính năng ghi phía sau) về cơ bản ghi nhật ký dữ liệu nào đã được ghi so với dữ liệu nào vẫn còn thiếu. Điều này là cần thiết trong trường hợp có sự kiện mất điện, khi dữ liệu chưa đến thiết bị ghi chủ yếu. Trong trường hợp đó, vùng dữ liệu bị ảnh hưởng sẽ được đồng bộ hóa lại (trong trường hợp của bạn đọc từ SSD, ghi vào ổ cứng).

Nhưng làm thế nào mà được lưu trữ ở cấp độ kernel?

Đối với trường hợp ghi phía sau, trình điều khiển md về cơ bản sao chép yêu cầu ghi bên trong. Yêu cầu ghi chính đi đến (các) ổ đĩa chính và nói với các lớp phía trên "OK tôi đã thực hiện điều này rồi"; yêu cầu ghi được sao chép sau đó ở lại cho phía ghi phần lớn phía sau của RAID và có thể mất nhiều thời gian hơn để hoàn thành, hy vọng mà không ai nhận ra.

Sau đó, lớp đột kích thực hiện rất nhiều bước để đảm bảo không có dữ liệu nào được đọc từ thiết bị ghi chủ yếu trong khi vẫn còn các yêu cầu ghi phía sau đang chờ xử lý trong hàng đợi. Tại sao dữ liệu sẽ được đọc từ một thiết bị chủ yếu là ghi? Chà, SSD có thể đã thất bại nên tất cả chỉ còn lại. Nó phức tạp, và viết phía sau giới thiệu một số trường hợp góc.

Đó có lẽ cũng là lý do tại sao nó chỉ được hỗ trợ cho cấp độ RAID-1 chứ không phải bất kỳ cấp độ nào khác. Mặc dù về mặt lý thuyết, có thể có SSD về cơ bản là RAID-0 và hai ổ cứng tương đương ở chế độ ghi phía sau, nhưng không có hỗ trợ cho RAID-6 ghi phía sau như thế. Đó chỉ là RAID-1 và hiếm khi được sử dụng ngay cả ở đó.

Các cài đặt bộ đệm khác vẫn không bị ảnh hưởng bởi điều này, về cơ bản, cơ chế bộ đệm chung không quan tâm đến việc mdtrình điều khiển đã triển khai mọi thứ bên trong như thế nào . Bộ nhớ cache thực hiện công việc của nó và md thực hiện công việc của nó. Vì vậy, bộ đệm hệ thống tập tin hoạt động tương tự cho một hệ thống tập tin trên đầu md so với hệ thống tập tin trên đầu ổ đĩa trống. (Thực tế là một chút phức tạp hơn thế nhưng bạn có thể nghĩ về nó theo cách này.)


3

Đối với md-raid RAID1, mảng có thể được cấu hình với các đĩa --write-mostly--write-behindđiều đó cho thấy việc đọc được thực hiện từ đĩa nhanh hơn và việc ghi vào đĩa chậm hơn có thể bị tụt lại phía sau. Nhưng làm thế nào mà được lưu trữ ở cấp độ kernel? Liệu kernel cache mà đĩa ghi trước hay sau lớp md-raid?

Sau đó, vì tính năng này là dành riêng cho md-raid.

Bạn nên nghĩ về tính năng md-raid này như là bộ đệm, không phải bộ đệm. Nó được giới hạn bởi mdadmtùy chọn sau :

--write-đằng sau =

Chỉ định rằng chế độ ghi phía sau phải được bật (chỉ hợp lệ cho RAID1). Nếu một đối số được chỉ định, nó sẽ đặt số lần ghi xuất sắc tối đa được phép. Giá trị mặc định là 256.

Tôi chỉ có thể nghĩ rằng nó cũng bị giới hạn bởi bộ đệm nhân và phần cứng thông thường (tức là nếu nó nhỏ hơn). Bộ đệm nhân bình thường được giới hạn bởi nr_requestsmax_hw_sectors_kb. Xem /sys/class/block/$write_behind_device/queue/. Bằng cách đệm phần cứng, tôi có nghĩa là bộ đệm ghi trên ổ đĩa.

Vào cuối cuộc gọi write (), dữ liệu có được đảm bảo được ghi vào một trong các --write-behindđĩa không?

Tất nhiên, giả sử bạn có nghĩa là write () nằm trên một tệp được mở bằng O_SYNC / O_DSYNC hoặc bạn thực sự có nghĩa là write () + fsync (). Nếu không, không có đảm bảo áp dụng ở tất cả.


Cảm ơn, nhưng điều đó đặt ra một câu hỏi khác: nếu tệp được mở bằng O_SYNC, liệu write () có trở lại sau khi đĩa đầu tiên được ghi vào hoặc tất cả các đĩa đã được ghi vào trong trường hợp này không?
Steven Davies

3
việc ghi phụ vào các đĩa không ghi phía sau phải hoàn thành trước
sourcejedi
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.