Merhaba arkadaşlar, bugün sizlere özellikle sunucu yükü arttığında, bir sorgunun neden takıldığını anlamak için çok kullandığım bir yöntemi anlatacağım. MySQL veya MariaDB sunucunuzda o anda çalışan tüm bağlantıları ve sorguları görmenizi sağlayan SHOW PROCESSLIST komutunu detaylıca inceleyeceğiz. Bu komut, performans sorunlarını tespit etmek, uzun süren sorguları yakalamak ve gereksiz bağlantıları sonlandırmak için bir sistem yöneticisinin en temel araçlarından biridir.
SHOW PROCESSLIST Nedir ve Ne İşe Yarar?
Bu komut, veritabanı sunucusuna o an bağlı olan tüm istemci bağlantılarının (thread'lerin) bir listesini ve bu bağlantıların ne yaptığını gösterir. Örneğin, bir sorgu çok uzun süredir "Sending data" durumundaysa bu bir problem işareti olabilir. Ben genelde sunucu yavaşladığında ilk iş bu komutu çalıştırır, durumu hızlıca analiz ederim.
Komutun Kullanımı ve Çıktısını Anlama
Komutu kullanmak çok basit. MySQL/MariaDB komut satırına bağlanıp aşağıdaki gibi çalıştırmanız yeterli:
SHOW FULL PROCESSLIST yazmamızın sebebi, normal SHOW PROCESSLIST komutunun sorgu metnini kısaltmasıdır. "FULL" anahtar kelimesi ile tüm sorguyu, ne kadar uzun olursa olsun görebilirsiniz.
Komutu çalıştırdığınızda karşınıza şuna benzer bir tablo çıkacak:
Şimdi bu sütunların ne anlama geldiğine bakalım:
- Id: Bağlantının benzersiz kimliği. Bir bağlantıyı sonlandırmak (KILL komutu) için bu numarayı kullanacağız.
- User: Bağlantıyı yapan kullanıcı adı.
- Host: Bağlantının geldiği IP adresi ve portu.
- db: Bağlantının kullandığı veritabanı adı.
- Command: Bağlantının yaptığı işlem tipi (Query, Sleep, Connect, Binlog Dump gibi).
- Time: İşlemin başlayalı kaç saniye olduğu. Buradaki yüksek değerler (100+ saniye) kritik olabilir.
- State: Bağlantının/thread'in o anki durumu (Sending data, Copying to tmp table, Sorting result, Locked gibi). Bu durumlar sorunun kaynağını anlamada çok önemlidir.
- Info: Çalıştırılan SQL sorgusu. Eğer bağlantı bir şey yapmıyorsa (Command: Sleep) bu alan NULL olur.
Kritik Durumlar ve Problem Tespiti
Performans sorunlarını tespit ederken şu durumlara özellikle dikkat ediyorum:
- Time değeri çok yüksek olan (Sleep hariç) sorgular.
- State alanında Locked, Creating tmp table, Copying to tmp table on disk gibi ifadeler görmek. Özellikle "on disk" ifadesi, bellek yetersizliğine işaret edebilir.
- Aynı veya benzer Info sorgusunu çalıştıran çok sayıda bağlantı olması (örneğin, cache edilmemiş bir sayfanın yoğun ziyareti).
- Command değeri Sleep olup da Time değeri çok yüksek olan bağlantılar. Bunlar genellikle bağlantıyı kapatmayan/kapatamayan uygulamalardan kalır ve zamanla birikerek max_connections limitini doldurur.
Sorunlu Bir Bağlantıyı Sonlandırmak (KILL)
Eğer bir sorgunun (örneğin, yanlış yazılmış bir JOIN) sunucuyu kilitlediğini düşünüyorsanız, o bağlantıyı sonlandırabilirsiniz. Bunun için SHOW PROCESSLIST çıktısındaki Id değerini kullanırız.
Diyelim ki Id'si 15 olan sorgu çok uzun süredir çalışıyor ve sunucuyu yavaşlatıyor. Sonlandırmak için:
Eğer bağlantı direnç gösterirse, zorla sonlandırmak için:
Bu komutları kullanırken çok dikkatli olmalısınız. Özellikle canlı bir veritabanında, önemli bir UPDATE/INSERT işlemini yarıda kesmek veri tutarsızlığına yol açabilir. Önce sorgunun ne yaptığından emin olun.
Sürekli İzleme ve Pratik İpuçları
Ben genelde sunucu yönetirken bu listeyi sürekli açık tutmam. Ancak sorun anında hızlıca bakmak için şu yöntemleri kullanıyorum:
- Sürekli Yenilenen Liste: Linux terminalinde, belirli aralıklarla komutu çalıştırmak için watch komutunu kullanabilirsiniz.
- Filtreleme: Doğrudan INFORMATION_SCHEMA.PROCESSLIST tablosuna sorgu yazarak, sadece belirli kullanıcıları veya uzun süren sorguları listeleyebilirsiniz.
- phpMyAdmin veya Adminer: Eğer GUI tercih ediyorsanız, bu araçların "Süreçler" veya "İşlemler" sekmesi genelde aynı bilgiyi daha düzenli gösterir.
Umarım bu rehber, veritabanı sunucunuzdaki gizli kalmış performans sorunlarını bulmanıza yardımcı olur. SHOW PROCESSLIST, benim için vazgeçilmez bir ilk müdahale aracıdır.
Peki siz sunucularınızda performans izleme için hangi araçları ve yöntemleri kullanıyorsunuz? Özellikle MariaDB/MySQL için başka pratik ipuçlarınız var mı? Sorularınız veya eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin.
Bu komut, veritabanı sunucusuna o an bağlı olan tüm istemci bağlantılarının (thread'lerin) bir listesini ve bu bağlantıların ne yaptığını gösterir. Örneğin, bir sorgu çok uzun süredir "Sending data" durumundaysa bu bir problem işareti olabilir. Ben genelde sunucu yavaşladığında ilk iş bu komutu çalıştırır, durumu hızlıca analiz ederim.
Komutu kullanmak çok basit. MySQL/MariaDB komut satırına bağlanıp aşağıdaki gibi çalıştırmanız yeterli:
SQL:
SHOW FULL PROCESSLIST;
SHOW FULL PROCESSLIST yazmamızın sebebi, normal SHOW PROCESSLIST komutunun sorgu metnini kısaltmasıdır. "FULL" anahtar kelimesi ile tüm sorguyu, ne kadar uzun olursa olsun görebilirsiniz.
Komutu çalıştırdığınızda karşınıza şuna benzer bir tablo çıkacak:
SQL:
+----+-----------------+---------------------+-------+---------+------+------------------------+----------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+---------------------+-------+---------+------+------------------------+----------------------------------------------------------+
| 5 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL |
| 8 | root | localhost | forum | Query | 0 | executing | SELECT FROM xf_user WHERE user_id = 1000 |
| 15 | forum_user | 192.168.1.55:12345 | forum | Query | 12 | Sending data | SELECT FROM xf_post WHERE thread_id = 500 ORDER BY... |
| 23 | backup_user | 192.168.1.10:54321 | NULL | Sleep | 245 | | NULL |
+----+-----------------+---------------------+-------+---------+------+------------------------+----------------------------------------------------------+
Şimdi bu sütunların ne anlama geldiğine bakalım:
- Id: Bağlantının benzersiz kimliği. Bir bağlantıyı sonlandırmak (KILL komutu) için bu numarayı kullanacağız.
- User: Bağlantıyı yapan kullanıcı adı.
- Host: Bağlantının geldiği IP adresi ve portu.
- db: Bağlantının kullandığı veritabanı adı.
- Command: Bağlantının yaptığı işlem tipi (Query, Sleep, Connect, Binlog Dump gibi).
- Time: İşlemin başlayalı kaç saniye olduğu. Buradaki yüksek değerler (100+ saniye) kritik olabilir.
- State: Bağlantının/thread'in o anki durumu (Sending data, Copying to tmp table, Sorting result, Locked gibi). Bu durumlar sorunun kaynağını anlamada çok önemlidir.
- Info: Çalıştırılan SQL sorgusu. Eğer bağlantı bir şey yapmıyorsa (Command: Sleep) bu alan NULL olur.
Performans sorunlarını tespit ederken şu durumlara özellikle dikkat ediyorum:
- Time değeri çok yüksek olan (Sleep hariç) sorgular.
- State alanında Locked, Creating tmp table, Copying to tmp table on disk gibi ifadeler görmek. Özellikle "on disk" ifadesi, bellek yetersizliğine işaret edebilir.
- Aynı veya benzer Info sorgusunu çalıştıran çok sayıda bağlantı olması (örneğin, cache edilmemiş bir sayfanın yoğun ziyareti).
- Command değeri Sleep olup da Time değeri çok yüksek olan bağlantılar. Bunlar genellikle bağlantıyı kapatmayan/kapatamayan uygulamalardan kalır ve zamanla birikerek max_connections limitini doldurur.
Eğer bir sorgunun (örneğin, yanlış yazılmış bir JOIN) sunucuyu kilitlediğini düşünüyorsanız, o bağlantıyı sonlandırabilirsiniz. Bunun için SHOW PROCESSLIST çıktısındaki Id değerini kullanırız.
Diyelim ki Id'si 15 olan sorgu çok uzun süredir çalışıyor ve sunucuyu yavaşlatıyor. Sonlandırmak için:
SQL:
KILL 15;
Eğer bağlantı direnç gösterirse, zorla sonlandırmak için:
SQL:
KILL QUERY 15; -- Sadece sorguyu durdurur, bağlantıyı kapatmaz.
-- veya
KILL CONNECTION 15; -- Sorguyu durdurur ve bağlantıyı tamamen kapatır.
Bu komutları kullanırken çok dikkatli olmalısınız. Özellikle canlı bir veritabanında, önemli bir UPDATE/INSERT işlemini yarıda kesmek veri tutarsızlığına yol açabilir. Önce sorgunun ne yaptığından emin olun.
Ben genelde sunucu yönetirken bu listeyi sürekli açık tutmam. Ancak sorun anında hızlıca bakmak için şu yöntemleri kullanıyorum:
- Sürekli Yenilenen Liste: Linux terminalinde, belirli aralıklarla komutu çalıştırmak için watch komutunu kullanabilirsiniz.
Bash:
watch -n 3 'mysql -u root -p -e "SHOW FULL PROCESSLIST"'
SQL:
SELECT FROM INFORMATION_SCHEMA.PROCESSLIST WHERE TIME > 100 AND COMMAND != 'Sleep' ORDER BY TIME DESC;
Umarım bu rehber, veritabanı sunucunuzdaki gizli kalmış performans sorunlarını bulmanıza yardımcı olur. SHOW PROCESSLIST, benim için vazgeçilmez bir ilk müdahale aracıdır.
Peki siz sunucularınızda performans izleme için hangi araçları ve yöntemleri kullanıyorsunuz? Özellikle MariaDB/MySQL için başka pratik ipuçlarınız var mı? Sorularınız veya eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin.