К нам обратилась компания СиАрЭм — разработчик CRM-системы для B2B-продаж. Их продукт используют 340 компаний, в базе 28 миллионов контактов и 4.5 миллиона сделок. PostgreSQL 15, один сервер: 32 vCPU, 128 GB RAM, NVMe SSD.
Жалоба была конкретной: «Когда менеджеры запускают отчёт по воронке продаж, база встаёт на 30-40 секунд. В это время CRM тормозит для всех 2 000 пользователей».
Подключились к серверу и первым делом проверили текущую нагрузку:
-- Активные запросы прямо сейчас
SELECT pid, now() - pg_stat_activity.query_start AS duration,
query, state, wait_event_type, wait_event
FROM pg_stat_activity
WHERE state != 'idle'
AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY duration DESC;
-- pid | duration | state | wait_event
-- 4521 | 00:00:37 | active | DataFileRead
-- 4522 | 00:00:34 | active | DataFileRead
-- 4530 | 00:00:28 | active | LWLock:BufferMappingТри запроса висели по 28-37 секунд, все ждали чтения данных с диска. Это означало, что запросы читали гораздо больше данных, чем помещалось в shared_buffers. Мы нашли основного виновника — запрос отчёта по воронке продаж, который выполнялся 42 секунды.
Оставить комментарий