IO Çok fazla yavaşlamaya neden oluyor (% 99 IO'da EXT4 JDB2) Mysql İşlemi Sırasında


14

Belgeleri indeksler ve Veritabanı içine eklemek python kullanarak bir dizinleyici yazıyorum, Tek bir işlem olmadan önce ama şimdi çalışan 4 paralel işlemler ile çoklu işleme için yaptı. Her metin çıkarma sonra, veritabanına eklemek ve bir taahhüt yapar.

Şimdi IO sorununa çarpıyor, ana IO Sorunu benim sürecim değil, EXT4'ün jdb2, derleme sistemidir. % 99,99'dur ve CPU her MySQL'de IO'yu beklemektedir.

Birçok internette bu sorunu olan gördüm ve onların çözümü bariyer = 0 kullanarak monte etmektir. Günlük kaydını tamamen devre dışı bırakır mı? Sunucularımın UPS ve bunu yapmak için cazip, değil mi?


Tüm verileriniz InnoDB ???
RolandoMySQLDBA

Yanıtlar:


4

Veritabanını günlük kaydı olmayan bir dosya sistemine yerleştirin. En az daha büyük sunucular (oracle, sql sunucusu) kendi günlük fonksiyonlarına (işlem günlüğü) sahiptir ve IO'larını buna göre optimize eder. Ayrı dosya sistemleri ve disklerde günlük ve veritabanınız var ve kötü IO'yu işlemek için veritabanı iç işlevlerine güveniyorsunuz. Normalde (geniş kurulum) dosya sistemi değişiklikleri zaten yazma tarihi hariç hiçbir değişiklik yoktur çünkü dosyaları genişlemez - "son" boyutlarıyla üretilirler (tamam, yöneticiler bunu değiştirebilir) ve değişiklikler veritabanı tarafından izlendiğim gibi düzey işlem günlüğü.

Ayrıca bize donanım katmanınızın ne olduğunu söylemek de isteyebilirsiniz. Çoğu insan, IOPS'un bir veritabanı için sınırlayıcı faktör olduğunu hafife alır ve küçük bir disk setinin büyük bir veritabanı için uygun bir ortam olduğunu düşünür. Bazılarımız daha fazla sayıda disk kullanan veritabanları üzerinde çalışırken, potansiyel olarak daha fazla sayıda IOPS'yi destekliyor.


Bu günlük için veri değil, yalnızca meta veri kullanarak bir dosya sistemi kullanarak değiştirmek istiyorum. Ext4 de bu şekilde yapılandırılabilir.
the-wabbit

Evet. Sonunda jouiral IO'yu iki katına çıkarır ve veritabanı günlüğü tekrar aynı şeyi yapar, böylece gerekenden çok daha fazla IOPS ile bağlanırsınız. Ve temelde gerekli olmayan artıklık. Sistem jouirnalling dosyayı korumak için GÜZEL .... ama uygulama zaten bunu yaparsa, hangi veritabanları yapmak işe yaramaz.
TomTom

Günlük tutma dışında en iyi performansı hangisi sunar? Teşekkürler!
Phyo Arkar Lwin

4

Her zaman esneklik ve performans arasında bir denge olacaktır.

Ext4 üzerinde MySQL ile varsayılan = 1 engelleme yavaşlamaya neden olur, ancak ilk eylem günlük kaydını devre dışı bırakmak veya veri = geri yazma özelliğini açmak olmamalıdır.

Birincisi, esneklik büyük önem taşıyorsa, batarya destekli bir RAID kesinlikle buna değer.

Özellikle pil destekli olmayan RAID'de seçtiğim montaj seçenekleri şunlardır:

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

Dosya sistemi bozulması "eski bir çökme ve günlük kurtarma sonra dosyalarda görünmesi" ile sonuçlanan dosya sistemi bozulma riskini istemiyorum çünkü bu kasıtlı olarak data = writeback kullanmıyor (alıntı olduğunu man mount).

G / Ç ile ilgili ayarlar etrafında tam esneklik için my.cnf dosyasında ideal yapılandırma şunlardır:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

Performansı artırmak için aşağıdaki takas dizisini seçtim:

  1. sync_binlog = 0: Bu tam esneklikten değiştirdiğim ilk MySQL yapılandırması. Bunun nedeni, özellikle binlog_format=row(Jira için maalesef gerekli olduğunda) önemli bir performans artışı sağlamasıdır. Binlog bir güç kaybı senaryosu tarafından bozuk olacak olsaydı kümede yeterli MySQL kopyalarını kullanıyorum, ben başka bir çoğaltma ikili bir kopyasını yapacağım.
  2. innodb_flush_log_at_trx_commit = 2: Tam ACID uyumluluğu için 1 değeri gerekirken, 2 "değeri ile günlük arabelleği her komutta dosyaya yazılır, ancak diske yıkama işlemi gerçekleştirilmez. Ancak, günlük dosyası, değer 2 olduğunda da saniyede bir kez gerçekleşir. İşlem zamanlama sorunları nedeniyle saniyede bir kez yıkama işleminin her saniyede% 100 garanti edilmediğini unutmayın. " (MySQL dokümanlarından alıntı)
  3. Kullanılacak montaj seçeneklerini güncelleyin data=writeback. Kök dosya sisteminizse, bir çekirdek komut satırı seçeneğini de geçmeniz gerektiğini unutmayın. Kod duvarında birkaç adım bir araya getirdim .
  4. Çeşitli değerlerini test edin innodb_flush_method. O_DIRECT'in bazı iş yüklerindeki performansı artırdığı gösterilmiştir, ancak bunun ortamınızda çalışacağı belli değildir.
  5. Bu durumda da artırmak isteyeceksiniz, SSD'ler yükseltme innodb_io_capacitygibi ve ayar ayarları innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, ve diğer olası ayarlar.

3

G / Ç arka ucunuzun yükle bu kadar iyi başa çıkmaması muhtemeldir. Dosya sisteminizin verileri günlüğe kaydetmediğinden emin olmalısınız. data=writeback,relatime,nobarrierİlk hızlı ve kirli optimizasyon olarak veritabanınızın veri bölümü için monte etmek için parametreleri kullanmanızı öneririm .

Ayrıca, belirtilerinizden çıkarak, kontrol cihazınızla yazma önbelleği kullanmıyorsunuz. Denetleyicinizde pil destekli veya flash destekli yazma önbelleği kullandığınızdan ve etkinleştirdiğinizden emin olmalısınız - bu, veri kaybı veya bozulması riskini önemli ölçüde artırmadan size önemli bir performans artışı sağlamalıdır. Pil veya flash yedekleme olmadan yazma önbelleği kullanmanın veri kaybı veya bozulması riskini önemli ölçüde artırdığını unutmayın - bu nedenle bunu yalnızca test amacıyla ve / veya kaybı alabiliyorsanız yapın.


peki nasıl: data = geri yazma, relatime, nobarrier ve mysql günlüğünü tamamen devre dışı bırak? Bence bu işleri hızlandıracak mı?
Phyo Arkar Lwin

hdpram-i yazma önbellekleme kullandığımı gösterir. öyleyse hmm ??
Phyo Arkar Lwin

@ V3ss0n işlemsel bir motor için günlüğe kaydetmeyi devre dışı bırakamazsınız - bu onun kalbidir. Ana veritabanı verilerinizden (rastgele okuma / yazma) tamamen farklı bir erişim kalıbına (çoğunlukla doğrusal yazma) sahip olduğundan işlem günlüğünü farklı bir disk grubuna taşımayı seçebilirsiniz - bu genellikle önerilen bir yapılandırmadır. Depolama kurulumunuza gelince: RAID denetleyicisi kullanmıyorsunuz, sadece yazma önbelleği açık olan tek tek diskler mi kullanıyorsunuz? Bu, açık önbellek yıkama istekleriyle birlikte geldiklerinden senkron yazılarınızın hiçbirine yardımcı olmaz.
the-wabbit

İle nobarrieraynı mı barrier=0?
Nic Cottrell

@NicCottrell evet, hepsi aynı.
kouton

3

Bu eski bir sorudur, ancak geçen hafta yeni bir özel sunucuda aynı sorunlarla (Yüksek G / Ç bekleri ve korkunç ekleme / güncelleme hızları) karşılaştık ve bu çözüm doğrudan bu sorunu ele alıyor.

tune2fs -O "^has_journal" /dev/<drive>Günlük kaydını devre dışı bırakmak , JDB2 işlemi nedeniyle G / Ç beklemesini ortadan kaldırdığı için en hızlı çözümdü. Ancak, pil destekli bir sürücünüz olmadığı sürece bu önerilmez, çünkü bir çarpışma durumunda veri kaybedersiniz. MySQL'de doublewriteetkinleştirdiyseniz InnoDB tabloları güvenlidir . Ancak .frm, log, vb. Dosyalar güvenli değildir. Bu dosyaları başka bir sürücüye (özellikle bin günlükleri) taşımayı denedik, ancak jdb2 IO bekleme hala devam etti. Bu yüzden bizi çok rahat bırakmadı.

data=writeback,relatime,nobarriertüm bölümdeki günlük kaydını devre dışı bırakmak kadar yazma / okuma hızlandırmasına yardımcı olmadı. Ext4 için daha fazla seçenek EXT4 belgesinde bulunmaktadır .

Bizim durumumuzdaki asıl suçluydu sync_binlog. Biz gibidir batmıştı 1içinde /etc/mysql/my.cnfve oldu öldürme performansı.

Percona bunu burada doğrular . Bunu varsayılan değerine 0ve performansı% 500'ün üzerine çıkardık.


0

Bu verileri içine eklemek için hangi veritabanı motorunu kullanıyorsunuz?

MyISAM ise: bir yazma sırasında tüm tabloyu kilitlemelidir, bu nedenle eşzamanlı insert iş parçacığı çalıştırmak, ne kadar güçlü olursa olsun, HERHANGİ bir sistemi öldürür.

Bu tablolar için InnoDB kullandığınızdan emin olun.


İşlem gerçekleştirdiği için, MyISAM işlemleri desteklemediğinden motor MyISAM olmaz.
the-wabbit

Arr, beyni.
adaptr

Ben innodb kullanıyorum, mysql5.5 varsayılan olarak innodb.
Phyo Arkar Lwin

0

Ayrıca, doğrudan mysql ile ilgili değildir, ancak bazı HD'ler agresif güç yönetimi nedeniyle ext4 ile ilgili sorunlara sahiptir ... bu olduğunda, makine yükü herhangi bir belirgin aktivite olmadan artar.

Devre dışı bırakmayı deneyin. önce sahip olduğunuz değeri kontrol edin (yeniden başlatmadan geri koymanız gerekiyorsa) ve sonra devre dışı bırakın.

Mevcut değeri kontrol edin:

    hdparm -B /dev/sda

Devre dışı bırak

   hdparm -B 255 /dev/sda

(veya HD'niz ne olursa olsun) ve test edin. Muhtemelen çoğu sorun için yardımcı olmaz, ancak bazı kullanıcılara yardımcı olabilir. Yeniden başlatma, değeri sıfırlar veya önceki değer için 255'i manuel olarak değiştirir.

Bu yardımcı olursa , önyüklemeye ayarlayarak /etc/default/hdparmveya /etc/hdparm.confdaha kalıcı bir yapılandırma olup olmadığını kontrol edin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.