Re: LWlock:LockManager waits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



James,

A lock can be obtained in the parse, plan and execute step, depending on cache, state and type of object.

A LWLock is a spinlock, a low level access mechanism that is supposed to be extremely quickly. It is used to serialise access to elementary structures mostly for changes.
A Lock is an higher level lock that is much more sophisticated, contains multiple states and can order multiple requests. It is used to safeguard transaction intention for objects.

The wait LWLock:LockManager is documented to have two common reasons: too many locks being acquired, exceeding the fastpath slots number (16) and/or exceeding CPU capacity.

What is happening if you are waiting for a LWLock is that the number of processes trying to access the structure (the lock manager) is higher than one. Because the LWLock is meant to be held so briefly that there should no waiting, it means that if you are waiting for it, there must be a reason it’s held so long. An obvious reason for holding a LWLock too long is if there are more tasks on the OS than CPU’s, as Laurenz indicates. If such a situation happens, it’s possible a tasks is put off CPU by the operating system whilst holding the LWLock, which will greatly increase the time waiting for it, because the LWLock can only be released if the task manages to get back on CPU.

Regards,

Frits Hoogland




On 9 Apr 2024, at 09:54, James Pang <jamespang886@xxxxxxxxx> wrote:

you mean too many concurrent sessions trying to acquire lock on same relation , then waiting on  "LockManager" LWlock,right?  this contention occurred on parsing ,planning, or execute step ? 

Thanks,

James

Laurenz Albe <laurenz.albe@xxxxxxxxxxx> 於 2024年4月9日週二 下午12:31寫道:
On Tue, 2024-04-09 at 11:07 +0800, James Pang wrote:
>    we found sometimes , with many sessions running same query "select ..." at the same time, saw many sessions waiting on "LockManager".  for example, pg_stat_activity show.  It's a production server, so no enable trace_lwlocks flag. could you direct me what's the possible reason and how to reduce this "lockmanager" lock?  all the sql statement are "select " ,no DML.
>
>    time                                             wait_event           count(pid) 
> 2024-04-08 09:00:06.043996+00 | DataFileRead  |    42
>  2024-04-08 09:00:06.043996+00 |               |    15
>  2024-04-08 09:00:06.043996+00 | LockManager   |    31
>  2024-04-08 09:00:06.043996+00 | BufferMapping |    46
>  2024-04-08 09:00:07.114015+00 | LockManager   |    43
>  2024-04-08 09:00:07.114015+00 | DataFileRead  |    28
>  2024-04-08 09:00:07.114015+00 | ClientRead    |    11
>  2024-04-08 09:00:07.114015+00 |               |    11

That's quite obvious: too many connections cause internal contention in the database.

Reduce the number of connections by using a reasonably sized connection pool.

Yours,
Laurenz Albe


[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux