共計 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 小編會繼續努力為大家帶來更多實用的文章!