IO Tunggu menyebabkan banyak perlambatan (EXT4 JDB2 pada 99% IO) Selama Mysql Commit

14

Saya menulis pengindeks, menggunakan python, yang mengindeks dokumen dan memasukkannya ke dalam Database, Sebelum itu adalah proses tunggal tapi sekarang saya membuatnya untuk multiprocessing dengan 4 proses paralel yang berjalan. Setelah setiap ekstraksi teks, ia memasukkan ke dalam database dan melakukan komit.

Sekarang itu mengenai masalah IO, Masalah IO utama bukanlah proses saya tetapi jdb2 EXT4, sistem penjurnalan. Ini berada di 99,99% dan meninggalkan CPU untuk menunggu IO di setiap Komit MySQL.

Saya melihat banyak yang mengalami masalah di internet dan solusinya adalah mount menggunakan barrier = 0. Apakah itu akan menonaktifkan Jurnal sepenuhnya? Server saya memiliki UPS dan tergoda untuk melakukannya, bukan?

Phyo Arkar Lwin
sumber
Apakah semua data Anda InnoDB ???
RolandoMySQLDBA

Jawaban:

4

Letakkan database pada sistem file non-jurnal. Setidaknya server yang lebih besar (oracle, sql server) memiliki fungsi jurnal mereka sendiri (log transaksi) dan mengoptimalkan IO mereka. Anda memiliki log dan database pada sistem file dan disk yang terpisah dan mengandalkan fungsionalitas internal database untuk menangani IO yang buruk. Biasanya tidak ada perubahan (pengaturan lebih besar) sistem file kecuali tanggal tulis pula karena file tidak berkembang - mereka akan dihasilkan dengan ukuran "final" (ok, admin dapat mengubah itu), dan perubahan seperti yang saya katakan dilacak oleh database log transaksi tingkat.

Anda mungkin juga ingin memberi tahu kami apa itu lapisan perangkat keras Anda. Kebanyakan orang meremehkan bahwa IOPS adalah faktor pembatas untuk sebuah basis data dan menganggap set disk kecil adalah lingkungan yang tepat untuk basis data besar. Sementara sebagian dari kita bekerja pada basis data menggunakan jumlah disk yang lebih besar, sehingga berpotensi mendukung jumlah IOPS yang lebih tinggi.

TomTom
sumber
Saya akan memodifikasi ini untuk menggunakan sistem file yang tidak menggunakan jurnal untuk data tetapi hanya metadata. Ext4 dapat dikonfigurasi dengan cara ini juga.
the-wabbit
Iya. Pada akhirnya jouirnal menggandakan IO - dan log basis data akan melakukan hal yang sama lagi, jadi Anda menggunakan IOPS lebih banyak dari yang seharusnya. Dan redundansi yang pada dasarnya tidak diperlukan. Sistem jouirnalling adalah BAGUS untuk melindungi file .... tetapi tidak berguna ketika aplikasi sudah melakukannya, database mana yang melakukannya.
TomTom
Yang menawarkan kinerja terbaik di non-jurnal? Terima kasih!
Phyo Arkar Lwin
4

Akan selalu ada trade off antara ketahanan dan kinerja.

Dengan MySQL pada ext4 hambatan = 1 default memang menyebabkan perlambatan, namun tindakan pertama seharusnya tidak menonaktifkan penjurnalan atau mengaktifkan data = writeback.

Pertama, jika ketahanan sangat penting, RAID yang didukung baterai tentu sangat berharga.

Opsi pemasangan yang telah saya pilih, terutama pada RAID yang didukung baterai adalah:

/dev/mapper/vg-mysql--data  /var/lib/mysql/data ext4  defaults,noatime,nodiratime,barrier=1,data=ordered  0 0

Ini sengaja tidak menggunakan data = writeback karena saya tidak ingin mengambil risiko korupsi sistem file yang mengakibatkan "data lama muncul dalam file setelah kerusakan dan pemulihan jurnal" (kutipan berasal dari man mount).

Konfigurasi ideal di my.cnf untuk ketahanan penuh di sekitar pengaturan terkait I / O adalah:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

Saya telah memilih urutan trade-off berikut untuk meningkatkan kinerja:

  1. sync_binlog = 0: ini adalah konfigurasi MySQL pertama yang saya ubah dari ketahanan penuh. Alasannya adalah ini memberikan peningkatan kinerja yang signifikan, terutama di mana binlog_format=row(sayangnya diperlukan untuk Jira). Saya menggunakan cukup replika MySQL di cluster bahwa jika binlog menjadi rusak oleh skenario kehilangan daya saya akan melakukan salinan biner dari replika lain.
  2. innodb_flush_log_at_trx_commit = 2: Sementara nilai 1 diperlukan untuk kepatuhan ACID penuh, dengan nilai 2 "buffer log ditulis ke file di setiap komit, tetapi operasi flush ke disk tidak dilakukan di atasnya. Namun, pembilasan pada file log terjadi sekali per detik juga ketika nilainya 2. Perhatikan bahwa pembilasan sekali per detik tidak 100% dijamin terjadi setiap detik, karena masalah penjadwalan proses. " (kutipan dari MySQL docs)
  3. Perbarui opsi pemasangan untuk digunakan data=writeback. Perhatikan bahwa jika ini adalah sistem file root Anda, Anda juga harus melewati opsi baris perintah kernel. Saya mengumpulkan beberapa langkah di coderwall .
  4. Uji berbagai nilai innodb_flush_method. O_DIRECT ditampilkan untuk meningkatkan kinerja di beberapa beban kerja, tetapi itu tidak diberikan karena ini akan bekerja di lingkungan Anda.
  5. Upgrade ke SSD, dalam hal ini Anda juga akan ingin meningkatkan innodb_io_capacity, dan tune pengaturan seperti innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, dan pengaturan lain yang mungkin.
