Linux - penyetelan pengontrol RAID perangkat keras dunia nyata (scsi dan cciss)

29

Sebagian besar sistem Linux yang saya kelola memiliki fitur pengontrol RAID perangkat keras (kebanyakan HP Smart Array ). Mereka semua menjalankan RHEL atau CentOS.

Saya mencari tunable dunia nyata untuk membantu mengoptimalkan kinerja untuk pengaturan yang menggabungkan pengontrol RAID perangkat keras dengan disk SAS (Smart Array, Perc, LSI, dll.) Dan cache yang didukung oleh baterai atau cache yang didukung flash. Asumsikan RAID 1 + 0 dan beberapa spindel (4+ disk).

Saya menghabiskan banyak waktu menyetel pengaturan jaringan Linux untuk latensi rendah dan aplikasi perdagangan finansial. Tetapi banyak dari opsi-opsi tersebut didokumentasikan dengan baik (mengubah buffer kirim / terima, mengubah pengaturan jendela TCP, dll.). Apa yang dilakukan para insinyur di sisi penyimpanan?

Secara historis, saya telah membuat perubahan pada lift penjadwalan I / O , baru-baru ini memilih deadlinedan nooppenjadwal untuk meningkatkan kinerja dalam aplikasi saya. Karena versi RHEL telah mengalami kemajuan, saya juga memperhatikan bahwa default yang dikompilasi untuk perangkat blok SCSI dan CCISS telah berubah juga. Ini berdampak pada pengaturan subsistem penyimpanan yang disarankan dari waktu ke waktu. Namun, sudah beberapa saat sejak saya melihat rekomendasi yang jelas. Dan saya tahu bahwa standar OS tidak optimal. Sebagai contoh, tampaknya buffer read-ahead standar 128kb sangat kecil untuk penyebaran pada perangkat keras kelas server.

Artikel-artikel berikut mengeksplorasi dampak kinerja dari mengubah cache baca-depan dan nilai nr_requests pada antrian blok.

http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with -linux-why-tuning-really-matter
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html

Misalnya, ini adalah perubahan yang disarankan untuk pengontrol RAID Cerdas Array:

echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler 
blockdev --setra 65536 /dev/cciss/c0d0
echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests
echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb

Apa lagi yang bisa disetel secara andal untuk meningkatkan kinerja penyimpanan?
Saya secara khusus mencari opsi sysctl dan sysfs dalam skenario produksi.

putih
sumber

Jawaban:

38

Saya telah menemukan bahwa ketika saya harus menyetel untuk latensi vs throughput yang lebih rendah, saya telah menyetel nr_requests turun dari defaultnya (ke serendah 32). Idenya menjadi kumpulan yang lebih kecil sama dengan latensi yang lebih rendah.

Juga untuk read_ahead_kb Saya telah menemukan bahwa untuk membaca / menulis berurutan, meningkatkan nilai ini menawarkan throughput yang lebih baik, tetapi saya telah menemukan bahwa opsi ini sangat tergantung pada beban kerja dan pola IO Anda. Sebagai contoh pada sistem database yang baru-baru ini saya atur, saya mengubah nilai ini untuk mencocokkan ukuran halaman db tunggal yang membantu mengurangi latensi baca. Menambah atau mengurangi di luar nilai ini terbukti merusak kinerja dalam kasus saya.

Adapun opsi atau pengaturan lain untuk memblokir antrian perangkat:

max_sectors_kb = Saya telah menetapkan nilai ini untuk mencocokkan dengan apa yang diperbolehkan oleh perangkat keras untuk satu transfer (periksa nilai file max_hw_sectors_kb (RO) di sysfs untuk melihat apa yang diizinkan)

nomerges = ini memungkinkan Anda menonaktifkan atau menyesuaikan logika pencarian untuk menggabungkan permintaan io. (mematikan ini dapat menghemat beberapa siklus cpu, tapi saya belum melihat manfaat apa pun ketika mengubah ini untuk sistem saya, jadi saya membiarkannya default)

rq_affinity = Saya belum mencoba ini, tapi di sini ada penjelasan di baliknya dari kernel docs

