Berjuang untuk sumber daya, bagian 4: Hebat

Kami akan berurusan dengan regulator dari subsistem penyimpanan data dan melihat apa yang mereka izinkan Anda lakukan dalam arti blok I / O.



Yang sangat menarik di sini adalah bahwa kita memasuki wilayah di mana perubahan pada pengaturan yang dibuat setelah sistem diluncurkan jauh lebih tidak penting daripada keputusan yang dibuat bahkan sebelum penyebarannya.

Lihatlah gambar di bawah ini.



Ini menyajikan empat sumber daya utama bahwa komputer modern perlu berfungsi dengan baik. Penyelarasan kinerja adalah seni mendistribusikan sumber daya ini secara optimal di antara proses aplikasi. Selain itu, semua sumber daya ini tidak terbatas dan tidak setara dalam hal dampak terhadap produktivitas.

Kinerja subsistem penyimpanan direduksi menjadi kinerja teknologi penyimpanan yang digunakan di dalamnya: hard drive, SSD, SAN, NAS - mereka dapat sangat bervariasi dalam kecepatan akses dan throughput. Dan prosesor yang kuat dan banyak memori tidak akan menyelamatkan situasi jika perangkat penyimpanan tidak memenuhi persyaratan tugas yang diselesaikan.

Jika Anda, sebagai spesialis Linux, dapat memengaruhi keputusan perangkat keras, cobalah memastikan organisasi Anda memiliki platform penyimpanan yang memadai (atau lebih unggul). Ini akan menghemat banyak masalah di masa depan.

Sekarang mari kita lihat apa yang dapat dilakukan dengan bantuan kontrol input / output (I / O).

Ini semua tentang perangkat penyimpanan


Secara resmi, pengontrol I / O disebut blkio, tetapi dalam suasana hati yang baik, ia merespons ke Blocky. Seperti pengontrol CPU, Blocky memiliki dua mode operasi:

  • Penyesuaian menggunakan bola I / O relatif (saham), yang memungkinkan Anda untuk mengontrol kinerja di tingkat semua atau perangkat penyimpanan blok yang dipilih dengan menetapkan nilai dalam kisaran dari 10 hingga 1000. Secara default, 1000 digunakan, sehingga setiap perubahan hanya mengurangi bola I / O Pengguna atau layanan yang dipilih. Mengapa 1000, bukan 1024, seperti dalam kasus CPU? Pertanyaan yang bagus Rupanya, ini adalah kasus ketika sifat terbuka Linux tidak baik untuknya.
  • Penyesuaian bandwidth absolut untuk membatasi kecepatan baca dan / atau tulis untuk pengguna atau layanan tertentu. Secara default, mode ini dinonaktifkan.

Tangkapan layar di bawah ini menunjukkan parameter yang dapat disesuaikan menggunakan perintah systemctl. Di sini kami menggunakan keajaiban konfirmasi otomatis pada tombol Tab untuk menampilkan daftar opsi. Ini disebut penyelesaian-bash, dan jika Anda masih tidak menggunakan fungsi ini, saatnya untuk menginstal PRM yang sesuai.



Bola I / O relatif dikontrol oleh parameter BlockIODeviceWeight dan BlockIOWeight. Sebelum bermain dengan pengontrol ini, Anda perlu memahami ini: mereka hanya berfungsi jika Penjadwal I / O CFQ diaktifkan untuk perangkat penyimpanan.

Apa itu penjadwal I / O? Mari kita mulai dari jauh dan ingat bahwa kernel Linux bertanggung jawab untuk memastikan bahwa semua komponen perangkat keras komputer saling berkomunikasi dengan benar. Dan karena semua komponen ini pada saat yang sama menginginkan hal yang berbeda, seseorang tidak dapat melakukannya tanpa memesan. Nah, bagaimana kita, misalnya, mengatur hidup kita, menyusunnya untuk pekerjaan, istirahat, tidur, dan sebagainya.

Jika kita berbicara tentang perangkat penyimpanan, maka penjadwal I / O bertanggung jawab untuk mengatur pekerjaan mereka di dalam kernel. Ini hanya kode program yang mendefinisikan cara untuk mengontrol aliran data untuk perangkat blok, mulai dari USB flash drive dan hard drive ke disk virtual, yang sebenarnya file di suatu tempat di perangkat ISCI di SAN.

Dan di atas semua perangkat ini yang dapat digunakan di Linux, ada berbagai tugas yang harus dilakukan komputer. Selain itu, dalam kehidupan nyata, ada apa yang kami di Red Hat sebut "kasus penggunaan." Itulah sebabnya ada berbagai perencana yang berfokus pada skenario yang berbeda. Penjadwal ini disebut noop, deadline dan cfq. Singkatnya, masing-masing dapat dijelaskan sebagai berikut:

  • Noop - cocok untuk perangkat penyimpanan blok yang tidak memiliki bagian yang berputar (flash, SSD, dll.).
  • Tenggat adalah penjadwal ringan yang berfokus pada meminimalkan penundaan. Secara default, ini mengutamakan membaca dengan mengorbankan penulisan, karena sebagian besar aplikasi gagal membaca.
  • Cfq - berfokus pada distribusi bandwidth I / O yang adil pada tingkat sistem-lebar. Dan seperti yang kami katakan di atas, ini adalah satu-satunya penjadwal yang mendukung opsi I / O relatif untuk cgroup.