JinnKo
sumber
3

Sangat mungkin bahwa backend I / O Anda tidak mengatasi beban dengan baik. Anda harus memastikan sistem file Anda tidak membuat jurnal data. Saya akan menyarankan menggunakan data=writeback,relatime,nobarrierparameter untuk me-mount partisi data database Anda sebagai optimasi cepat & kotor pertama.

Juga, menyimpulkan dari gejala Anda, Anda tampaknya tidak menggunakan cache tulis dengan controller Anda. Anda harus memastikan Anda menggunakan cache tulis yang didukung baterai atau yang didukung flash pada pengontrol Anda dan mengaktifkannya - ini akan memberi Anda peningkatan kinerja yang signifikan tanpa meningkatkan risiko kehilangan data atau korupsi. Perhatikan bahwa menggunakan cache tulis tanpa cadangan baterai atau flash benar- benar meningkatkan risiko kehilangan data atau korupsi - jadi lakukan ini hanya untuk tujuan pengujian dan / atau jika Anda dapat menghilangkannya.

the-wabbit
sumber
jadi bagaimana dengan: data = writeback, relatime, nobarrier dan kemudian benar-benar menonaktifkan Logging mysql? Saya pikir ini akan mempercepat banyak hal?
Phyo Arkar Lwin
hdpram -i menunjukkan bahwa saya menggunakan cache tulis. jadi hmm ??
Phyo Arkar Lwin
@ V3ss0n Anda tidak dapat menonaktifkan logging untuk mesin transaksional - itu adalah inti dari itu. Anda dapat memilih untuk memindahkan log transaksi ke disk yang berbeda karena memiliki pola akses yang sama sekali berbeda (sebagian besar menulis linier) dari data basis data utama Anda (baca / tulis acak) - ini adalah konfigurasi yang umum direkomendasikan. Adapun pengaturan penyimpanan Anda: Anda tidak menggunakan pengontrol RAID tetapi hanya disk individual dengan cache tulis aktif? Ini tidak akan membantu salah satu penulisan sinkron Anda karena mereka datang dengan permintaan flush cache eksplisit.
the-wabbit
Apakah nobarriersama dengan barrier=0?
Nic Cottrell
@NicCottrell ya, mereka sama.
kouton
3

Ini adalah pertanyaan lama, tetapi kami menghadapi masalah yang sama (IO tinggi menunggu, dan kecepatan insert / update yang mengerikan) minggu lalu di server khusus yang baru dan solusi ini mengatasi masalah ini secara langsung.

Menonaktifkan penjurnalan dengan tune2fs -O "^has_journal" /dev/<drive>adalah solusi tercepat karena menghilangkan menunggu IO karena proses JDB2. Tapi ini tidak disarankan kecuali Anda memiliki drive yang didukung baterai karena Anda akan kehilangan data jika terjadi kerusakan. Tabel InnoDB aman jika Anda telah doublewritemengaktifkan MySQL. Tetapi file seperti .frm, log, dll tidak aman. Kami mencoba memindahkan file-file ini ke drive lain (terutama log bin) tetapi menunggu jdb2 IO masih bertahan. Jadi itu tidak membuat kami nyaman.

data=writeback,relatime,nobarriertidak membantu mempercepat menulis / membaca sebanyak menonaktifkan penjurnalan pada seluruh partisi. Lebih banyak opsi untuk ext4 ada dalam dokumen EXT4 .

Penyebab sesungguhnya dalam kasus kami adalah sync_binlog. Kami telah menetapkan seperti 1dalam /etc/mysql/my.cnfdan itu membunuh kinerja.

Percona memvalidasi ini di sini . Kami menetapkannya sebagai default 0dan kinerjanya meningkat lebih dari 500%.

kouton
sumber
0

Mesin database apa yang Anda gunakan untuk memasukkan data ini?

Jika itu MyISAM: yang harus mengunci seluruh tabel selama penulisan, jadi menjalankan utas penyisipan bersamaan akan membunuh sistem APAPUN, tidak peduli seberapa kuatnya.

Pastikan Anda menggunakan InnoDB untuk tabel ini.

adaptr
sumber
Karena dia melakukan transaksi, mesin tidak akan menjadi MyISAM karena MyISAM tidak mendukung transaksi.
the-wabbit
Arr, brainfart.
adaptr
Saya menggunakan innodb, standar mysql5.5 ke innodb.
Phyo Arkar Lwin
0

Juga, tidak terkait langsung dengan mysql, tetapi beberapa HD memiliki masalah dengan ext4 karena manajemen daya yang agresif ... ketika itu terjadi, beban mesin meningkat tanpa aktivitas yang jelas.

Cobalah untuk menonaktifkannya. pertama periksa nilai apa pun yang Anda miliki (jika Anda harus mengembalikannya tanpa me-reboot) dan kemudian nonaktifkan.

Periksa nilai saat ini:

    hdparm -B /dev/sda

Nonaktifkan itu

   hdparm -B 255 /dev/sda

(atau apa pun HD Anda) dan uji. Mungkin tidak akan membantu untuk sebagian besar masalah, tetapi mungkin membantu beberapa pengguna di luar sana. Reboot akan mengatur ulang nilai, atau secara manual mengganti 255 untuk nilai sebelumnya.

Jika itu membantu, periksa /etc/default/hdparmatau /etc/hdparm.confuntuk konfigurasi yang lebih permanen, dengan mengaturnya saat boot.

higuita
sumber