Cài đặt Readahead cho LVM, Thiết bị lập bản đồ thiết bị, Raid phần mềm và Thiết bị chặn - chiến thắng là gì?


26

Tôi đã cố gắng tìm một câu trả lời thẳng vào câu hỏi này, và nó đã tỏ ra khó nắm bắt. Câu hỏi này và câu trả lời của nó rất gần, nhưng không thực sự cung cấp cho tôi các chi tiết cụ thể mà tôi muốn. Hãy bắt đầu với những gì tôi nghĩ rằng tôi biết.

Nếu bạn có một thiết bị khối tiêu chuẩn và bạn chạy, sudo blockdev --reportbạn sẽ nhận được một cái gì đó như thế này:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0    500107862016   /dev/sda
rw   256   512  4096       2048    399999238144   /dev/sda1
rw   256   512  1024  781252606            1024   /dev/sda2

Bây giờ, bạn quyết định thay đổi 256 thành 128 mặc định đó bằng cách sử dụng --setratrên bất kỳ phân vùng nào và điều đó xảy ra với toàn bộ thiết bị khối, như vậy:

sudo blockdev --setra 128 /dev/sda1
sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   128   512  4096          0    500107862016   /dev/sda
rw   128   512  4096       2048    399999238144   /dev/sda1
rw   128   512  1024  781252606            1024   /dev/sda2

Điều này có ý nghĩa hoàn hảo với tôi - thiết bị cấp khối là nơi cài đặt chứ không phải phân vùng, vì vậy tất cả đều thay đổi. Ngoài ra, mối quan hệ mặc định giữa cài đặt RA và thiết bị có ý nghĩa với tôi, nói chung là:

RA * sector size (default = 512 bytes)

Do đó, những thay đổi tôi đã thực hiện ở trên, với kích thước cung mặc định sẽ giảm giá trị đọc từ 128k xuống còn 64k. Tất cả tốt và tốt cho đến nay.

Tuy nhiên, điều gì xảy ra khi chúng ta thêm vào một phần mềm RAID, hoặc LVM và trình ánh xạ thiết bị? Thay vào đó hãy tưởng tượng báo cáo của bạn trông như thế này:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0     10737418240   /dev/xvda1
rw   256   512  4096          0    901875499008   /dev/xvdb
rw   256   512  4096          0    108447924224   /dev/xvdj
rw   256   512  4096          0    108447924224   /dev/xvdi
rw   256   512  4096          0    108447924224   /dev/xvdh
rw   256   512  4096          0    108447924224   /dev/xvdg
rw  4096   512  4096          0    433787502592   /dev/md0
rw  4096   512   512          0    429496729600   /dev/dm-0

Trong trường hợp này, chúng tôi có một thiết bị LVM dm-0 được ánh xạ trên md0 được tạo bởi mdadm, trên thực tế là một dải RAID0 trên bốn thiết bị xvdg-j.

Cả md0 và dm-0 đều có cài đặt 4096 cho RA, cao hơn nhiều so với các thiết bị khối. Vì vậy, một số câu hỏi ở đây:

  • Làm thế nào để cài đặt RA được truyền xuống chuỗi thiết bị khối ảo?
  • Có dm-0 át tất cả bởi vì đó là thiết bị chặn cấp cao nhất mà bạn đang thực sự truy cập?
  • Sẽ lvchange -rcó tác động đến thiết bị dm-0 và không hiển thị ở đây?

Nếu nó đơn giản như, cài đặt RA từ thiết bị khối ảo mà bạn đang sử dụng được truyền vào, điều đó có nghĩa là việc đọc từ dm-0 (hoặc md0) sẽ dịch thành 4 x 4096 RA đọc? (một trên mỗi thiết bị khối). Nếu vậy, điều đó có nghĩa là các cài đặt này sẽ làm nổ kích thước của giá trị đọc trong kịch bản trên.

