Haruskah kita melakukan mount dengan data = writeback dan barrier = 0 pada ext3?

13

Kami telah menjalankan server pada VM di perusahaan hosting, dan baru saja mendaftar untuk host yang berdedikasi (AMD Opteron 3250, 4 core, 8GB RAM, 2 x 1TB dalam perangkat lunak RAID, ext3).

Saat menjalankan tes kinerja, kami perhatikan bahwa beberapa transisi SQLite (kombinasi sisipan, penghapusan dan / atau pembaruan) membutuhkan waktu 10x hingga 15x lebih lama daripada pada MacBook Pro 2010 saya.

Setelah banyak googling dan membaca, kami harus melihat opsi pemasangan, yaitu:

    data=ordered,barrier=1

Kami telah melakukan beberapa percobaan, dan mendapatkan kinerja terbaik

    data=writeback,barrier=0

Saya sudah membaca ini, dan memahami dasar-dasar apa yang mereka lakukan, tetapi saya tidak memiliki perasaan / perasaan yang baik untuk apakah itu ide yang baik untuk kita jalankan seperti ini?

Pertanyaan

Apakah konfigurasi di atas bahkan masuk akal untuk dipertimbangkan untuk layanan yang dihosting?

Jika kami mengalami pemadaman listrik, atau kerusakan parah, maka kami mungkin berakhir dengan data yang hilang, atau file rusak. Jika kami mengambil snapshot dari DB setiap 15 menit, itu mungkin mengurangi situasi, tetapi DB mungkin tidak disinkronkan ketika snapshot diambil. Bagaimana seharusnya (dapat?) Kita memastikan integritas snapshot seperti itu?

Apakah ada opsi lain yang harus kita pertimbangkan?

Terima kasih

NeilB
sumber
Banyak faktor yang terlibat. Apakah Anda mengharapkan banyak crash keras? Apakah Anda memiliki UPS (atau sesuatu yang setara) yang terhubung ke mesin yang dihosting? Apakah Anda melakukan pembandingan dengan sistem file lain (mis. Ext4, XFS, dll.)? Bisakah Anda mengontrol ((de) mengaktifkan) cache HDD? Bagaimana Anda mengkonfigurasi RAID perangkat lunak Anda? Apakah Anda HDD selaras dengan benar (jika memiliki blok 4K)?
Huygens
Kami tidak berharap banyak crash keras. Kami tidak memiliki UPS. Spesifikasi mesin adalah standar "dari rak" dari perusahaan hosting, jadi: kami tidak melakukan benchmark fs lainnya, ext3 adalah apa yang kami dapatkan. Tidak tahu tentang cache HDD, akan melihatnya, dan juga untuk penyelarasan RAID dan HDD. Terima kasih.
NeilB
Pertanyaan lain yang saya lupa adalah berapa banyak nilai sejarah yang bisa Anda tanggung untuk kehilangan? Atau Anda tidak mampu membayar kehilangan? Catatan: SQLite mendukung snapshot, atau dengan kata lain mencadangkan database yang sedang berjalan. sqlite.org/backup.html
Huygens
Apa versi kernel Anda? Hambatan dihormati oleh md sejak 2.6.33, tidak dalam rilis kernel sebelumnya.
Huygens
uname -r melaporkan "2.6.32-220.2.1.el6.x86_64". Apa itu "md"? Jika hambatan tidak dihormati dalam versi kernel ini, mengapa saya melihat peningkatan kinerja ketika mematikan hambatan?
NeilB

Jawaban:

15

Saran pertama
Jika Anda tidak mampu kehilangan data apa pun (maksud saya setelah pengguna memasukkan data baru, jika itu tidak dapat hilang dalam beberapa detik mendatang) dan karena Anda tidak memiliki sesuatu seperti UPS, maka saya tidak akan menghapus penghalang penulisan, saya juga tidak akan beralih ke writeback.

