нагрузкой?
В таблице есть 16 полей, 5 индексов и пару foreign key. Всего около 11 миллионов строк.
Вставка в эту таблицу без нагрузки занимает единицы милисекунд. Но если дать большую нагрузку, то именно эти запросы начинают работать очень долго, вплоть до 10 секунд 😞
Транзакции делаю как можно короче, в них только пару селектов и вот этот insert.
Использую постгрес версии 10.0, развернут на azure. Конфигурация сейчас минимальная (специально сделал, чтобы ловить проблемы перформанса): два ядра, 5к IOPS.
Пример query plan:
Insert on xx (cost=0.00..0.01 rows=1 width=2352) (actual time=8.029..8.030 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=2352) (actual time=0.011..0.012 rows=1 loops=1)
Planning time: 0.052 ms
Trigger for constraint xx_fkey: time=0.207 calls=1
Trigger for constraint yy_fkey: time=0.130 calls=1
Execution time: 8.418 ms
Влючил опцию log_lock_waits. Очень редко появляются сообщения вида:
2019-12-27 12:42:20 UTC-5e05fbfe.4e07c-LOG: process 319612 still waiting for ExclusiveLock on extension of relation 16671 of database 16497 after 640.643 ms
2019-12-27 12:42:20 UTC-5e05fbfe.4e07c-DETAIL: Process holding the lock: 319584. Wait queue: 319616, 319612, 319596, 319544, 319536, 319504, 319636.
Иногда в бэкенде вижу эксепшены типа такого:
QueryCanceled: canceling statement due to statement timeout
CONTEXT: while locking tuple (12,12) in relation "customer"
SQL statement "SELECT 1 FROM ONLY "public"."customer" x WHERE "customer_id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x"
Судя по всему это лок на форенкей. KEY SHARE это экслюзивный лок?
В общем куда копать, как и что можно логировать?
Хочу попробовать убрать foreign key и индексы. Посмотреть насколько увеличиться RPS.
Тут возможны две причины: 1. Insert-ы деруться за relation extension lock. Мы с этой проблемой сталкивались. Лечить её можно многоми способами. Но не на уровне DBA (т.е. надо патчить постгрес). А какую версию Посгреса вы используете? В ваниле были относительно недавно фиксы по этому поводу. 2. Инсёрты деруться с селектами. А можете попробовать убрать вообще селекты (или инсёрты) и посмотреть как от этого изменится скорость? Или для этого придётся слишком много всего менять?
Обсуждают сегодня