DBAtlas · Атлас эксплуатации баз данных

Высокая загрузка 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, распределение чтения на реплики для чтения).

Открыть в DBAtlas →