Untuk informasi lebih lanjut tentang penjadwal , lihat Panduan Penyesuaian Kinerja Red Hat Enterprise Linux 7.

Apa semua diskusi tentang perencana ini? Selain itu, pada kebanyakan komputer cfq TIDAK DIGUNAKAN secara default jika mereka tidak memiliki drive SATA. Tanpa mengetahui hal ini, Anda dapat mengubah BlockIOWeight hingga Anda membiru tanpa efek apa pun. Sayangnya, systemd tidak akan memberi tahu Anda: "Maaf, Anda mencoba mengubah parameter ini dengan sia-sia. Ini tidak akan berfungsi karena perangkat menggunakan penjadwal yang salah. "

Jadi bagaimana Anda bisa mengetahui tentang fitur "menarik" ini? Seperti biasa, dari dokumentasi cgroup yang kami tulis di posting sebelumnya. Itu selalu berguna untuk membiasakan diri dengan itu sebelum menggunakan ini atau regulator itu.

Kami lolos ke use case


Sekali lagi kami beralih dari kata-kata umum ke spesifik: izinkan saya memperkenalkan Anda kepada Mr. Kryakin.

Dia terlibat dalam katering, dan dia memiliki dua database di server aplikasi untuk melacak pesanan. Bpk. Kryakin bersikeras bahwa basis data pesanan untuk hidangan bebek jauh lebih penting daripada basis untuk hidangan angsa, karena angsa adalah penipu di atas takhta unggas air.

Kedua database dikonfigurasikan sebagai layanan, dan file unitnya terlihat seperti ini:



Sebenarnya, skrip yang dipanggil (duck.sh dan angsa.sh) tidak melakukan pekerjaan nyata dalam database, tetapi hanya mensimulasikan membaca dan menulis menggunakan loop perintah dd. Kedua skrip menggunakan sistem file / database, yang terletak pada disk virtualnya.



Mari kita lari bebek dan angsa dan melihat di mana mereka mendarat di hierarki cgroup:





Dan sekarang, karena kita tahu PID dari proses dd, mari kita beralih ke perintah iotop untuk melihat apa yang terjadi di subsistem penyimpanan:



Ya, 12-14 MB / s ... tidak cepat. Tampaknya Pak Kryakin tidak berinvestasi banyak dalam sistem penyimpanan data. Meskipun kami sudah memiliki pertanyaan tentang kecukupannya, jadi tidak ada yang lebih mengejutkan.

Sekarang kita melihat dua tugas kita: PID 3301 (angsa) dan PID 3300 (bebek). Masing-masing menggunakan I / O di suatu tempat sekitar 6 MB / s. Layar di atas adalah angka yang agak berbeda, tetapi dalam kenyataannya mereka terus-menerus melompat, dan rata-rata, kedua tugas ini sama-sama berbagi bandwidth perangkat penyimpanan.

Tn. Kryakin ingin bebek memiliki bandwidth I / O setidaknya 5 kali lebih banyak daripada angsa, sehingga pesanan bebek selalu diproses terlebih dahulu. Mari kita coba gunakan parameter BlockIOWeight untuk ini dengan perintah berikut:



Kami melihat iotop dan melihat bahwa itu tidak berfungsi:



Mari kita periksa penjadwal I / O untuk perangkat / dev / vdb:



Menarik ... Kami mencoba mengubah scheduler menjadi cfq dan tidak ada hasilnya. Mengapa

Faktanya adalah bahwa sistem kami berjalan pada mesin virtual KVM, dan ternyata mulai dari versi 7.1, penjadwal tidak lagi dapat diubah di Red Hat Enterprise Linux. Dan ini bukan bug, tetapi fitur yang berkaitan dengan peningkatan mekanisme untuk bekerja dengan perangkat I / O tervirtualisasi.

Tapi jangan putus asa. Kami memiliki dua parameter lagi yang dapat diubah: BlockIOReadBandwidth dan BlockIOWriteBandwidth beroperasi pada level perangkat blok dan mengabaikan penjadwal I / O. Karena kita mengetahui bandwidth perangkat / dev / vdb (sekitar 14 MB / s untuk penerimaan dan untuk output), membatasi angsa menjadi 2 MB / s, kita tampaknya dapat memenuhi keinginan Tuan Kryakin. Mari kita coba:





Kita melihat: PID 3426, alias angsa, sekarang menggunakan I / O di suatu tempat sekitar 2 MB / s, dan PID 3425, yaitu, bebek, untuk hampir semua 14!

Hore, kami melakukan apa yang diinginkan pelanggan, yang berarti kami menyelamatkan tidak hanya sejumlah angsa, tetapi juga reputasi kami sebagai guru Linux.

Source: https://habr.com/ru/post/id427413/


All Articles