MySql Proccesslist "Uyku" ile dolu

1 Cevap php

Php / mysql bağlantıları ile uzun bir konuda sizin yardımınıza sormak istiyorum.

Bizim 5 webserverların çıkan veritabanı Server bağlantıları: i komutu bir "SHOW PROCESSLIST" yürütmek her zaman bana yaklaşık 400 rölantide (Uyku Durumu) gösterir.

Bu bir çok sorun oldu asla (ve ben hızlı bir çözüm bulamadık) yakın zamana kadar trafik numaraları artmış ve o zamandan beri MySql hatta bu yüzden bu bağlantıların 350 + "uyku" durumunda, tekrar tekrar "birçok bağlantıları" Sorunları raporları . Ayrıca sunucu aynı sunucu bağlantısı uyku olmasa bile bir mysql bağlantı alınamıyor.

Bir apache server düzeltilmiş zaman tüm bu bağlantıları kaybolur.

PHP kodu normal "mysql" Modül, "mysqli" Modül, PEAR :: DB ve Zend Framework Db Adaptörü kullanan veritabanı bağlantıları oluşturmak için kullanılır. (Farklı projeler). Projelerin YOK kalıcı bağlantılarını kullanır.

Bağlantı limitini yükseltmek mümkündür ama şimdi 450 ve sadece 20-100 "gerçek" bağlantıları zaten bir anda olduğu için iyi bir çözüm gibi görünmüyor.

Benim soru:

Neden uyku durumunda pek çok bağlantı vardır ve nasıl ben bunu önleyebilirsiniz.

Belirsiz veya eksik bir şey olursa bana bildirin lütfen, Zaman ayırdığınız için teşekkür ederiz

- Güncelleme:

Bir anda çalışan Apache istekleri sayısı 50 eşzamanlı istekleri aşıyor asla, bu yüzden bir ekli PHPScript falan olmadan bağlantı veya apache açık noktasını tutan kapatma ile ilgili bir sorun var sanırım (?)

my.cnf durumunda yararlı olur:

innodb_buffer_pool_size = 1024M

max_allowed_packet = 5M
net_buffer_length = 8K

read_buffer_size = 2M
read_rnd_buffer_size = 8M

query_cache_size = 512M
myisam_sort_buffer_size = 128M

max_connections = 450
thread_cache = 50
key_buffer_size = 1280M
join_buffer_size = 16M

table_cache = 2048
sort_buffer_size = 64M
tmp_table_size = 512M
max_heap_table_size = 512M

thread_concurrency = 8

log-slow-queries = /daten/mysql-log/slow-log
long_query_time = 1
log_queries_not_using_indexes

innodb_additional_mem_pool_size = 64M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table

1 Cevap

Temel olarak, ne zaman Uyku durumundayken bağlantıları olsun:

  • bir PHP komut MySQL bağlanır
  • Bazı sorgular yürütülür
  • then, the PHP script does some stuff that takes time
    • DB sökmeden
  • and, finally, the PHP script ends
    • ki bu MySQL sunucusu keser demektir

Bağlı kalmak PHP süreçlerin bir çok şey var Yani, aslında genel olarak veritabanı tarafında herhangi bir şey yapmadan, bir uyku durumunda birçok işlemler ile sonuna kadar.

Bir temel fikir, yani: - ya da en kısa sürede onlar artık veritabanına erişmek gerekmez olarak kesmek için zorlamak çok uzun süre çalıştırmak PHP süreçleri yok emin olun.


Another thing, that I often see when there is some load on the server :

  • There are more and more requests coming to Apache
    • oluşturmak için birçok sayfa anlamına gelir
  • Her PHP komut dosyası, bir sayfa oluşturmak için, DB bağlanır ve bazı sorgular yapar
  • Bu sorgular DB sunucu artar yük olarak, daha fazla zaman alır
  • Hangisi daha süreçleri kadar istifleme tutmak anlamına gelir

Uzun olanları optimize - yardımcı olabilir bir çözüm sorguları almak süresini azaltmak için.