Pengaturan Readahead untuk LVM, Device-Mapper, Raid Software dan Block Device - apa yang menang?

26

Saya telah mencoba untuk menemukan jawaban langsung untuk yang satu ini, dan itu terbukti sulit dipahami. Pertanyaan ini dan jawabannya sudah dekat, tetapi tidak benar-benar memberi saya spesifik yang saya inginkan. Mari kita mulai dengan apa yang saya pikir saya tahu.

Jika Anda memiliki perangkat blok standar dan Anda menjalankan sudo blockdev --reportAnda akan mendapatkan sesuatu seperti ini:

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

Sekarang, Anda memutuskan untuk mengubah default 256 menjadi 128 menggunakan --setrasalah satu partisi dan itu terjadi pada seluruh perangkat blok, seperti:

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

Ini masuk akal bagi saya - perangkat tingkat blok adalah tempat pengaturan, bukan partisi, jadi semuanya berubah. Juga hubungan default antara pengaturan RA dan perangkat masuk akal bagi saya, umumnya:

RA * sector size (default = 512 bytes)

Oleh karena itu, perubahan yang saya buat di atas, dengan ukuran sektor default akan turun readahead dari 128k ke 64k. Semua baik dan bagus sejauh ini.

Namun, apa yang terjadi ketika kita menambahkan RAID perangkat lunak, atau LVM dan device-mapper? Bayangkan laporan Anda terlihat seperti ini sebagai gantinya:

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

Dalam hal ini kami memiliki perangkat LVM yang dipetakan perangkat di atas md0 yang dibuat oleh mdadm, yang sebenarnya merupakan garis RAID0 di keempat perangkat xvdg-j.

Baik md0 dan dm-0 memiliki pengaturan 4096 untuk RA, jauh lebih tinggi daripada perangkat blok. Jadi, beberapa pertanyaan di sini:

  • Bagaimana pengaturan RA diturunkan dari rantai perangkat blok virtual?
  • Apakah dm-0 mengalahkan semua karena itu adalah perangkat blok tingkat atas yang sebenarnya Anda akses?
  • Akan lvchange -rberdampak pada perangkat dm-0 dan tidak muncul di sini?

Jika sesederhana, pengaturan RA dari perangkat blok virtual yang Anda gunakan diteruskan, apakah itu berarti bahwa pembacaan dari dm-0 (atau md0) akan diterjemahkan menjadi 4 x 4096 RA dibaca? (satu di setiap perangkat blok). Jika demikian, itu berarti bahwa pengaturan ini meledak ukuran readahead dalam skenario di atas.

Kemudian dalam hal mencari tahu apa yang sebenarnya dilakukan pengaturan readahead:

Apa yang Anda gunakan, setara dengan ukuran sektor di atas untuk menentukan nilai readahead sebenarnya untuk perangkat virtual:

  • Ukuran garis RAID (untuk md0)?
  • Beberapa ukuran sektor lain yang setara?
  • Apakah bisa dikonfigurasi, dan bagaimana?
  • Apakah FS berperan (saya terutama tertarik pada ext4 dan XFS)?
  • Atau, jika baru saja diteruskan, apakah itu hanya pengaturan RA dari perangkat tingkat atas dikalikan dengan ukuran sektor dari perangkat blok nyata?

Akhirnya, apakah akan ada hubungan yang disukai antara ukuran garis dan pengaturan RA (misalnya)? Di sini saya berpikir bahwa jika strip adalah elemen terkecil yang akan ditarik dari perangkat RAID, Anda idealnya tidak ingin harus ada 2 akses disk ke layanan unit data minimum dan ingin membuat RA cukup besar untuk memenuhi permintaan dengan satu akses.

Adam C
sumber
Distribusi Linux apa yang Anda gunakan? Apakah Anda menggunakan serangan perangkat keras atau perangkat lunak? Sepertinya perangkat lunak. Jika perangkat keras, kartu / chipset apa yang Anda gunakan sebanyak ini diatur dan disimpan dalam firmware perangkat.
Jason Huntley
Juga, pengaturan RA sangat tergantung pada skema alokasi sistem file Anda. Apakah Anda menggunakan ext4?
Jason Huntley
Saya sebenarnya menyebutkan bahwa itu perangkat lunak RAID dan LVM dalam pertanyaan, jadi ya - perangkat lunak. Dalam hal sistem file, saya akan tertarik pada perbedaan antara XFS dan ext4 di sini, jawaban untuk keduanya akan lebih baik
Adam C
XFS dapat disetel untuk kinerja yang lebih baik. Itu dibahas di beberapa tempat di situs ini: di sini dan di sini ... Distribusi Linux apa yang Anda gunakan? Itu memainkan faktor karena ada beberapa alat distribusi khusus yang tersedia juga.
ewwhite
Ini bukan pertanyaan kinerja, ini lebih spesifik - Saya hanya ingin tahu tentang pengaturan RA dan bagaimana mereka menerjemahkan / berinteraksi dengan lapisan LVM / Perangkat Lunak RAID
Adam C

