Высокая загрузка CPU
Симптом
CPU сервера загружен на 90%+; вся система работает медленно, load average высокий.
1. Убедитесь, что CPU действительно потребляет БД
С помощью top/mpstat на уровне ОС убедитесь, что CPU потребляет именно процесс БД. Иногда потребитель — соседний процесс или бэкап/антивирус. Если iowait высокий, проблема в диске, а не в CPU.
2. Найдите запросы, больше всего нагружающие CPU
Выведите топ запросов, отсортированных по времени CPU. Обычно 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. Проверьте проблему плана / индекса
Получите план проблемного запроса. CPU сжигают полные сканирования таблиц, взрыв nested loop, сброс hash join на диск или плохие планы из-за parameter sniffing/устаревшей статистики. Добавьте индекс или соберите статистику.
4. Немедленно снимите нагрузку
Завершите вышедший из-под контроля запрос и при необходимости ограничьте его через Resource Manager/Resource Governor. Если нагрузка возникла внезапно, проверьте последний деплой/изменение параметров.
5. Исправьте окончательно
Исправьте запрос/индекс, обеспечьте стабильность плана и запланируйте задание сбора статистики. Если CPU постоянно на 100%, может потребоваться масштабирование (добавление CPU, распределение чтения на реплики для чтения).