前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL lightweight lock 轻量级锁是什么 ?

POSTGRESQL lightweight lock 轻量级锁是什么 ?

作者头像
AustinDatabases
发布2022-12-12 18:44:21
5340
发布2022-12-12 18:44:21
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

轻量级锁这个名词经常听到,但如果问我什么是轻量级锁,这个我真的不能说不清楚,只能说根本就不知道。所以不知道的事情多了就会变得无知,今天就来了解一下什么是轻量级锁,POSTGRESQL 的轻量级锁是什么,起到什么作用。

基于当前数据库系统中的数据处理,依赖内存而非磁盘系统的特点,同时OLTP系统本身会应对大量的事务吞吐等等这些特点,导致产生一个问题,对于锁的应用是数据库产生性能瓶颈的根本点。这里就倒逼数据库系统需要在内存中使用更轻量级的锁简称 VLL 来处理在主存中的并发控制的问题。

通过使用VLL 轻量级锁,来提供更高效的资源锁定的方式,提供更高的性能,这是ligthweight lock 在数据库中需要解决的问题。

这样的定义在POSTGRESQL 中也不是例外,postgresql lightweight lock 简称 LWLocks 主要的作用也是控制内存中的数据访问。Postgresql 用于多进程的架构,采用了共享内存的方式的数据处理结构在PG中 LW锁有两类锁,shared 和 exclusive (共享和排他)锁。这与我们熟知的数据库系统的重量级锁(8种)是不同的。同时与传统的锁不同 LW 锁本身是没有死锁检测的机制,同时这类锁本身就是要保护共享内存中的数据结构。

lightweight 锁主要应用与POSTGRESQL 以下的部分

1 事务提交状态缓存部分

2 数据页缓存部分

3 子事务缓存部分

在设计和使用这些LW LOCK 的时候会根据PG 内部的模块来划分lwlock,每个模块有自己独有的LW LOCK ,通过细分 LW LOCK 满足每个模块有自己的锁,这样的设计模式便于开发和观察模块中特有的锁的使用,并持续优化加锁严重的模块的逻辑,提高性能。

通过下面的语句可以在wait_event 中找到如 wait_lwlock_named 和 wait_lwlock_tranche 类型的等待事件这就是 LW 加锁等待。

SELECT pid, wait_event_type, wait_event FROM pg_stat_activity;

我们可以从源代码中找到 lwlock 主要加锁的涉及的子模块有哪些。

在Lightweight 的锁使用中,同样也分为三个部分,加锁,释放和等待三个动作,在加锁中,通过LWLockAcquire(LWLockMode*lock, LWLockMode mode) 来获取锁,其中LWLockMode 为申请的锁的类型,包含LW_SHARED, LW_EXECLUSIVE 两种锁,在加锁是,需要把加入锁放入到等待的队列,,然后通过LWLock中的state来判断锁加入的成功与否,然后将锁从等待队列中移除,避免其他的进程获取锁的时候,还能获取到锁。如果获取锁失败,则不会等待,会直接返回无法获取锁,因为LW锁是不会判断死锁的,所以需要自旋锁的帮助,不断的重试。

举例在POSTGRESQL 的数据库结构中,在客户的进程和postmaster建立了关系后,就直接操控后端的一些操作,如wal flush,此时就需要操作wal flush 的进程就需要过去 lw 锁,进行相关的工作,其他的backend process 就需要等待lw 锁。

释放锁是通过LWLockRelease(LWLOCK * lock)来释放锁,从当前的工作的process中获取LWLockRelease 释放已经使用完的锁,并放回到锁的排队序列中,供其他的进程先进先出的进行锁的获取。

下面通过一些与POSTGRESQL 实际工作中有关的实例来说明 LW锁工作的中的一些问题和禁忌

1 WalInsertLock: 这个锁是保护 wal buffers,你能通过加大wal buffers的缓冲来提高LW这类锁工作的性能,同时如果你将 synchronous_commit 设定成OFF 的同时,虽然在事务提交的性能有较大的提升,但是会提高walinsertlock锁的压力。(这很容易理解,因为所有的日志写入原有的限制被取消,所以压力到了下一级 walinsertLock 中),同时full_page_writes= off 会降低walinsertlock的压力。

2 WalwriteLock: 这个锁是在POSTGRESQL 进程wal 数据被刷新到磁盘时候的锁,这里如果将 synchronous_commit = off 和 full_page_wirtes= off 将这两个参数设置为off后会降低这个锁的压力。(主要从两点1 写入数据延迟了,同时写入时间降低了(数据量降低了)

3 SinvalidReadLock: 这个锁主要的功能是包含sinval 的队列,shared buffer中需要对共享的读锁,以及SICleanupQueue 等进行控制,此时需要一个排它锁,通过使用LW锁来对以上的需求进行满足,当shared buffer 不足的情况下,通过pg_stat_activity 有可能会看到这个锁,说明你的shared buffer 有可能需要添加。

LW 锁本身是spin-lock的结构,同时在使用上进行了延伸,对系统内部的与内存有关的部分需要锁定的位置进行支持。同时通过发现一些系统中运行时显示的 LW 锁,对于系统运行的状态或一些压力会有所感知。

参考部分文字:

https://www.percona.com/blog/2018/10/30/postgresql-locking-part-3-lightweight-locks/

https://postgrespro.com/blog/pgsql/5968022

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档