Sau đó, về mặt tìm hiểu những gì thiết lập readahead thực sự đang làm:

Bạn sử dụng gì, tương đương với kích thước cung ở trên để xác định giá trị đọc thực tế cho thiết bị ảo:

  • Kích thước sọc của RAID (cho md0)?
  • Một số ngành khác tương đương với quy mô?
  • Nó có thể cấu hình, và làm thế nào?
  • Có phải FS đóng một phần (tôi chủ yếu quan tâm đến ext4 và XFS)?
  • Hoặc, nếu nó được truyền lại, có phải chỉ đơn giản là cài đặt RA từ thiết bị cấp cao nhất nhân với kích thước cung của các thiết bị khối thực?

Cuối cùng, liệu có bất kỳ mối quan hệ ưa thích nào giữa kích thước sọc và cài đặt RA (ví dụ) không? Ở đây tôi nghĩ rằng nếu dải là phần tử nhỏ nhất sẽ bị loại khỏi thiết bị RAID, thì lý tưởng nhất là bạn không muốn có 2 truy cập đĩa để phục vụ đơn vị dữ liệu tối thiểu đó và muốn tạo RA đủ lớn để thực hiện yêu cầu với một truy cập duy nhất.


Bạn đang sử dụng bản phân phối Linux nào? Bạn đang sử dụng cuộc đột kích phần cứng hay phần mềm? Có vẻ như phần mềm. Nếu phần cứng, bạn đang sử dụng thẻ / chipset nào thì phần này được đặt và lưu trữ trong phần sụn của thiết bị.
Jason Huntley

Ngoài ra, cài đặt RA phụ thuộc rất nhiều vào sơ đồ phân bổ hệ thống tệp của bạn. Bạn đang sử dụng ext4?
Jason Huntley

Tôi thực sự đề cập rằng đó là phần mềm RAID và LVM trong câu hỏi, vì vậy có - phần mềm. Về hệ thống tập tin, tôi sẽ quan tâm đến sự khác biệt giữa XFS và ext4 ở đây, câu trả lời cho một trong hai sẽ tốt mặc dù
Adam C

XFS có thể được điều chỉnh rất nhiều để có hiệu suất tốt hơn. Điều đó được đề cập ở một vài nơi trên trang web này: ở đâyđây ... Bạn đang sử dụng bản phân phối Linux nào? Điều đó đóng một yếu tố bởi vì cũng có một số công cụ dành riêng cho phân phối.
ewwhite

Đây không phải là một câu hỏi về hiệu năng, nó cụ thể hơn - tôi chỉ muốn biết về cài đặt RA và cách chúng dịch qua / tương tác với các lớp RAID LVM / Phần mềm
Adam C

Câu trả lời:


11

Làm thế nào để cài đặt RA được truyền xuống chuỗi thiết bị khối ảo?

Nó phụ thuộc. Giả sử bạn đang ở trong Xen domU và có RA = 256. / Dev / xvda1 của bạn là LV thực tế trên dom0 hiển thị dưới / dev / dm1. Vậy bạn có RA (domU (/ dev / xvda1)) = 256 và RA (dom0 (/ dev / dm1)) = 512. Nó sẽ có hiệu ứng như vậy mà kernel dom0 sẽ truy cập / dev / dm1 với RA khác so với kernel của domU. Đơn giản như thế.

Một sự thay đổi khác sẽ xảy ra nếu chúng ta giả định / dev / md0 (/ dev / sda1, / dev / sda2).

blockdev --report | grep sda
rw   **512**   512  4096          0   1500301910016   /dev/sda
rw   **512**   512  4096       2048      1072693248   /dev/sda1
rw   **512**   512  4096    2097152   1499227750400   /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw   **256**   512  4096          0   1500301910016   /dev/sda
rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2

Cài đặt / dev / md0 RA sẽ không ảnh hưởng đến các khối / dev / sdX.

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

