dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #15
mysql
PerformanceSEV2 · CİDDİ BOZULMA15-30 dakika / 15-30 minsSUPER / CONNECTION_ADMIN / RELOAD / REPLICATION CLIENT

MySQL Yüksek Threads_running ve CPU: Sorgu mu Kilit mi?

Eşzamanlı çalışan thread artışının CPU yoğun sorgulardan mı yoksa kilit ve I/O beklemelerinden mi kaynaklandığını ayırır; güvenli triyaj ve kalıcı çözümü açıklar.

İlişkili Metrik:M14
İlişkili Script:S21S22S25
#threads-running#cpu#processlist#query-digest

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Belirti / Symptom

- M14 (`Threads_running`) baz çizgisinin ve CPU çekirdek sayısının üzerinde kalıyor; sorgu gecikmeleri artıyor. CPU'nun da yüksek olup olmadığını işletim sisteminden **ayrıca** doğrulayın.

- `Too many connections` da varsa `mysql-too-many-connections` runbook'una bakın.

2. Etki / Impact

Sorgular kuyruklanır ve uygulamada zaman aşımı görülür. Threads_running yüksekliği tek başına yüksek CPU demek değildir; kilit veya disk beklemesi de olabilir.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. Anlık sayaçları ve uzun işlemleri (S21) alın:
sql
SHOW GLOBAL STATUS WHERE Variable_name IN ('Threads_running','Threads_connected','Questions','Slow_queries');
SELECT id, user, host, db, time AS seconds, state, LEFT(info,200) AS sql_text
FROM information_schema.processlist
WHERE command <> 'Sleep' ORDER BY time DESC LIMIT 30;
🟢 Salt Okunur2. En pahalı sorgu kalıplarını (S25) kontrol edin:
sql
SELECT schema_name, LEFT(digest_text,160) AS query_pattern, count_star,
       ROUND(sum_timer_wait/1e12,2) AS total_seconds,
       ROUND(sum_timer_wait/NULLIF(count_star,0)/1e9,2) AS avg_ms,
       sum_rows_examined, sum_no_index_used
FROM performance_schema.events_statements_summary_by_digest
WHERE schema_name IS NOT NULL ORDER BY sum_timer_wait DESC LIMIT 15;
🟢 Salt Okunur3. `state` alanında kilit beklemeleri varsa S22 ve `mysql-lock-wait-timeout` runbook'una geçin; I/O beklemeleri varsa S39 ile dosya I/O'sunu inceleyin. İlgili sorguda `EXPLAIN` çalıştırın; SQL'i `EXPLAIN` için yer tutucu olarak aşağıya doğrudan yapıştırmayın, önce hassas veri ve sürümü kontrol edin.
🟢 Salt Okunur4. OS CPU (`top`/`mpstat`) ve disk (`iostat -x`) verisini aynı zaman penceresinde kaydedin. Digest sayaçları kümülatiftir; iki ölçüm arasındaki artışı karşılaştırın.

4. Müdahale / Response

🟡 Geri Alınabilir1. Önce problemli batch/raporlama işini uygulama sahibine danışarak durdurun veya eşzamanlılığını azaltın. Tek sorgu belirgin biçimde zararlıysa oturumu doğrulayıp `KILL QUERY <id>;` ile sadece sorguyu iptal edin; açık transaction varsa `KILL QUERY` onu otomatik geri almaz.
🟡 Geri Alınabilir2. Tam tablo taraması olan sorguyu indeks ve filtre seçiciliğiyle düzeltin; yeni indeks (DDL) yazma ve kilit etkisi yaratır, ayrı değişiklik penceresinde uygulayın.
🟡 Geri Alınabilir3. Uygulama havuzlarında eşzamanlılık/admission control sınırı koyun; ani yükte geri basınç sağlayın.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ4. Sunucuyu yeniden başlatmak veya `KILL` komutlarını topluca çalıştırmak son çare olmalıdır; mevcut işlemleri ve replica gecikmesini bozabilir.

5. Doğrulama / Verification

- M14, CPU ve p95 sorgu gecikmesi baz çizgiye iner; aktif oturum kuyruğu çözülür.

- Değişen sorgunun `EXPLAIN` planı, okunan satır sayısı ve uygulama hataları yeniden ölçülür.

6. Geri Alma / Rollback

- Durdurulan batch'i kontrollü hızda yeniden başlatın; uygulama eşzamanlılık ayarını eski değerine döndürün.

- İndeks değişikliğini geri almadan önce sorgu planını ve diğer sorgulara etkisini doğrulayın. İptal edilen sorgu otomatik devam etmez.

Diğer MYSQL Runbook'ları