Di salah satu lingkungan produksi saya, kami memiliki dua instance yang berjalan di cluster RedHat, dengan satu instance produksi yang terkait dengan cluster.
Kami memiliki memori utama 125G dengan kolam buffer InnoDB 24G ditempati oleh instance1 & 12G ditempati oleh instance2, yang tidak terkait dengan cluster RedHat. Log data dan transaksi terletak di partisi disk LVM dengan sistem file ext3.
Untuk meningkatkan kinerja dan lebih baik I / O throughput yang saya telah memutuskan untuk perubahan innodb_flush_method
untuk O_DIRECT
.
Dengan mengacu pada dokumentasi MySQL:
Di mana data InnoDB dan file log berada di SAN, telah ditemukan bahwa pengaturan
innodb_flush_method
untukO_DIRECT
dapat menurunkan kinerjaSELECT
pernyataan sederhana dengan faktor tiga.
Mengacu pada kinerja tinggi MySQL Ver 2 dan 3, itu menyatakan bahwa pengembang InnoDB menemukan bug dengan menggunakan innodb_flush_method=O_DSYNC
. O_SYNC
dan O_DSYNC
mirip dengan fsync()
dan fdatasync()
: O_SYNC
menyinkronkan data dan metadata, sedangkan O_DSYNC
menyinkronkan data saja.
Jika itu semua tampak seperti banyak penjelasan tanpa saran, inilah sarannya:
jika Anda menggunakan sistem operasi mirip Unix dan pengontrol RAID Anda memiliki writecache yang didukung baterai, kami sarankan Anda menggunakannya
O_DIRECT
. Jika tidak, apakah default atauO_DIRECT
mungkin akan menjadi pilihan terbaik, tergantung pada aplikasi Anda.
Dengan googling, saya mendapat laporan benchmark ini : di O_DSYNC
vs.O_DIRECT
Laporan Bench Mark: =================== Tes Transaksional Kompleks 1B Baris, 64 utas * SAN O_DIRECT: permintaan baca / tulis: 31560140 (8766,61 per detik) * SAN O_DSYNC: permintaan baca / tulis: 5179457 (1438,52 per detik) * SAN fdatasync: permintaan baca / tulis: 9445774 (2623,66 per detik) * Local-disk O_DIRECT: permintaan baca / tulis: 3258595 (905,06 per detik) * O_DSYNC disk lokal: permintaan baca / tulis: 3494632 (970,65 per detik) * Local-disk fdatasync: permintaan baca / tulis: 4223757 (1173,04 per detik.
Namun, O_DIRECT
menonaktifkan cache level OS, di mana cache ganda dapat dinonaktifkan yang menunjukkan beberapa throughput I / O yang lebih baik.
Apakah lebih baik pergi dengan O_DIRECT
daripada O_DSYNC
? Kedua opsi ini agak membingungkan. Opsi mana yang dapat menunjukkan throughput I / O yang lebih baik dan peningkatan kinerja tanpa berdampak pada data, baca / tulis terutama dalam produksi? Adakah saran yang lebih baik berdasarkan pengalaman pribadi Anda?
Saya dapat melihat Rolando Update di pos :
Masih ada sedikit kebingungan pada kedua parameter ini. Di mana saya bisa melihat sebagian besar templat konfigurasi produksi menggunakan
O_DIRECT
, saya belum melihat ada rekomendasiO_DSYNC
.
Sistem
- MySQL 5.1.51-enterprise-gpl-pro-log
- Server Red Hat Enterprise Linux merilis 5.5
- DELL DRAC dengan Raid Controller memiliki baterai untuk menulis cache kembali 512MB
- Dell PERC mengendalikan H700 dengan unit cadangan baterai (BBU).
Informasi tambahan
mysql> tampilkan variabel seperti 'innodb_thread_concurrency'; + --------------------------- + ------- + | Variable_name | Nilai | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 baris dalam set (0,00 dtk) mysql> tampilkan variabel seperti 'innodb_read_io_threads'; Set kosong (0,00 dtk) mysql> tampilkan variabel seperti 'innodb_write_io_threads'; Set kosong (0,00 dtk)
Kami menggunakan plugin default, jadi saya telah memposting info dari status InnoDB:
mysql> PILIH * DARI Plugin DI MANA PLUGIN_NAME SEPERTI '% innodb%' DAN PLUGIN_TYPE SEPERTI 'STORAGE ENGINE' \ G **************************** 1. baris ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: STORAGE ENGINE PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: Mendukung transaksi, penguncian level baris, dan kunci asing PLUGIN_LICENSE: GPL 1 baris dalam set (0,00 dtk)