Mengatur perilaku cache disk Linux untuk throughput maksimum

12

Saya mengalami masalah throughput maksimum di sini dan butuh saran tentang cara mengatur tombol-tombol saya. Kami sedang menjalankan server file 10Gbit untuk distribusi cadangan. Ini adalah pengaturan dua disk S-ATA2 pada LSI MegaRAID Controller. Server juga mendapat 24gig memori.

Kami harus mencerminkan cadangan yang terakhir kami unggah dengan throughput maksimum.

RAID0 untuk cadangan "panas" kami memberi kami sekitar 260 MB / detik tulis dan 275 MB / detik dibaca. Tmpfs yang diuji dengan ukuran 20GB memberi kita sekitar 1GB / detik. Jenis throughput inilah yang kami butuhkan.

Sekarang bagaimana saya bisa menyetel subsistem memori virtual Linux untuk men-cache file yang terakhir diunggah selama mungkin dalam memori tanpa menuliskannya ke disk (atau bahkan lebih baik: menulis ke disk DAN menyimpannya dalam memori)?

Saya mengatur sysctl berikut, tetapi mereka tidak memberi kami throughput yang kami harapkan:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

Ini seharusnya secara teori memberi kita 16GB untuk caching I / O dan tunggu beberapa menit sampai tulisannya di disk. Masih ketika saya melakukan benchmark server saya tidak melihat efek pada penulisan, throughput tidak meningkat.

Dibutuhkan bantuan atau saran.

Peter Meyer
sumber
Bukankah lebih masuk akal untuk mulai menulis sesegera mungkin? Kalau tidak, ia mencapai ukuran buffer maksimum dan tiba-tiba terhenti. Jika sudah menulis sepanjang itu memberi Anda lebih banyak waktu.
Zan Lynx
Saya memiliki memori 20GB hanya untuk buffer, karena aplikasi saya (berbasis linux + vsftpd) digunakan di bawah 4GB (total 24GB). Cadangan saya kurang dari 20GB. Jika saya bisa membuatnya ditulis dalam buffer dan kemudian dituliskan ke disk secara berurutan setelah proses pencadangan, ini akan mengurangi downtime sumber pencadangan saya (server virtual) secara signifikan. PS: Server bisa berhenti setelah itu, tidak masalah. Butuh 30 menit untuk pulih :)
Peter Meyer
Kedengarannya seperti aplikasi apa pun yang Anda gunakan untuk mentransfer data melalui jaringan yang menyinkronkannya ke disk. Anda akan ingin membuatnya tidak melakukan hal itu sehingga data hanya dapat duduk di cache, meskipun saya mempertanyakan mengapa Anda ingin dapat memecah banyak data seperti itu lebih cepat daripada disk dapat menjaga. Itu menunjuk pada cacat desain di suatu tempat.
psusi
Kedengarannya seperti cacat: solusi cadangan Anda seharusnya tidak mengharuskan server dimatikan sepanjang waktu.
psusi
1
@PeterMeyer: Sekalipun Anda memiliki banyak RAM, masih merupakan kesalahan untuk menunggu penulisan dimulai. Satu-satunya waktu yang masuk akal sama sekali adalah jika Anda akan mengedit atau menghapus file (seperti file sementara) sebelum sampai ke disk. Cadangan tidak melakukan itu. Anda ingin memulai penulisan latar belakang sesegera mungkin. Atur background_ratio Anda menjadi 1 atau 2.
Zan Lynx

Jawaban:

6

Dengan melihat variabel-variabel yang telah Anda tetapkan, sepertinya Anda lebih mementingkan kinerja penulisan dan tidak peduli dengan kemungkinan hilangnya data karena pemadaman listrik.

Anda hanya akan mendapatkan opsi untuk penulisan malas dan penggunaan cache writeback dengan operasi penulisan asinkron. Operasi penulisan sinkron memerlukan komit ke disk dan tidak akan menjadi malas-ditulis - selamanya. Sistem file Anda mungkin sering menyebabkan flush halaman dan penulisan sinkron (biasanya karena penjurnalan, terutama dengan ext3 dalam data = mode jurnal). Selain itu, bahkan flushes halaman "latar belakang" akan mengganggu pembacaan yang tidak tersimpan dan penulisan yang sinkron , sehingga memperlambatnya.

Secara umum, Anda harus mengambil beberapa metrik untuk melihat apa yang terjadi - apakah Anda melihat proses penyalinan Anda dimasukkan ke dalam status "D" menunggu pekerjaan I / O dilakukan oleh pdflush? Apakah Anda melihat aktivitas penulisan sinkron berat pada disk Anda?

