Re: Contention preventing locking

Поиск
Список
Период
Сортировка
От Konstantin Knizhnik
Тема Re: Contention preventing locking
Дата
Msg-id 135375de-85cf-ff47-184b-0abef633364f@postgrespro.ru
обсуждение исходный текст
Ответ на Re: Contention preventing locking  (Simon Riggs <simon@2ndquadrant.com>)
Список pgsql-hackers

On 20.02.2018 16:42, Simon Riggs wrote:
> On 20 February 2018 at 13:19, Konstantin Knizhnik
> <k.knizhnik@postgrespro.ru> wrote:
>>
>> On 20.02.2018 14:26, Simon Riggs wrote:
>>> On 15 February 2018 at 16:00, Konstantin Knizhnik
>>> <k.knizhnik@postgrespro.ru> wrote:
>>>
>>>> So in heap_acquire_tuplock all competing transactions are waiting for TID
>>>> of
>>>> the updated version. When transaction which changed this tuple is
>>>> committed,
>>>> one of the competitors will grant this lock and proceed, creating new
>>>> version of the tuple. Then all other competitors will be awaken and ...
>>>> find
>>>> out that locked tuple is not the last version any more.
>>>> Then they will locate new version and try to lock it... The more
>>>> competitors
>>>> we have, then more attempts they all have to perform (quadratic
>>>> complexity).
>>> What about the tuple lock? You are saying that is ineffective?
>>>
>>> src/backend/access/heap/README.tuplock
>>
>> In my last mail ni this thread I have mentioned that update of tuple cause
>> setting of three heavy weight locks:
>>
>> 1. Locking of SnapshotDirty.xmax transaction (XactLockTableWait) in
>> EvalPlanQualFetch
>> 2. Tuple lock (heap_acquire_tuplock) in heap_tuple_update
>> 3. Transaction lock (XactLockTableWait) in heap_tuple_update
>>
>> So what I see in debugger and monitoring pg_locks, is that under high
>> contention there are a lot transactions waiting for SnapshotDirty.xmax.
>> This lock is obtained before tuple lock, so tuple lock can not help in this
>> case.
> Hmm, that situation occurs erroneously, as I previously observed
> https://www.postgresql.org/message-id/CANP8%2BjKoMAyXvMO2hUqFzHX8fYSFc82q9MEse2zAEOC8vxwDfA%40mail.gmail.com
>
> So if you apply the patch on the thread above, does performance improve?
>
First of all this patch is not correct: it cause pin/unpin buffer 
disbalance and I get a lot of errors:

Update failed: ERROR:  buffer 343 is not owned by resource owner Portal

When I slightly modify it by moving ReleaseBuffer(buffer) inside switch 
I get almost the same performance as Vanilla.
And when I combined it with pklock patch, then I get similar performance 
with vanilla+pklock, but with much larger dips:

https://docs.google.com/spreadsheets/d/1QOYfUehy8U3sdasMjGnPGQJY8JiRfZmlS64YRBM0YTo/edit?usp=sharing 



-- 
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Simon Riggs
Дата:
Сообщение: Re: committing inside cursor loop
Следующее
От: Alvaro Herrera
Дата:
Сообщение: Re: pgsql: Allow UNIQUE indexes on partitioned tables