Jawaban:

11

Bagaimana pengaturan RA diturunkan dari rantai perangkat blok virtual?

Tergantung. Mari kita asumsikan Anda berada di dalam dom Xen dan memiliki RA = 256. / Dev / xvda1 Anda adalah LV aktual pada dom0 yang terlihat di bawah / dev / dm1. Jadi, Anda memiliki RA (domU (/ dev / xvda1)) = 256 dan RA (dom0 (/ dev / dm1)) = 512. Ini akan memiliki efek sedemikian rupa sehingga dom0 kernel akan mengakses / dev / dm1 dengan RA lain daripada kernel domU. Sederhana seperti itu.

Sittutation lain akan terjadi jika kita menganggap sittuation / 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

Pengaturan / dev / md0 RA tidak akan mempengaruhi / dev / sdX blockdevices.

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

Jadi secara umum menurut saya kernel mengakses blockdevice dengan cara yang sebenarnya diatur. Satu volume logis dapat diakses melalui RAID (bagian dari itu) atau perangkat devicemapper dan masing-masing dengan RA lain yang akan dihormati.

Jadi jawabannya adalah - pengaturan RA adalah IMHO tidak diturunkan rantai blockdevice, tetapi apa pun perangkat RA tingkat atas, akan digunakan untuk mengakses perangkat konstituen

Apakah dm-0 mengalahkan semua karena itu adalah perangkat blok tingkat atas yang sebenarnya Anda akses?

Jika Anda maksud propagasi mendalam dengan "trump all" - sesuai komentar saya sebelumnya saya pikir Anda mungkin memiliki RA yang berbeda untuk perangkat yang berbeda dalam sistem.

Apakah lvchange -r berdampak pada perangkat dm-0 dan tidak muncul di sini?

Ya tapi ini adalah kasus khusus. Mari kita asumsikan bahwa kita memiliki / dev / dm0 yang merupakan LVM / dev / vg0 / blockdevice. Jika kamu melakukan:

lvchange -r 512 /dev/vg0/blockdevice

/ dev / dm0 juga akan berubah karena / dev / dm0 dan / dev / vg0 / blockdevice sama persis dengan perangkat blok ketika menyangkut akses kernel.

Tetapi mari kita asumsikan bahwa / dev / vg0 / blockdevice sama dengan / dev / dm0 dan / dev / xvda1 di Xen domU yang menggunakannya. Pengaturan RA dari / dev / xvda1 akan berlaku tetapi dom0 akan melihat masih memiliki RA itu sendiri.

Apa yang Anda gunakan, setara dengan ukuran sektor di atas untuk menentukan nilai readahead sebenarnya untuk perangkat virtual:

Saya biasanya menemukan RA dengan bereksperimen dengan nilai-nilai yang berbeda dan mengujinya dengan hdparm.

Ukuran garis RAID (untuk md0)?

Sama seperti di atas.

Apakah FS berperan (saya terutama tertarik pada ext4 dan XFS)?

