Üretim ortamlarımdan birinde, bir RedHat kümesinde çalışan iki örneğimiz var ve bunlardan biri üretim kümesiyle ilişkili.
RedHat kümesiyle ilişkili olmayan, example1 ve 12G tarafından işgal edilen 24G InnoDB arabellek havuzuna sahip 125G ana belleğimiz var. Hem veri hem de işlem günlükleri, ext3 dosya sistemiyle LVM disk bölümünde bulunur.
Bir performans vermesi için, ve daha iyi I / O verimlilik ben değişime karar verdik innodb_flush_method
için O_DIRECT
.
MySQL belgelerine referansla:
InnoDB'nin veri ve günlük dosyaları bir SAN üzerinde bulunan yerlerde, ayarı olduğu bulunmuştur
innodb_flush_method
içinO_DIRECT
basit performansını düşürebilirSELECT
üç kat ifadeleri.
Yüksek performanslı MySQL Ver 2 ve 3'e bakıldığında, InnoDB geliştiricilerinin kullanımda hata bulduğunu belirtti innodb_flush_method=O_DSYNC
. O_SYNC
ve O_DSYNC
benzer fsync()
ve fdatasync()
: O_SYNC
buna senkronize iki veri ve meta, O_DSYNC
senkronize veri.
Bunların hepsi tavsiye olmadan çok fazla açıklama gibi görünüyorsa, işte tavsiye:
Unix benzeri bir işletim sistemi kullanıyorsanız ve RAID denetleyicinizde pil destekli bir yazma önbelleği varsa, kullanmanızı öneririz
O_DIRECT
. DeğilseO_DIRECT
, uygulamanıza bağlı olarak varsayılan veya muhtemelen en iyi seçim olacaktır.
Google'a göre şu karşılaştırma raporunu aldım : O_DSYNC
vsO_DIRECT
Bench Mark Raporu: =================== 1B Sıralı Karmaşık İşlem Testi, 64 diş * SAN O_DIRECT: okuma / yazma istekleri: 31560140 (saniye başına 8766.61) * SAN O_DSYNC: okuma / yazma istekleri: 5179457 (saniyede 1438.52) * SAN fdatasync: okuma / yazma istekleri: 9445774 (saniye başına 2623,66) * Yerel disk O_DIRECT: okuma / yazma istekleri: 3258595 (saniyede 905.06) * Yerel disk O_DSYNC: okuma / yazma istekleri: 3494632 (saniye başına 970,65) * Yerel disk fdatasync: okuma / yazma istekleri: 4223757 (saniyede 1173.04).
Bununla birlikte, O_DIRECT
bazı daha iyi G / Ç verimi gösteren çift önbelleklemenin devre dışı bırakılabileceği OS düzeyi önbelleği devre dışı bırakır.
Gitmek O_DIRECT
yerine gitmek iyi O_DSYNC
mi? Bu iki seçenek biraz kafa karıştırıcı. Hangi seçenek, özellikle üretimde veriler, okumalar / yazmalar üzerinde herhangi bir etki yaratmadan performansta daha iyi I / O verimi ve artış gösterebilir? Kişisel deneyiminize göre daha iyi bir öneriniz var mı?
Ben de Rolando Güncelleme görebiliyordu yazı :
Yine de bu parametrelerin her ikisinde de küçük bir karışıklık var. Nerede kullanarak üretim yapılandırma şablonları çoğu görebiliyordu
O_DIRECT
, ben herhangi bir yerde tavsiye görmedimO_DSYNC
.
sistem
- MySQL 5.1.51-kurumsal-gpl-pro-log
- Red Hat Enterprise Linux Sunucu sürüm 5.5
- Batarya geri yazma önbelleğine sahip Raid Controller ile DELL DRAC 512MB
- Pil yedekleme birimine (BBU) sahip Dell PERC denetleyicileri H700.
Ek bilgi
mysql> 'innodb_thread_concurrency' gibi değişkenleri gösterir; + --------------------------- + ------- + | Değişken_adı | Değer | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + Sette 1 satır (0.00 sn) mysql> 'innodb_read_io_threads' gibi değişkenleri gösterir; Boş set (0,00 sn.) mysql> 'innodb_write_io_threads' gibi değişkenleri gösterir; Boş set (0,00 sn.)
Varsayılan eklentiyi kullanıyoruz, bu yüzden bilgileri InnoDB durumundan gönderdim:
mysql> SEÇİN * PLUGIN_NAME '% innodb%' NEREDE VE PLUGIN_TYPE 'DEPOLAMA MOTORU' GİBİ Eklentilerden *************************** 1. sıra ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: AKTİF PLUGIN_TYPE: DEPOLAMA MOTORU PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: İşlemleri, satır düzeyinde kilitleme ve yabancı anahtarları destekler PLUGIN_LICENSE: GPL Sette 1 satır (0.00 sn)