Yardım Merkezi

Sleep Durumdaki MySQL Sorguları Nedir?

Merhabalar,

Bu yazıda MySQL üzerinde durumu (Command - Emir hali) Sleep yani uyku olan sorguların ne olduğunu ve sleep'e geçişine karşı neler yapabileceğinizi anlatacağız.

Herhangi bir MySQL veritabanına bağlantı kurduğunuzda, aynı zamanda veritabanı üzerinde bu bağlantı için bir session oluşturmuş oluyorsunuz. Ancak bu bağlantı ya da session düzgün bir şekilde kapatılmayacak olur ise, sorgu sleep durumuna düşer ve timeout süresini bekler

MySQL Referans Kılavuzunda Sleep emrinin sebebi olarak, İlgili sorgunun sorguyu oluşturan istemci tarafından yeni bir işlem/sorgu (action/query) beklenmesi olduğu belirtilmektedir.

Yani, Sleep'e düşen sorgular sonlanmak için timeout süresini beklerler. Bu da sorgunun işlenmesi, tamamlanması ya da terminate olması konusundaki sürenin artışına sebep olur. Peki sunucunuzda Sleep durumu mevcut mu? 

MySQL terminaline bağlanarak;

show processlist;

Komutunu çalıştıralım, bu sorgu, aktif bekleyen tüm işlemleri listeler.

Sleep durumundaki sorgulara ait örnek bir görsel aşağıdaki gibidir;

Sleep durumdaki sorgular

Yüksek sayıda Sleep'e düşen sorgular nelere sebep olabilir?

  • CPU, RAM vb. kaynakların gereksiz yere tüketilmesi
  • Sunucu genelinde loadların artması sebebi ile oluşan yavaşlama
  • Web sitelerinin ve bazı servislerin erişim dışı kalması. (Evet, pek çok kötü niyetli kişi Sleep sorguları servisleri erişilmez duruma getirmek için kullanır)

Peki MySQL'de neden Sleep durumları oluşuyor?

Yeni bir işlem/sorgu bekleyen bu işlemler, yani sleep durumdaki sorgular kodlama tarafında sorgu gönderilmesi ve istenen işlemin tamamlanması ardından bağlantının sonlandırılmaması ya da veritabanından beklenmedik şekilde bağlantınızın düşmesi sebebi ile gerçekleşmektedir.

Yani, Sleep durumdaki sogular bir PHP scriptinin MySQL'e bağlanması, sorguları işlemesi ancak bağlantıyı sonlandırmadan MySQL sunucusunu terk etmesinden ötürü oluşabilmektedir.

Query ve/veya Thread sonlanana kadar bu işlem için gerçekleşen sorgular (Bağlantı sonlandırılmadan düştüğü / çıkıldığı için) sorguya devam edilebileceği düşüncesi ile MySQL tarafından RAM üzerinde 28,800 saniye tutulmaktadır. (Öntanımlı değerdir)

Yani birden çok PHP sorgusunun bu şekilde bağlantıyı sonlandırmadan veritabanı sunucusuna hiçbir işlem yapmadan bağlı olduğu bir ortamda pek çok Sleep sorgu oluşmuş olacaktır.

Ne şekilde önleyebilirsiniz?

MySQL üzerinde sleep durumunu iki parametre belirlemektedir.

"interactive_ timeout" ve "wait_ timeout"

Bu parametreler üzerinde tanımlı olan değer, sorguların ne kadar süre Aktif bekleyebileceği ya da Sleep durumda bekleyebileceği üzerinde rol oynamaktadır.

Öntanımlı olarak her iki parametreye de 28800 değeri tanımlıdır. (8 saat)

Bu değerleri düzenleyebilmek için öncelik ile MySQL'e giriş yapın ve MySQL terminalinde aşağıdaki komutları çalıştırın;

SET GLOBAL interactive_timeout = 180;
SET GLOBAL wait_timeout = 180;

İşlem temel olarak tamamlanmıştır. (8 saat olan timeout süresi, 180 saniye yani 3 dakika olarak ayarlanmış olacaktır.)

Ardından bu parametreleri restart ardından tekrar etkin olabilmesi için my.cnf dosyanız içerisine aşağıdaki şekilde yazın. (my.cnf dosyası genel olarak /etc dizini altındadır.)

interactive_timeout=180
wait_timeout=180

Alternatif olarak, ilgili parametreleri my.cnf dosyanıza yazdıktan sonra MySQL servisini yeniden başlatabilirsiniz.

NOT: Ek olarak bütün scriptlerinizin sonuna mysql_close() fonksiyonunu eklemenizi öneririz. Bu şekilde vertiabanı ile işi bitince script otomatik olarak bağlantıyı sonlandıracaktır.

İyi çalışmalar dilerim.

Netdirekt A.Ş.

Başka Bir Konu Araştırın
Bulduğunuz konu aradığınız sorulara cevap vermediyse yeni bir konu araştırın.