Pembilasan latar belakang pada Linux terjadi ketika terlalu banyak data tertulis yang tertunda (dapat disesuaikan melalui / proc / sys / vm / dirty_background_ratio) atau batas waktu untuk penulisan yang tertunda tercapai (/ proc / sys / vm / dirty_expire_centisecs). Kecuali jika ada batasan lain yang dipukul (/ proc / sys / vm / dirty_ratio), lebih banyak data tertulis dapat di-cache. Penulisan lebih lanjut akan memblokir.
Secara teori, ini harus membuat proses latar belakang menulis halaman kotor tanpa mengganggu proses lain. Dalam praktiknya, hal itu mengganggu proses apa pun yang melakukan pembacaan yang tidak dibatasi atau penulisan yang sinkron. Sangat. Ini karena background flush benar-benar menulis pada kecepatan perangkat 100% dan permintaan perangkat lain pada saat ini akan tertunda (karena semua antrian dan cache-cache di jalan dipenuhi).
Apakah ada cara untuk membatasi jumlah permintaan per detik yang dilakukan oleh proses pembilasan, atau memprioritaskan perangkat I / O lainnya secara efektif?
sumber
Jawaban:
Setelah banyak melakukan benchmark dengan sysbench, saya sampai pada kesimpulan ini:
Untuk bertahan hidup (kinerja-bijaksana) situasi di mana
cukup buang semua elevator, antrian, dan cache halaman kotor. Tempat yang benar untuk halaman kotor adalah dalam RAM cache tulis perangkat keras itu.
Sesuaikan dirty_ratio (atau dirty_bytes baru) serendah mungkin, tetapi perhatikan throughput sekuensial. Dalam kasus khusus saya, 15 MB adalah optimal (
echo 15000000 > dirty_bytes
).Ini lebih merupakan peretasan daripada solusi karena gigabyte RAM sekarang digunakan hanya untuk membaca caching daripada cache kotor. Agar cache kotor dapat bekerja dengan baik dalam situasi ini, flusher latar belakang kernel Linux perlu rata-rata pada kecepatan apa perangkat yang mendasarinya menerima permintaan dan menyesuaikan pembilasan latar belakang yang sesuai. Tidak mudah.
Spesifikasi dan tolok ukur untuk perbandingan:
Diuji sementara
dd
nol ke disk, sysbench menunjukkan keberhasilan besar , meningkatkan 10 utas menulis fsync pada 16 kB dari 33 hingga 700 IOPS (batas idle: 1500 IOPS) dan satu utas dari 8 hingga 400 IOPS.Tanpa beban, IOPS tidak terpengaruh (~ 1500) dan throughput sedikit berkurang (dari 251 MB / dtk menjadi 216 MB / dtk).
dd
panggilan:untuk sysbench, test_file.0 dipersiapkan untuk tidak digunakan dengan:
panggilan sysbench untuk 10 utas:
panggilan sysbench untuk satu utas:
Ukuran blok yang lebih kecil menunjukkan angka yang lebih drastis.
--file-block-size = 4096 dengan 1 GB dirty_bytes:
--file-block-size = 4096 dengan 15 MB dirty_bytes:
--file-block-size = 4096 dengan 15 MB dirty_bytes pada sistem idle:
sysbench 0.4.12: tolok ukur evaluasi sistem multi-utas
Sistem uji:
Singkatnya, saya sekarang yakin konfigurasi ini akan berkinerja baik dalam situasi siaga, beban tinggi, dan bahkan beban penuh untuk lalu lintas basis data yang jika tidak akan kelaparan oleh lalu lintas berurutan. Throughput sekuensial lebih tinggi dari dua tautan gigabit yang dapat ditayangkan, jadi tidak ada masalah untuk mengurangi sedikit.
sumber
dirty_bytes
harus hampir tidak cukup tinggi untuk tidak menghentikan CPU saat proses sedang menulis jika proses sedang menulis rata - rata dengan throughput perangkat. Jika kode aplikasi Anda melakukan siklus perhitungan besar diikuti dengan menulis data dalam jumlah besar, jika akan sangat sulit untuk dioptimalkan karena rata-rata waktu singkat sangat berbeda dari rata-rata lama. Solusi yang benar adalah dengan menyesuaikandirty_bytes
pengaturan proses spesifik tetapi Linux tidak mendukung hal seperti itu sejauh yang saya tahu.Meskipun menyetel parameter kernel menghentikan masalah, sebenarnya kemungkinan masalah kinerja Anda adalah akibat bug pada pengontrol Adaptec 5405Z yang diperbaiki dalam pembaruan firmware 1 Februari 2012. Catatan rilis mengatakan "Memperbaiki masalah di mana firmware dapat menggantung selama stres I / O tinggi." Mungkin menyebarkan I / O seperti yang Anda lakukan sudah cukup untuk mencegah bug ini dipicu, tapi itu hanya dugaan.
Berikut adalah catatan rilis: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Bahkan jika ini bukan kasus untuk situasi khusus Anda, saya pikir ini dapat bermanfaat bagi pengguna yang menemukan posting ini di masa depan. Kami melihat beberapa pesan seperti berikut ini di output dmesg kami yang akhirnya membawa kami ke pembaruan firmware:
Berikut adalah nomor model pengontrol RAID Adaptec yang tercantum dalam catatan rilis untuk firmware yang memiliki I / O hang fix yang tinggi: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
sumber
Kernel yang termasuk "WBT":
WBT tidak perlu beralih ke lapisan blok blk-mq baru. Yang mengatakan, itu tidak bekerja dengan penjadwal I / O CFQ atau BFQ. Anda dapat menggunakan WBT dengan batas waktu / mq-deadline / noop / none schedulers. Saya percaya ini juga bekerja dengan penjadwal I / O "kyber" yang baru.
Selain penskalaan ukuran antrian untuk mengontrol latensi, kode WBT membatasi jumlah permintaan penulisan kembali latar belakang sebagai proporsi dari batas antrian yang dihitung.
Konfigurasi runtime dalam
/sys/class/block/*/queue/wbt_lat_usec
.Opsi konfigurasi build yang dicari adalah
Pernyataan masalah Anda dikonfirmasi 100% oleh penulis WBT - well done :-).
sumber
Berapa rata-rata untuk Dirty di / proc / meminfo? Ini seharusnya tidak melebihi / proc / sys / vm / dirty_ratio Anda. Pada server file khusus saya telah mengatur dirty_ratio ke persentase memori yang sangat tinggi (90), karena saya tidak akan pernah melampauinya. Dirty_ration Anda terlalu rendah, ketika Anda memukulnya, semuanya hancur, naikkan.
sumber