Xác định số lượng LVM cho tệp đã cho


9

Tôi hiện đang tham gia vào một bài tập về nhà không liên quan đến công việc. Tôi có một hệ thống tập tin ext4 ngồi trên một khối hợp lý. Tôi đang thử nghiệm các chiến lược điều chỉnh hiệu suất khác nhau và ý tưởng này đã xảy ra với tôi. Vì pvmove có thể di chuyển từng phạm vi và phạm vi của phạm vi, nên có cách để vạch ra những phạm vi vật lý nào chứa một tệp cụ thể (theo lý thuyết, nó có thể sao lưu các tệp cho cơ sở dữ liệu hoặc chia sẻ tệp lớn thường được truy cập) và di chuyển chúng đến một cụ thể thiết bị lưu trữ (ví dụ: tôi có ổ cứng thông thường và ổ SSD trong cùng Tập đoàn LVM)?

Tôi đã nghĩ đến việc sử dụng "filefrag" nhưng sau đó tôi nhận ra rằng tôi không phải là 100% về việc liệu số lượng có nhất thiết phải được sử dụng theo thứ tự hay không (vì vậy biết có bao nhiêu lĩnh vực trong ext4 thấy một tệp không nhất thiết phải cho phép Tôi tìm ra mức độ số lượng / khối lượng tập tin đang ngồi trên.

Có ý kiến ​​gì không?

Câu trả lời:


13

Hai thành phần chính là hdparm --fibmap file, cho bạn biết tập tin nằm ở đâu trong LV và lvs -o +seg_pe_ranges,vg_extent_sizecho bạn biết LV nằm ở đâu trên thiết bị của bạn.

Phần còn lại là toán học.

Ví dụ:

# hdparm --fibmap linux-3.8.tar.bz2 

linux-3.8.tar.bz2:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0     288776     298511       9736
     4984832     298520     298623        104
     5038080     298640     298695         56
     5066752     298736     298799         64
     5099520     298824     298895         72
     [...]

Tôi không biết tại sao điều này quá phân mảnh - được tải xuống với wget. Có thể là một ví dụ tốt bởi vì như bạn thấy, bạn bị đau đầu mà không có kịch bản này bằng cách nào đó, ít nhất là cho các tệp bị phân mảnh. Tôi sẽ chỉ lấy đoạn đầu tiên 288776-298511 (9736 ngành). Số lượng là sai vì nó không phải là 512 byte, nhưng dù sao đi nữa.

Trước tiên hãy kiểm tra xem dữ liệu này có thực sự chính xác không:

# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

Wheeee.Đó giống hệt nhau nên chúng tôi đang đọc LV-src ở đúng nơi. Bây giờ nguồn LV nằm ở đâu?

# lvs -o +seg_pe_ranges,vg_extent_size
  LV          VG   Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert PE Ranges             Ext   

[...]
 src         lvm  -wi-ao---   4.00g                                            /dev/dm-1:5920-6047   32.00m
[...]

Bây giờ thật nhàm chán, LV này không bị phân mảnh. Không đau đầu ở đây. Dù sao.

Nó nói src là trên / dev / dm-1 và bắt đầu ở PE 5920 và kết thúc ở PE 6047. Và kích thước PE là 32 MiB.

Vì vậy, hãy xem liệu chúng ta có thể đọc điều tương tự từ / dev / dm-1 không. Về mặt toán học, đây là một chút rắc rối vì chúng tôi đã sử dụng kích thước khối 512 byte trước đó ...: - / nhưng tôi lười nên tôi chỉ tính MiB và sau đó chia cho 512! Hà! : -D

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685  -

Boo Boo. Đây không phải là những gì chúng ta đang tìm kiếm. Có chuyện gì? Ah! Chúng tôi đã quên thêm phần bù mà LVM đã sử dụng vào đầu PV để lưu trữ siêu dữ liệu và crap LVM. Thông thường đây là liên kết MiB, vì vậy chỉ cần thêm một MiB khác:

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

Có bạn có nó.


3
Một ngày nào đó họ sẽ xây tượng để tôn vinh bạn.
Bratchley

Mặc dù vậy, có một ý tưởng nào đó về lý do tại sao việc gọi hdparm của tôi bị sai lệch ?
Bratchley

Trên thực tế, tấn công đó, có vẻ như tôi cần phải cải thiện trên google-fu của mình . Đây là một lỗi mới của RHEL liên quan đến SSD và LVM. Tôi sẽ hiểu điều này có nghĩa là tập tin đã có trên SSD. Hà
Bratchley

Có tiện ích nào khác để xác định vị trí của tệp trong LV cho đến khi họ khắc phục điều này không?
Bratchley

Bạn đã đề cập đến nó - filefrag. Nếu không thì google nếu có công cụ nào khác làm sơ đồ hoặc sơ đồ.
frostschutz
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.