dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #15
mysql
PerformanceSEV2 · DEGRADATION15-30 dakika / 15-30 minsSUPER / CONNECTION_ADMIN / RELOAD / REPLICATION CLIENT

MySQL High Threads_running and CPU: Queries or Lock Contention?

Separates CPU-heavy queries from lock and I/O waits behind rising concurrent threads, then provides safe triage and lasting remedies.

Related Metrics:M14
Related Scripts:S21S22S25
#threads-running#cpu#processlist#query-digest

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

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

1. Symptom & Signals

- 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. Business & Technical 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. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. 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;
🟢 Read-Only2. 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;
🟢 Read-Only3. `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.
🟢 Read-Only4. 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. Remediation & Action Plan

🟡 Reversible1. Ö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.
🟡 Reversible2. 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.
🟡 Reversible3. Uygulama havuzlarında eşzamanlılık/admission control sınırı koyun; ani yükte geri basınç sağlayın.
🔴 HIGH RISK / IRREVERSIBLE4. 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. Verification & Health Checks

- 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. Rollback & Contingency Plan

- 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.

More MYSQL Runbooks