MySQL 5.1 InnoDB Yapılandırması / 24GB RAM - bi-xeon yüksek yük


10

Şu anda 300 - 600 eşzamanlı kullanıcısı (ve büyüyor) olan bir facebook uygulaması çalıştırıyorum. Donanımı büyümeye hazır hale getirmek için i7 / 12gb ram / 2x 80gb intel x25 ssd'leri (debian 5.0 / mysql 5.0 / 64bit) bi-xeon / 24gb ram / 2x 120gb intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 bit).

şimdi performans "küçük kutu" daha kötü sorun yaşıyorum. Her iki sunucuda da içeriği sunmak için nginx / php fcgi kullanıyorum.

Ben sadece innodb kullanıyorum, yaklaşık% 65 /% 35 Okuma / Yazma sahip. Yaklaşık 800 - 1000 qps, ancak tüm Sorgular basittir ve hiçbir zaman 1'den fazla ek tabloya katılmaz. Tüm dizinler ayarlanır ve yavaş günlükte (> 2s) tek bir sorgu kaydedilmez. Şu anda her ay iki katına çıkmasını bekleyen yaklaşık 400mb veri (dizinlerle yaklaşık 1GB) var.

Daha pürüzsüz çalışması için neyi değiştireceğime dair bir ipucu verebilecek herkese bayılırdım.

İ7 kutusundaki eski yapılandırma böyle (karışık myisam / innodb), 800+ kullanıcıya kadar oldukça iyi performans gösterdi.

eski my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

Bi-xeon kutusundaki yeni konfigürasyon böyledir (saf innodb) ve 300'den fazla kullanıcıyla yüksek yüke neden olur. İşlem listesinin başında oturan yaklaşık 30 mysql işlemi.

Disk G / Ç:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

Hmmm, skip-name-resolvedevre dışı ve etkinleştirilebilir mi?
Wrikken

Yanıtlar:


7

StackExchnage'da bazı yazılar yazdım

  1. MySQL'in InnoDB ve MyISAM için Ayarlanması
  2. InnoDB Diskspace nasıl kontrol altında tutulur
  3. MySQL Disk Alanı Yönetimine Başka Bir Bakış Açısı
  4. InnoDB Optimizasyonuna Bakış Açısı
  5. InnoDB İnce Ayar

İhtiyacınız olan rehberlik için lütfen bunları okuyun.

Şimdi, daha acil konular için: 1 MB'lık indeksli 400 MB'lık veriye sahip olduğunuzdan bahsettiniz. Bu tür beni, dizinlerinizin verilerden% 50 daha büyük olduğunu korkutuyor. Ancak, tüm verileriniz InnoDB olduğundan ve mevcut sorgu performansından memnun olduğunuzdan, ayarlarınız özellikle 16384 MB innodb_buffer_pool_size değerinden daha fazladır. Bu 16GB. Hepiniz hazırsınız. Fakat bekle !!! İnnodb_log_file_size dosyanız 128M mi? 16GB arabellek havuzu göz önüne alındığında çok küçük. İb_logfile dosyalarını yeniden boyutlandırmalısınız (innodb_log_file_size değerini 2047M olarak ayarlayın).

Her iş parçacığı esasında yük yaşıyor olabilirsiniz. Bağlantı tamponlarınızı ayarlamayı deneyin (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

Benden: MySQL neden hafızam bittiğini söylüyor?

@DTest Gönderen: mysql max_connections değişkenini nasıl hesaplarsınız?

Bir şans ver !!!


tüm bazı dizinleri ayarlamakla ilgili ... şimdi diğer kombinasyonlarda çift dizinli bazı sütunları var ... ve şimdi 35 GB veri ve 10'000qps var ... ve ipek gibi pürüzsüz çalışır.
Kilian

0
  • MyISAM'dan InnoDB'ye bazı tablolar dönüştürdünüz mü?
    Öyleyse, http://mysql.rjweb.org/doc.php/myisam2innodb adresindeki ince performans geliştirmelerini / bozulmalarını kontrol edin
  • innodb_flush_log_at_trx_commit = 1
    - her işlemden sonra günlüğe yazılmasına neden olur . Kullanmayı düşünün = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - başlangıçtan bu yana kaç tane ihtiyacınız olduğunu söyleyecektir.
  • sorgu önbelleği:

    query_cache_size        = 128M
    query_cache_type        = 1

    Bunlar acıyor olabilir. Yukarıda, 50MQC, bakım için çok fazla zaman harcıyor. Buna sahip ONolmak da savurgan olabilir. Etkinliğini SHOW GLOBAL STATUS LIKE 'Qc%'kontrol etmek için yapın.

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.