Vì vậy, nói chung theo quan điểm của tôi, kernel truy cập blockdevice theo cách thực sự được đặt. Một khối lượng logic có thể được truy cập thông qua RAID (đó là một phần của) hoặc thiết bị devicemapper và mỗi thiết bị có RA khác sẽ được tôn trọng.

Vì vậy, câu trả lời là - cài đặt RA là IMHO không được truyền xuống chuỗi blockdevice, nhưng bất kể cài đặt RA của thiết bị cấp cao nhất là gì, sẽ được sử dụng để truy cập các thiết bị cấu thành

Có dm-0 át tất cả bởi vì đó là thiết bị chặn cấp cao nhất mà bạn đang thực sự truy cập?

Nếu bạn có nghĩa là truyền bá sâu sắc bằng "át chủ bài" - theo nhận xét trước đây của tôi, tôi nghĩ rằng bạn có thể có RA khác nhau cho các thiết bị khác nhau trong hệ thống.

Lvchange -r có ảnh hưởng đến thiết bị dm-0 và không hiển thị ở đây không?

Có nhưng đây là một trường hợp cụ thể. Giả sử rằng chúng ta có / dev / dm0 là LVM's / dev / vg0 / blockdevice. Nếu bạn làm:

lvchange -r 512 /dev/vg0/blockdevice

/ dev / dm0 cũng sẽ thay đổi vì / dev / dm0 và / dev / vg0 / blockdevice chính xác là cùng một thiết bị khối khi nói đến quyền truy cập kernel.

Nhưng hãy giả sử rằng / dev / vg0 / blockdevice giống như / dev / dm0 và / dev / xvda1 trong Xen domU đang sử dụng nó. Đặt RA của / dev / xvda1 sẽ có hiệu lực nhưng dom0 sẽ thấy vẫn có RA riêng.

Bạn sử dụng gì, tương đương với kích thước cung ở trên để xác định giá trị đọc thực tế cho thiết bị ảo:

Tôi thường khám phá RA bằng cách thử nghiệm các giá trị khác nhau và thử nghiệm nó với hdparm.

Kích thước sọc của RAID (cho md0)?

Giống như trên.

Có phải FS đóng một phần (tôi chủ yếu quan tâm đến ext4 và XFS)?

Chắc chắn - đây là một chủ đề rất lớn. Tôi khuyên bạn nên bắt đầu tại đây http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php


Điều này rất gần với những gì tôi đang tìm kiếm và những gì tôi nghi ngờ - bạn có thể làm rõ một điều cho tôi: trong tình huống / dev / md0 (/ dev / sda1, / dev / sda2) tôi biết rằng bạn có thể đặt tách các giá trị RA, nhưng nếu bạn, giả sử mount / data trên / dev / md0 và đọc một tệp từ nó - thì 512 RA có được sử dụng để đọc từ / dev / sda1 và / dev / sda2 (tức là 512 được sử dụng cho cả hai) 256 được sử dụng trên mỗi? Nếu trước đây có vẻ khôn ngoan khi đặt RAID0 RA thành: SUM (RA của các thiết bị trong RAID0)
Adam C

1
Chỉ cần nói theo kinh nghiệm của tôi - cài đặt RA = 512 trên / dev / md0 với các đĩa / dev / sdX bên dưới, hoạt động chính xác như chúng ta đã truy cập vào / dev / sdX với RA = 512 mặc dù vậy, ví dụ chúng ta có thể có RA = 256 thiết lập trên blockdevice dưới cùng. Cài đặt 256 sẽ bị bỏ qua trong trường hợp này (lưu ý rằng / dev / sda là vô dụng như một blockdevice nếu đó là một phần của / dev / md0). Tôi không phải là một lập trình viên hạt nhân nhưng điều này có vẻ hợp lý và dường như được xác nhận bởi thực tiễn của tôi. Vì vậy, đánh giá lại. 3 luồng đọc từ / dev / md0, RA = 512 bằng 3 luồng đọc từ / dev / sd {a, b, c} với RA = 512.
wojciechz

