172 похожих чатов

Вопрос по перформансу вставки. Как понять почему база тормозит под

нагрузкой?

В таблице есть 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 ответов

10 просмотров

Тут возможны две причины: 1. Insert-ы деруться за relation extension lock. Мы с этой проблемой сталкивались. Лечить её можно многоми способами. Но не на уровне DBA (т.е. надо патчить постгрес). А какую версию Посгреса вы используете? В ваниле были относительно недавно фиксы по этому поводу. 2. Инсёрты деруться с селектами. А можете попробовать убрать вообще селекты (или инсёрты) и посмотреть как от этого изменится скорость? Или для этого придётся слишком много всего менять?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
22
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта