共计 2396 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章主要介绍“怎么使用 PostgreSQL 中的 lightweight locks.”,在日常操作中,相信很多人在怎么使用 PostgreSQL 中的 lightweight locks. 问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用 PostgreSQL 中的 lightweight locks.”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
简介
PG 中的 lightweight locks(LWLocks, 在其他数据库称为 Latchs) 轻量级锁用于控制内存访问, 只有两种级别的锁:shared 和 exclusive.
通过系统视图 pg_stat_activity 可查看关于 Lock/Wait 的相关信息
[local]:5432 pg12@testdb=# select * from pg_stat_activity where pid = 5914;
-[ RECORD 1 ]----+------------------------------------
datid | 16384
datname | testdb
pid | 5914
usesysid | 10
usename | pg12
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2019-08-22 11:40:58.504462+08
xact_start | 2019-08-22 12:16:02.528978+08
query_start | 2019-08-22 12:16:04.372427+08
state_change | 2019-08-22 12:16:04.374888+08
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid | 716
backend_xmin |
query | delete from t_prewarm where id = 1;
backend_type | client backend
Time: 14.262 ms
[local]:5432 pg12@testdb=# select * from pg_stat_activity where pid = 5964;
-[ RECORD 1 ]----+------------------------------------------------
datid | 16384
datname | testdb
pid | 5964
usesysid | 10
usename | pg12
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2019-08-22 11:41:10.420664+08
xact_start | 2019-08-22 12:16:11.812598+08
query_start | 2019-08-22 12:16:18.718567+08
state_change | 2019-08-22 12:16:18.718572+08
wait_event_type | Lock
wait_event | transactionid
state | active
backend_xid |
backend_xmin | 716
query | select * from t_prewarm where id = 1 for share;
backend_type | client backend
Time: 4.655 ms
LWLock 类型
WALInsertLock: 保护 WAL buffers. 可以增加 WAL buffers 来改善争用. 设置 synchronous_commit=off 和 full_page_writes=off 可减少争用, 但不建议这样做.
WALWriteLock:WAL Record 刷盘或 WAL segment 切换时使用该锁保护.synchronous_commit=off 可清除刷盘等待.full_page_writes=off 可减少刷盘数据大小.
LockMgrLock: 在只读工作负载下会出现在等待事件中. 不论大小, 都会锁定 relations. 该 Lock 不是单个锁, 而是至少 16 个分区. 因此, 在基准测试时使用多个表显得很重要.
ProcArrayLock: 包含 ProcArray 结构体.
CLogControlLock: 包含 CLogControl 结构体, 如果在 pg_stat_activity 中频繁出现, 那应检查 $PGDATA/pg_clog(PG11+:pg_xact) 目录, 应位于已缓存的文件系统上.
SInvalidReadLock: 包含 sinval 结构体.Readers 使用共享锁, 而 SICleanupQueue 和其他数组范围内的更新则请求独占锁. 如果共享缓存存在较大的压力, 拿在系统视图上可看到该结构体的出现, 增大 shared_buffers 可减少争用.
BufMappingLocks: 包含 buffers 的区域.PG 设置了 128 个 buffer 区域用于管理整个缓存.
Spinlocks
最低级别的锁是自旋锁, 使用与 CPU 特定的机制实现.
到此,关于“怎么使用 PostgreSQL 中的 lightweight locks.”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!