DBAtlas · Atlas d'exploitation des bases de données

CPU élevé

Symptôme

CPU du serveur à 90 %+ ; tout le système est lent et le load average est élevé.

1. Vérifiez que c'est bien la base qui consomme le CPU

Utilisez top/mpstat au niveau OS pour vérifier que le processus qui consomme le CPU est bien la base. Parfois, un processus voisin ou une sauvegarde/un antivirus est en cause. Si l'iowait est élevé, le problème vient du disque, pas du CPU.

2. Trouvez les requêtes les plus gourmandes en CPU

Extrayez les requêtes principales triées par temps CPU. En général, quelques requêtes (mauvais plan, parcours complet, index manquant) consomment le 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. Recherchez un problème de plan / d'index

Obtenez le plan de la requête fautive. Les full table scans, les explosions de nested loops, les débordements de hash join ou les mauvais plans dus au parameter sniffing/à des statistiques obsolètes consomment le CPU. Ajoutez un index ou collectez les statistiques.

4. Soulagez immédiatement

Tuez la requête incontrôlée et, si besoin, limitez-la avec Resource Manager/Resource Governor. Pour une charge apparue soudainement, examinez le dernier déploiement/changement de paramètre.

5. Corrigez durablement

Corrigez la requête/l'index, assurez la stabilité des plans et planifiez le job de collecte des statistiques. Si le CPU est constamment à 100 %, une mise à l'échelle (ajout de CPU, répartition des lectures sur des réplicas) peut être nécessaire.

Ouvrir dans DBAtlas →