Cảm ơn rất nhiều! Tôi đã chỉnh sửa mọi thứ một chút để làm cho rõ ràng hơn trong câu trả lời. Tôi có thể hỏi thêm một điều nữa trước khi tôi chấp nhận không? Bạn có một ví dụ (hoặc liên kết đến một) để sử dụng hdparm để kiểm tra RA không? Tôi sẽ tự mình làm một cái gì đó tương tự, vì vậy nếu có một tài liệu tham khảo tốt, nó sẽ giúp tôi tiết kiệm thời gian.
Adam C

Nó không phức tạp, nhưng phụ thuộc vào những gì bạn muốn kiểm tra. Vui lòng tham khảo hướng dẫn sử dụng hdparm. Nếu bạn muốn kiểm tra các lần đọc đĩa (là một dẫn xuất của readahead), bạn có thể ra lệnh như hdparm -t / dev / md0 . Kết quả sẽ hiển thị một cái gì đó giống như đĩa đệm thời gian đọc: 310 MB trong 3.02 giây = 102,79 MB / giây . Giá trị cuối cùng thường bị ảnh hưởng mạnh bởi cài đặt RA.
wojciechz

1
à, vậy không phải là một phép đo trực tiếp - đã hiểu, chấp nhận ngay bây giờ - cảm ơn vì sự giúp đỡ :)
Adam C

4

Biết câu trả lời khó giải thích hơn nên tôi sẽ làm như vậy trong ví dụ. Nói vì lợi ích của việc này, bạn có 3 thiết bị khối và bạn đặt RA thành 4 (4 * 512 byte) giả định cung cấp tiêu chuẩn. Nếu bạn muốn sử dụng sơ đồ RAID-5 bằng 3 đĩa, thì mọi lần đọc thậm chí chạm vào một dải trên một đĩa duy nhất sẽ kết hợp RA theo yếu tố ban đầu bạn đặt RA thiết bị chặn. Vì vậy, nếu đọc của bạn kéo dài chính xác cả 3 đĩa thì RA hiệu quả của bạn sẽ là 12 * 512 byte. Điều này có thể được kết hợp bởi giải quyết RA ở các cấp độ khác nhau, ví dụ MD hoặc LVM. Theo nguyên tắc thông thường, nếu ứng dụng của tôi được hưởng lợi từ RA, tôi sẽ đặt nó ở lớp cao nhất có thể để tôi không kết hợp RA một cách không cần thiết. Sau đó, tôi bắt đầu hệ thống tập tin trên sector 2049 và bù cho mỗi sector bắt đầu bằng một số chia hết cho 8. Tôi có thể bỏ qua những gì bạn đang hỏi nhưng đây là 2 của tôi.


Vì vậy, bạn đang nói rằng bất cứ cài đặt RA nào trên thiết bị cấp cao nhất, nó sẽ chỉ được truyền lại. Do đó, nếu bạn đã sử dụng LVM -> 2 x RAID -> 4 x đĩa vật lý và bạn có RA là 4, thì vì có 8 thiết bị vật lý, bạn kết thúc với RA hiệu quả là 32. Bạn sẽ điều chỉnh như thế nào kích thước chunk / sọc của RAID có hiệu quả trong kịch bản đó - Tôi giả sử bạn muốn RA bao phủ toàn bộ một dải để bạn không phải truy cập hai lần?
Adam C

BTW, nếu tôi hiểu đúng, trong kịch bản mà tôi mô tả, tôi nghĩ rằng tôi muốn có một đoạn / dải của RAID0 được đặt thành X, trong đó X = RA * 512byte. Do đó, nếu tôi có một đoạn / dải 64k (mặc định mdadm) thì RA tối thiểu tôi nên sử dụng là 128 vì điều đó giúp tôi có được toàn bộ dải trong một lần chụp.
Adam C

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.