Menghapus penghalang tulis
Jika Anda menghapus penghalang tulis, maka dalam kasus crash atau kehilangan daya, sistem file perlu melakukan fsck untuk memperbaiki struktur disk (perhatikan bahwa bahkan dengan penghalang AKTIF, kebanyakan sistem file penjurnalan akan tetap melakukan fsck bahkan meskipun replay jurnal seharusnya sudah cukup). Saat menghapus penghalang tulis, disarankan untuk menghapus semua cache disk (di perangkat keras) jika memungkinkan, ini membantu meminimalkan risiko. Anda harus membandingkan dampak dari perubahan tersebut. Anda dapat mencoba perintah ini (jika perangkat keras Anda mendukungnya) hdparm -W0 /dev/<your HDD>.
Perhatikan bahwa ext3 menggunakan 2 hambatan untuk perubahan metadata, sedangkan ext4 hanya menggunakan satu hambatan saat menggunakan opsi mount journal_async_commit.

Meskipun Ted T'so menjelaskan mengapa beberapa data korupsi terjadi pada hari-hari awal ext3 (hambatan dinonaktifkan secara default hingga Kernel 3.1 ), jurnal ditempatkan dengan cara yang kecuali terjadi pembungkus log jurnal (jurnal adalah log siklik) data akan ditulis ke disk dalam urutan yang aman - jurnal pertama, data kedua - bahkan dengan hard disk mendukung penataan ulang penulisan.
Pada dasarnya, akan sial bahwa sistem crash atau kehilangan daya terjadi ketika jurnal log wrap. Namun, Anda harus tetap menggunakannya data=ordered. Coba patok dengan data=ordered,barrier=0tambahan.

Jika Anda mampu kehilangan beberapa detik data, Anda bisa mengaktifkan kedua opsi data=writeback,barrier=0tetapi kemudian mencoba bereksperimen dengan commit=<nrsec>parameter juga. Periksa manual untuk parameter ini di sini . Pada dasarnya Anda memberikan sejumlah detik yang merupakan periode sistem file ext3 akan menyinkronkan data dan metadata-nya.
Anda dapat mencoba juga bermain-main dan melakukan benchmark dengan beberapa kernel kernel mengenai halaman-halaman kotor (mereka yang perlu menulis ke disk), ada artikel bagus di sini yang menjelaskan segalanya tentang merdu ini dan cara bermain dengannya.

Ringkasan tentang hambatan
Anda harus membuat tolok ukur beberapa kombinasi merdu yang lain:

  1. Gunakan data=writeback,barrier=0bersama denganhdparm -W0 /dev/<your HDD>
  2. Menggunakan data=ordered,barrier=0
  3. Gunakan data=writeback,barrier=0bersama dengan opsi mount lain commit=<nrsec>dan coba nilai yang berbeda untuk nrsec
  4. Gunakan opsi 3. dan coba lanjutkan meraba di tingkat kernel mengenai halaman kotor.
  5. Gunakan brankas data=ordered,barrier=1, tetapi cobalah merdu lainnya: terutama elevator sistem file (CFQ, Tenggat atau Noop) dan merdu masing-masing.

Mempertimbangkan pindah ke ext4 dan melakukan benchmarking
Seperti yang dikatakan ext4 membutuhkan lebih sedikit penghalang daripada ext3 untuk menulis. Selain itu, ext4 mendukung ekstensi yang untuk file besar mungkin membawa kinerja yang lebih baik. Jadi ini adalah solusi yang perlu ditelusuri, terutama karena mudah untuk bermigrasi dari ext3 ke ext4 tanpa menginstal ulang: dokumentasi resmi ; Saya melakukan itu pada satu sistem tetapi menggunakan panduan Debian ini . Ext4 benar-benar stabil sejak kernel 2.6.32 sehingga aman untuk digunakan dalam produksi.

Pertimbangan terakhir
Jawaban ini jauh dari lengkap, tetapi memberi Anda cukup bahan untuk mulai menyelidiki. Ini sangat tergantung pada persyaratan (pada tingkat pengguna atau sistem) sehingga sulit untuk memiliki jawaban langsung, maaf tentang itu.