Tentu - ini adalah topik yang sangat besar. Saya sarankan Anda mulai di sini http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
sumber
Ini sangat dekat dengan apa yang saya cari, dan apa yang saya duga - dapatkah Anda menjernihkan satu hal untuk saya: dalam situasi / dev / md0 (/ dev / sda1, / dev / sda2) saya tahu bahwa Anda dapat mengatur pisahkan nilai-nilai RA, tetapi jika Anda, katakan mount / data pada / dev / md0 dan bacalah file darinya - apakah RA 512 digunakan untuk membaca dari / dev / sda1 dan / dev / sda2 (yaitu 512 digunakan untuk keduanya) atau Apakah 256 digunakan pada masing-masing? Jika yang pertama tampaknya bijaksana untuk memiliki RAID0 RA diatur ke: SUM (RA perangkat di RAID0)
Adam C
1
Hanya menceritakan dari pengalaman saya - pengaturan RA = 512 pada / dev / md0 dengan disk / dev / sdX di bawah, bertindak persis sama seperti kami memiliki akses ke / dev / sdX dengan RA = 512 meskipun misalnya misalnya kita dapat memiliki RA = 256 pengaturan pada perangkat blok bawah. Pengaturan 256 akan diabaikan dalam kasus ini (perhatikan bahwa / dev / sda tidak berguna sebagai perangkat block jika itu adalah bagian dari / dev / md0). Saya bukan pemrogram kernel tetapi ini tampaknya logis dan tampaknya dikonfirmasi oleh praktik saya. Jadi, reassuming. 3 utas membaca dari / dev / md0, RA = 512 sama dengan 3 utas membaca dari / dev / sd {a, b, c} dengan RA = 512.
wojciechz
Terima kasih banyak! Saya telah mengedit sedikit hal untuk memperjelas jawabannya. Bisakah saya bertanya satu hal lagi sebelum saya menerimanya? Apakah Anda memiliki contoh (atau tautan ke satu) untuk menggunakan hdparm untuk menguji RA? Saya akan melakukan sesuatu yang serupa sendiri, jadi jika ada referensi yang baik itu akan menghemat waktu saya.
Adam C
Ini tidak rumit, tetapi tergantung apa yang ingin Anda periksa. Silakan merujuk ke manual hdparm. Jika Anda ingin memeriksa disk reads (yang merupakan turunan dari readahead) Anda dapat mengeluarkan perintah seperti hdparm -t / dev / md0 . Hasilnya akan menampilkan sesuatu seperti Timing buffered disk berbunyi: 310 MB dalam 3,02 detik = 102,79 MB / detik . Nilai terakhir biasanya sangat dipengaruhi oleh pengaturan RA.
wojciechz
1
ah, jadi bukan pengukuran langsung - dipahami, menerima sekarang - terima kasih atas bantuannya :)
Adam C
4

Ketahui jawabannya lebih sulit untuk dijelaskan, jadi saya akan melakukannya sebagai contoh. Katakan demi ini, Anda memiliki 3 perangkat blok dan Anda mengatur RA Anda untuk mengatakan 4 (4 * 512 byte) dengan asumsi sektor standar. Jika Anda mengatakan menggunakan skema RAID-5 menggunakan 3 disk, bacaan apa pun yang menyentuh garis pada disk unik akan menambah RA dengan faktor yang awalnya Anda atur perangkat blokir RA. Jadi jika Anda membaca persis semua 3 disk maka RA efektif Anda akan menjadi 12 * 512 byte. Ini dapat diperparah dengan menetapkan RA di berbagai tingkatan, misalnya MD atau LVM. Sebagai aturan praktis, jika aplikasi saya mendapat manfaat dari RA, saya mengaturnya di lapisan tertinggi sehingga saya tidak perlu menambah RA dengan tidak perlu. Saya kemudian memulai sistem file pada sektor 2049 dan mengimbangi setiap sektor mulai pada angka yang dapat dibagi dengan 8. Saya mungkin jauh dari apa yang Anda minta tetapi ini adalah 2 ¢ saya.

Bill Clark
sumber
Jadi, Anda mengatakan bahwa apa pun pengaturan RA pada perangkat tingkat atas, itu hanya akan diturunkan. Oleh karena itu, jika Anda menggunakan LVM -> 2 x RAID -> masing-masing 4 x disk fisik dan Anda memiliki RA dari 4, maka karena ada 8 perangkat fisik, Anda berakhir dengan RA yang efektif dari 32. Bagaimana Anda akan men-tweak ukuran chunk / stripe dari RAID menjadi efisien dalam skenario itu - saya berasumsi Anda ingin RA untuk menutupi seluruh strip sehingga Anda tidak perlu mengakses dua kali?
Adam C
BTW, jika saya mendapatkan ini dengan benar, dalam skenario yang saya jelaskan, saya pikir saya ingin memiliki chunk / strip dari set RAID0 menjadi X, di mana X = RA * 512bytes. Karena itu, jika saya memiliki chunk / stripe 64k (mdadm default) maka RA minimum yang harus saya gunakan adalah 128 karena itu membuat saya seluruh strip dalam satu tembakan.
Adam C