Jika semuanya gagal, Anda dapat memilih untuk membuat sistem file tmpfs eksplisit tempat Anda menyalin cadangan Anda dan hanya menyinkronkan data dengan disk Anda setelah fakta - bahkan secara otomatis menggunakan inotify

Untuk membaca cache, hal-hal secara signifikan lebih mudah - ada fadviseutilitas fcoretools yang memiliki --willneedparameter untuk menyarankan kernel untuk memuat konten file ke dalam cache buffer.

Edit:

vm.dirty_ratio = 70

Ini seharusnya secara teori memberi kita 16GB untuk caching I / O dan tunggu beberapa menit sampai tulisannya dimasukkan ke disk.

Ini tidak akan sangat mempengaruhi skenario pengujian Anda, tetapi ada kesalahpahaman dalam pemahaman Anda. Parameter dirty_ratio bukan persentase dari total memori sistem Anda, tetapi lebih dari memori bebas sistem Anda .

Ada artikel tentang Tuning untuk beban Write-Heavy dengan informasi lebih mendalam.

the-wabbit
sumber
Ya, saya setelah menulis kinerja. Waktu yang diperlukan untuk menyebar cadangan ke budak cadangan bukan urusan saya. Saya juga memiliki skrip untuk transmisi ulang, jika server cadangan utama gagal dan cadangan tidak sampai ke budak cadangan. PS Saya sudah membaca tautan dan menyetel sesuai. Maaf atas kesalahan tentang gratis vs buffered vs total.
Peter Meyer
3

Atau hanya mendapatkan lebih banyak disk ... Konfigurasi array drive yang Anda miliki tidak mendukung seluruh yang Anda butuhkan. Ini adalah kasus di mana solusinya harus direkayasa ulang untuk memenuhi kebutuhan nyata Anda. Saya mengerti bahwa ini hanya cadangan, tetapi masuk akal untuk menghindari perbaikan kludgy.

putih
sumber
Sepakat. Tidak ada cara beberapa SATA ( SATA ? Serius?) Drive akan mempertahankan 275MB / s, dan kita bahkan tidak berbicara tentang IOP buruk yang akan Anda dapatkan dari mereka.
adaptr
1
Saya bisa melihat ke mana dia menuju - karena ini hanya tujuan cadangan data, dia tidak peduli tentang kemungkinan hilangnya data sesekali karena pemadaman listrik. Dan dia ingin meminimalkan waktu yang dibutuhkan untuk jendela cadangan dengan menyediakan throughput maksimal yang tersedia - 20 GB data dapat ditulis dalam waktu kurang dari 30 detik dengan cara ini. Jika cadangan melibatkan downtime atau dampak layanan karena suatu alasan, 30 detik pasti lebih mudah untuk mendapatkan lebih dari 20 menit.
the-wabbit
BENAR-BENAR benar. Saya menyinkronkan gambar mesin virtual (yang sangat kecil untuk menghitung node) yang turun saat sinkronisasi. Aplikasi ini berfungsi seperti tar | ssh tetapi menggunakan ftp. Dan well, simulasi perlu dijalankan ... :)
Peter Meyer
1
Tidak peduli apa pun jenis SATA mereka. Disk non-perusahaan 7200RPM tidak bisa menjamin throughput atau latensi.
adapttr
1
@adaptr, cadangan akan menjadi menulis berurutan.
psusi
1

Menggunakan cache memori dapat menyiratkan hilangnya data seolah-olah ada yang salah, data yang ada di memori dan tidak disimpan ke disk akan hilang.

Yang mengatakan, ada penyetelan yang harus dilakukan di tingkat filesystem.

Misalnya, Jika Anda menggunakan ext4, Anda bisa mencoba opsi mount:

penghalang = 0

Bahwa: "menonaktifkan penggunaan penghalang tulis dalam kode jbd. Hambatan tulis memberlakukan pemesanan jurnal yang dilakukan di disk, membuat cache tulisan volatile disk aman untuk digunakan, pada beberapa penalti kinerja. Jika disk Anda didukung baterai dengan satu cara atau yang lain, menonaktifkan penghalang dapat dengan aman meningkatkan kinerja. Opsi mount "barrier" dan "nobarrier" juga dapat digunakan untuk mengaktifkan atau menonaktifkan penghalang, untuk konsistensi dengan opsi mount ext4 lainnya. "

Lebih lanjut di: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt

Peter Senna
sumber
Saya menggunakan XFS yang sangat dicari. Lebih lanjut tentang yang berkaitan dengan itu disetel dalam komentar di atas :)
Peter Meyer
Sistem file dibuat dengan mkfs.xfs -l lazy-count = 1, versi = 2, ukuran = 256m -i attr = 2 -d sunit = 512, swidth = 1024 dan dipasang dengan: rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, mengalokasikan = 256k
Peter Meyer