DBAtlas · Atlas für Datenbankbetrieb

Hohe CPU

Symptom

Server-CPU bei 90 %+; das gesamte System ist langsam und der Load Average ist hoch.

1. Prüfen, ob wirklich die DB die CPU verbraucht

Prüfe auf OS-Ebene mit top/mpstat, ob der CPU-verbrauchende Prozess tatsächlich die DB ist. Manchmal ist ein benachbarter Prozess oder ein Backup/Virenscanner der Verbraucher. Ist iowait hoch, liegt das Problem bei der Platte, nicht bei der CPU.

2. Die Abfragen mit dem höchsten CPU-Verbrauch finden

Ermittle die Top-Abfragen nach CPU-Zeit. Meist verbrennen wenige Abfragen (schlechter Plan, Full Scan, fehlender Index) die CPU.

Oracle

SELECT sql_id, cpu_time/1e6 cpu_sec, executions, sql_text FROM v$sql ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY;

PostgreSQL

SELECT query, calls, total_exec_time, mean_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;

MySQL

SELECT digest_text, count_star, sum_timer_wait/1e12 sec FROM performance_schema.events_statements_summary_by_digest ORDER BY sum_timer_wait DESC LIMIT 10;

SQL Server

SELECT TOP 10 total_worker_time/execution_count avg_cpu, execution_count, SUBSTRING(t.text,1,200) FROM sys.dm_exec_query_stats q CROSS APPLY sys.dm_exec_sql_text(q.sql_handle) t ORDER BY total_worker_time DESC;

3. Auf Plan-/Indexprobleme prüfen

Hole dir den Plan der verursachenden Abfrage. Full Table Scans, explodierende Nested Loops, Hash-Join-Spills oder schlechte Pläne durch Parameter Sniffing/veraltete Statistiken verbrennen CPU. Lege einen Index an oder sammle Statistiken.

4. Sofort entlasten

Beende die ausufernde Abfrage und begrenze sie bei Bedarf mit Resource Manager/Resource Governor. Bei plötzlich aufgetretener Last prüfe das letzte Deployment bzw. die letzte Parameteränderung.

5. Dauerhaft beheben

Korrigiere Abfrage/Index, sichere die Planstabilität und plane den Job zum Sammeln der Statistiken. Liegt die CPU ständig bei 100 %, kann Skalierung nötig sein (mehr CPU, Verteilung der Lesezugriffe auf Read Replicas).

In DBAtlas öffnen →