Ü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_methodiç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_methodiçinO_DIRECTbasit 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_SYNCve O_DSYNCbenzer fsync()ve fdatasync(): O_SYNCbuna senkronize iki veri ve meta, O_DSYNCsenkronize 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_DSYNCvsO_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_DIRECTbazı 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_DIRECTyerine gitmek iyi O_DSYNCmi? 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)