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_methoduntuk O_DIRECT.
Dengan mengacu pada dokumentasi MySQL:
Di mana data InnoDB dan file log berada di SAN, telah ditemukan bahwa pengaturan
innodb_flush_methoduntukO_DIRECTdapat menurunkan kinerjaSELECTpernyataan 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_SYNCdan O_DSYNCmirip dengan fsync()dan fdatasync(): O_SYNCmenyinkronkan data dan metadata, sedangkan O_DSYNCmenyinkronkan 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_DIRECTmungkin akan menjadi pilihan terbaik, tergantung pada aplikasi Anda.
Dengan googling, saya mendapat laporan benchmark ini : di O_DSYNCvs.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_DIRECTmenonaktifkan cache level OS, di mana cache ganda dapat dinonaktifkan yang menunjukkan beberapa throughput I / O yang lebih baik.
Apakah lebih baik pergi dengan O_DIRECTdaripada 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)