Huygens
sumber
Terima kasih - banyak hal berguna di sana. Saya sudah membaca dokumen ext3 di kernel.org, dan mencoba mengubah komit, tetapi tidak memiliki perasaan untuk apa nilai yang besar. Diatur ke 15 daripada 5 detik saya tidak melihat perubahan. Saya akan melakukan pembandingan lagi, untuk mencakup permutasi yang Anda sarankan. Terima kasih lagi.
NeilB
Itu ide yang bagus untuk mencoba menambah waktu komit sambil menjaga default yang aman! Mungkin saja SQLite adalah pembilasan / sinkronisasi yang bisa menjadi penjelasan mengapa Anda tidak mengukur perubahan kinerja apa pun menggunakan opsi komit.
Huygens
@ NeilB hanya tersandung pada artikel ini: 1. sqlite.org/draft/lockingv3.html cari ext3di dalamnya. Mungkin memberikan penjelasan yang lebih mudah dimengerti (atau disederhanakan) tentang apa yang saya coba sampaikan dalam jawaban saya. 2. sqlite.1065341.n5.nabble.com/... Anda dapat mencoba menjaga default ext3 aman (dipesan + penghalang) tetapi menghapus sinkronisasi dalam SQLite. Saya akan segera memperbarui jawaban saya mengenai aspek kedua ini.
Huygens
Terima kasih untuk itu. Saya akan mengerjakan semua permutasi dan menjalankan tes kinerja dengan mereka pada gilirannya. Awalnya saya mencoba dengan sinkronisasi di SQLite dan mendapatkan angka kinerja yang baik. Saya perlu menulis beberapa kode untuk mengumpulkan berbagai data untuk berbagai kombinasi operasi penulisan terlebih dahulu. Saya akan memposting ringkasan di sini, tetapi jika Anda ingin detail lebih lanjut, saya akan menggunakan bowers dot com.
NeilB
10

Peringatan: mungkin ada ketidakakuratan di bawah ini. Saya telah belajar tentang banyak hal ini saat saya berjalan, jadi bawa dengan sedikit garam. Ini cukup panjang, tetapi Anda bisa membaca parameter yang kami mainkan, lalu lewati ke Kesimpulan di bagian akhir.

Ada beberapa lapisan di mana Anda bisa khawatir tentang kinerja penulisan SQLite:

tingkat yang berbeda untuk berpikir tentang kinerja

Kami melihat yang disorot dalam huruf tebal. Parameter tertentu adalah

  • Cache tulis disk. Disk modern memiliki cache RAM yang digunakan untuk mengoptimalkan penulisan disk sehubungan dengan disk yang berputar. Dengan ini diaktifkan, data dapat ditulis dalam blok out-of-order, jadi jika terjadi kerusakan, Anda dapat berakhir dengan file yang ditulis sebagian. Periksa pengaturan dengan hdparm -W / dev / ... dan atur dengan hdparm -W1 / dev / ... (untuk menyalakannya, dan -W0 untuk mematikannya).
  • penghalang = (0 | 1). Banyak komentar online yang mengatakan "jika Anda menjalankan dengan penghalang = 0, maka tidak ada caching penulisan disk yang diaktifkan". Anda dapat menemukan diskusi tentang hambatan di http://lwn.net/Articles/283161/
  • data = (jurnal | ordered | writeback). Lihatlah http://www.linuxtopia.org/HowToGuides/ext3JournalingFilesystem.html untuk deskripsi opsi ini.
  • komit = N. Memberitahu ext3 untuk menyinkronkan semua data dan metadata setiap N detik (default 5).
  • SQLite pragma synchronous = ON | MATI. Ketika ON, SQLite akan memastikan bahwa transaksi "ditulis ke disk" sebelum melanjutkan. Mematikan ini pada dasarnya membuat pengaturan lain sebagian besar tidak relevan.
  • SQLite pragma cache_size. Mengontrol berapa banyak memori yang akan digunakan SQLite untuk cache di dalam memori. Saya mencoba dua ukuran: satu di mana seluruh DB akan muat dalam cache, dan satu di mana cache adalah setengah dari ukuran DB maksimum.

Baca lebih lanjut tentang opsi ext3 dalam dokumentasi ext3 .

Saya menjalankan tes kinerja pada sejumlah kombinasi parameter ini. ID adalah nomor skenario, sebagaimana dimaksud di bawah ini.

skenario saya mencoba

