Soru MySQL performans sorunlarını nasıl takip ediyor ve debug ediyorsunuz?


Mac OS X 10.4'te çalışan bir sunucu sistemim var (Darwin Kernel Version 8.10.1). Bu sunucu esas olarak bir Bugzilla Sunucu olarak kullanılır, ancak orada çalışan diğer bazı web tabanlı hizmetler (Testlink, TikiWiki).

Bugzilla veritabanında yaklaşık 60000 hata var ve hakkında Sistemdeki 300 aktif kullanıcı.

Bugzilla 3.0 sürümünde, MySQL 5.0.38 ile Perl 5.8.6, Apache 1.3.33 üzerinde çalışıyor.

Zaman zaman, Bugzilla’nın veri tabanı hatası:

Software error:

Can't connect to the database.
Error: Too many connections

Bu probleme olası çözümlere zaten birkaç yol var, ama nasıl hata ayıklayacağınıza dair daha genel bir soru sormak istedim bu tür problemler?

Şu anda mySQL veritabanını izlemek için aşağıdakileri kurduk:

  • Her 5 dakikada bir tam mysql işlem listesini döken bir cron işi
  • Daha uzun süren sorguları günlüğe kaydetmek için my.cnf dosyasındaki günlük yavaş sorguları etkinleştirme 15 saniyeden

Bunun için bir neden olup olmadığını görmek için bu verileri toplamaya başladık. "Çok fazla bağlantı" sorunu.

MySQL'i izlemek için düşünebileceğiniz başka şeyler var mı veritabanı ve sorunun kök nedenini teşhis etmeye yardımcı olmak için?


6
2018-04-30 11:26


Menşei




Cevaplar:


Bu tür hataları saptamak için iki ayrı saldırı planı vardır:

birinci olarakKullanımdaki gerçek yazılımla ilgili bir sorun olması muhtemeldir: bir şey esas olarak bağlantıları emmekte ve onları geri göndermemekte (ya da asılı iplik açısından ya da makul bir süre cinsinden) yavaş sorgu).

Yavaş sorgulama günlüğü problemleri teşhis etmede çok faydalıdır, ancak 15 saniyelik değeriniz işe yaramazın yanındadır: eğer bir sorgu 15 saniye sürüyorsa, o zaman oldukça çaresizsiniz. Genel bir kural olarak, çalıştırmak için bir veya iki saniyeden uzun süren sorguları arıyorum. anahtar kelimeyi İZAH ve yavaşlamaya neden ne bakmak kullanarak bu günlüğüne gösterir ne olursa olsun yoluyla çalışır (kötü Geçici bir tablo vb gerek sıralama, katılır) - bu mümkün değilse genellikle yardımcı olabilir sorgu önbelleğe alma ve endeksler ile bazı akıllı büyü kod / veritabanı tasarımı ile daha derine gidin ve onarın.

Ayrıca, mysql'deki genel sorgu günlüğünü göz ardı etmeyin. Bir üretim sunucusunda (uzun süre) açık bırakmak istemeyeceğiniz halde, bir yaşını alan tek bir sorgudan ziyade, yazılımdaki belirli bir işlevin yüzlerce küçük veri tabanına vurduğunu hızlıca söyleyebiliriz sorguları. Açıkçası bu tür sorunları çözmenin tek yolu, kodu yeniden kodlamaktır.

ikinci olarakYazılımın yapılandırmasının suçlu olup olmadığını araştırmanız gerekir. Kaç eşzamanlı bağlantı yaşıyorsunuz? Mysql'de ayarlanan maksimum bağlantıların gerçek sayısı nedir. Apache'nin 100 eşzamanlı istekte bulunabileceği kadar basit bir şey olabilirken, mysql yalnızca 20 bağlantıyı kabul edecek şekilde yapılandırılmışken - belli ki bir şey verilecek. Ne kadar trafiğin ele almayı beklediğini ölçebilirseniz, tüm bileşenleri dengelemek için bazı sağduyu (ve bazen doğru ayarı bulmak için Google’ın bir çizgisi) gerekir.


6
2018-04-30 20:16



Bugzilla veri tabanları için 15 saniye kadar uzun süren sözünüzün geçerli olup olmadığından emin değilim. Bazı sorgular gerçekten biraz zaman alabilir, sadece bakın bugzilla.mozilla.org ve birkaç ürün üzerinde bazı jenerik terimleri arayın. - Palmin
15 saniye genel olarak web uygulamaları hakkında bir yorumdu - eğer bugzilla rutin olarak sorgular için bu kadar uzun sürerse, o zamanlar ciddi bir yanlışlık olmalı. - Ian


Kaç apache işçiniz var? İzin verdiğiniz maksimum mysql bağlantıları nedir? Apache isteği ele alırken httpd çalışanı başına bir cgi işlemi başlattıkça, eski dosya boyutu, mysql'nin izin verdiğinden daha fazla bağlantı açabileceğinden daha büyüktür.

Aşağıdaki günlük ayarlarını öneririm

log_slow_queries
log-queries-not-using-indexes
set-variable = long_query_time=1

1
2018-04-30 11:41



Bilmediğim en çok httpd çalışan iş parçacığı sayısı (bunu nasıl bulabilirim?). max_connections 100 olarak ayarlanır, ancak herhangi bir zamanda 1000'den fazla httpd işlemi olduğundan şüpheliyim. - Palmin


Damping için bir cron işi çok faydalıdır, ama aslında bir şeyi gerçekten çizmeye hazır bir şey yapmıyorsanız tavsiye edebilirim Munin izleme için MySQL eklentileri vardır

  • çıktı
  • sorguları
  • veritabanları boyutu
  • yavaş sorgular
  • İş Parçacığı

sivri belirlemek için oldukça yararlı olabilir. Varsayılan olarak beş dakika aralıklarla çalışırım.

Geçen yıl boyunca bunu kullanmadan önce bununla birlikte oldukça ilginç bir durum keşfettim, aksi halde tamamen fark edilmeden geçecekti.


1
2018-04-30 14:31