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.