нагрузкой?
                  
                  
                  
                  
                  
                  В таблице есть 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. Инсёрты деруться с селектами. А можете попробовать убрать вообще селекты (или инсёрты) и посмотреть как от этого изменится скорость? Или для этого придётся слишком много всего менять?
Обсуждают сегодня