Saya mulai dengan menjalankan konfigurasi default pada mesin saya sebagai skenario 1. Skenario 2 adalah apa yang saya anggap sebagai "paling aman", dan kemudian mencoba berbagai kombinasi, jika perlu / diminta. Ini mungkin yang paling mudah dipahami dengan peta yang saya gunakan:

memetakan skenario yang berkaitan dengan parameter

Saya menulis skrip pengujian yang menjalankan banyak transaksi, dengan menyisipkan, memperbarui, dan menghapus, semua di atas meja dengan hanya INTEGER, TEXT saja (dengan kolom id), atau dicampur. Saya menjalankan ini beberapa kali pada masing-masing konfigurasi di atas:

plot yang menunjukkan timing untuk skenario

Dua skenario terbawah adalah # 6 dan # 17, yang memiliki "pragma syncous = off", sehingga tidak mengejutkan bahwa mereka adalah yang tercepat. Cluster tiga berikutnya adalah # 7, # 11, dan # 19. Ketiganya disorot dengan warna biru pada "peta konfigurasi" di atas. Pada dasarnya konfigurasi adalah cache tulis pada, penghalang = 0, dan data diatur ke sesuatu selain 'jurnal'. Mengubah komit antara 5 detik (# 7) dan 60 detik (# 11) tampaknya membuat sedikit perbedaan. Pada tes ini sepertinya tidak ada banyak perbedaan antara data = dipesan dan data = penulisan kembali, yang mengejutkan saya.

The pembaruan campuran uji puncak tengah. Ada sekelompok skenario yang lebih jelas lebih lambat pada tes ini. Ini semua adalah data = jurnal . Kalau tidak, tidak ada banyak di antara skenario lainnya.

Saya memiliki tes pengaturan waktu lain, yang melakukan campuran sisipan, pembaruan, dan penghapusan yang lebih heterogen pada berbagai jenis kombinasi. Ini membutuhkan waktu lebih lama, itulah sebabnya saya tidak memasukkannya dalam plot di atas:

tipe campuran dan masukkan / perbarui / hapus

Di sini Anda dapat melihat bahwa konfigurasi writeback (# 19) sedikit lebih lambat daripada yang dipesan (# 7 dan # 11). Saya berharap penulisan kembali menjadi sedikit lebih cepat, tapi mungkin itu tergantung pada pola tulis Anda, atau mungkin saya belum cukup membaca di ext3 :-)

Berbagai skenario agak mewakili operasi yang dilakukan oleh aplikasi kita. Setelah memilih daftar skenario pendek, kami menjalankan tes pengaturan waktu dengan beberapa suite pengujian otomatis kami. Mereka sejalan dengan hasil di atas.

Kesimpulan

  • The berkomitmen parameter tampaknya membuat sedikit perbedaan, jadi kita meninggalkan bahwa pada 5s.
  • Kita akan melanjutkan dengan cache penulisan disk, penghalang = 0 , dan data = dipesan . Saya membaca beberapa hal secara online yang menganggap ini adalah pengaturan yang buruk, dan yang lain berpikir bahwa ini harus menjadi pengaturan default dalam banyak situasi. Saya kira yang paling penting adalah Anda membuat keputusan yang tepat, mengetahui apa yang Anda lakukan.
  • Kita tidak akan menggunakan pragma sinkron dalam SQLite.
  • Mengatur pragma SQLite cache_size sehingga DB akan masuk dalam memori meningkatkan kinerja pada beberapa operasi, seperti yang kami harapkan.
  • Konfigurasi di atas berarti kita mengambil risiko yang sedikit lebih besar. Kami akan menggunakan API cadangan SQLite untuk meminimalkan bahaya kegagalan disk pada penulisan sebagian: mengambil snapshot setiap N menit, dan menjaga M terakhir tetap ada. Saya menguji API ini saat menjalankan tes kinerja, dan memberi kami keyakinan untuk melakukannya.
  • Jika kita masih menginginkan lebih, kita bisa melihat penyia-nyiaan dengan kernel, tetapi kita cukup meningkatkan hal-hal tanpa pergi ke sana.

Terima kasih kepada @Huygens untuk berbagai tips dan petunjuk.

NeilB
sumber