Jika opsi ini adalah '1', lapisan blok akan memigrasikan penyelesaian permintaan ke "grup" cpu yang awalnya mengirimkan permintaan. Untuk beberapa beban kerja ini memberikan pengurangan signifikan dalam siklus CPU karena efek caching.
Untuk konfigurasi penyimpanan yang perlu memaksimalkan distribusi pengaturan penyelesaian penyelesaian, opsi ini untuk '2' memaksa penyelesaian untuk berjalan pada cpu yang meminta (melewati logika agregasi "grup") "

scheduler = Anda mengatakan bahwa Anda mencoba tenggat waktu dan noop. Saya telah menguji noop dan deadline, tetapi telah menemukan deadline win's out untuk pengujian yang saya lakukan baru-baru ini untuk server database.

NOOP berkinerja baik, tetapi untuk server basis data kami, saya masih dapat mencapai kinerja yang lebih baik dengan menyesuaikan jadwal waktu.

Opsi untuk penjadwal tenggat waktu berada di bawah / sys / block / {sd, cciss, dm -} * / queue / iosched /:

fifo_batch = jenis seperti nr_requests, tetapi khusus untuk penjadwal. Aturan praktis adalah tune down ini untuk latensi yang lebih rendah atau naik untuk throughput. Mengontrol ukuran batch permintaan baca dan tulis.

write_expire = menetapkan waktu kedaluwarsa untuk penulisan batch default adalah 5000ms. Sekali lagi mengurangi nilai ini mengurangi latensi tulis Anda sambil meningkatkan nilai meningkatkan throughput.

read_expire = menetapkan waktu kedaluwarsa untuk bets bacaan default adalah 500 ms . Aturan yang sama berlaku di sini.

front_merges = Saya cenderung mematikannya, dan ini aktif secara default. Saya tidak melihat perlunya penjadwal untuk membuang siklus cpu mencoba untuk depan menggabungkan permintaan IO.

writ_starved = karena tenggat waktu diarahkan untuk membaca default di sini adalah untuk memproses 2 batch baca sebelum batch menulis diproses. Saya menemukan default 2 baik untuk beban kerja saya.

rtorti19
sumber
7
... dan itulah cara Anda memposting jawaban pertama Anda ke sebuah situs. Sudah selesai dilakukan dengan baik!
Jeff Ferland
1
Ini adalah awal yang baik dan menjalankan tes berulang dalam kondisi terkontrol telah membantu saya sedikit men-tweak kinerja aplikasi. Ini juga membantu untuk melihat bagaimana saya bisa menyetel penyimpanan untuk tren beban kerja umum.
ewwhite
4

Lebih dari segalanya, semuanya tergantung pada beban kerja Anda.

read_ahead_kbdapat membantu Anda jika sangat membantu untuk membaca banyak data dari beberapa file sebelumnya, seperti saat streaming video. Terkadang itu bisa sangat menyakitimu. Ya, 128 KB default bisa terdengar kecil, tetapi dengan konkurensi yang cukup mulai terdengar seperti besar! Di sisi lain, dengan server seperti server pengkodean video yang hanya mengubah video dari satu format ke format lain, itu mungkin ide yang sangat bagus untuk disesuaikan.

nr_requests, ketika overtuned, dapat dengan mudah membanjiri controller RAID Anda, yang lagi-lagi mengganggu kinerja.

Di dunia nyata, Anda perlu menonton latensi . Jika Anda terhubung ke SAN, lihatlah iostat, saratau apa pun yang Anda suka gunakan, dan lihat apakah I / O meminta waktu layanan melalui atap. Tentu saja ini juga membantu disk lokal: jika latensi sangat besar, pertimbangkan untuk menyetel pengaturan lift I / O Anda dengan menurunkan versi max_requests dan pengaturan lainnya.

Janne Pikkarainen
sumber
Pengaturan lain mana?
ewwhite
4

FYI read_ahead_kbdan blockdev --setrahanya cara berbeda untuk mengatur pengaturan yang sama menggunakan unit yang berbeda (kB vs sektor):

foo:~# blockdev --setra 65536 /dev/cciss/c0d0
foo:~# blockdev --getra /dev/cciss/c0d0
65536
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
32768
foo:~# echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
2048
foo:~# blockdev --getra /dev/cciss/c0d0
4096

Sehingga

blockdev --setra 65536 /dev/cciss/c0d0

dalam contoh Anda tidak memiliki efek.

tidak ada
sumber