Article Focus

内容阅读与观点延展

以清晰阅读路径承载正文、上下篇与推荐内容,让深度文章浏览更加专注自然。

十个客户端把轮询换成一条阻塞调用,备库CPU从57%降到38%内容展示

当前位置为资讯正文页面,可继续阅读上下篇或进入推荐阅读区域。

十个客户端把轮询换成一条阻塞调用,备库CPU从57%降到38%

十个客户端,同一个查询,反复问备库同一句话:我上次写的东西到了吗?两轮跑下来,备库CPU均值 57% 。把循环换成一条阻塞调用,还是十个客户端、同样的负载,CPU掉到 38% ,吞吐反而涨了。 这条阻塞调用叫 WAIT FOR LSN ,是 PostgreSQL 19 的新东西,该版本于 2026 年 9 月 24 日发布第四个 beta。它让应用可以直接问数据库:把这个连接挂住,直到某个特定的预写日志位置在这台服务器上到达指定状态,再返回。对着异步副本做读己之写一致性,以前一直能手工实现——写入后记下 WAL 位置,再去副本上轮询它。WAIT FOR 把这件事变成了一条语句。 搭建环境 用 postgres:19beta4 搭了一主一从的流复制环境。两个 Docker 容器,同一镜像,同一网络: docker network create pgwaitnetdocker run -d --name pg-primary --network pgwaitnet -p 15432:5432 \-e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust \postgres:19beta4 \postgres -c wal_level=replica -c max_wal_senders=10 -c hot_standby=on 在主库上创建复制角色和槽,为来自容器网络的复制连接和普通连接打开 pg_hba.conf,然后用 pg_basebackup -R 直接把基础备份做到备库的数据目录里,它会替我写好 standby.signal 和 primary_conninfo: docker exec pg-primary psql -U postgres -c \"CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replpass';"docker exec pg-primary psql -U postgres -c \"SELECT pg_create_physical_replication_slot('standby_slot');"docker exec -u postgres pg-standby bash -c \"PGPASSWORD=replpass pg_basebackup -h pg-primary -U replicator \-D /var/lib/postgresql/19/docker -Fp -Xs -P -R -S standby_slot" 主库上的 pg_stat_replication 显示备库在几秒内就开始流复制,在这台机器上重放延迟大约 0.1ms。下面所有测试都跑在这对主从之上,从宿主机通过 TCP 连接,而不是走 docker exec。 那个头条数字,以及我为什么不完全信它 每个试验里,先在主库插一行、拿到对应的 LSN,再计时备库满足这个 LSN 需要多久,三种方式对比:带 1 毫秒睡眠的轮询、完全不休眠的忙轮询、以及一次 WAIT FOR LSN ... WITH (MODE 'standby_replay') 调用。每个方式跑 20 次试验,带睡眠的轮询重复三轮,另外两种重复两轮,取范围。 对着带睡眠的轮询,WAIT FOR 看起来是干净的 3 到 5 倍 胜出。但对着忙轮询,差距几乎消失——WAIT FOR 每一轮都还是略微领先,但领先的是零点几毫秒,不是倍数。一个从不睡眠的忙循环,在单连接、空闲备库上,发现 LSN 被重放的速度,和一个专门造出来的等待原语差不多。那个 3 到 5 倍,量的是那个随手定的 1 毫秒睡眠,不是这个特性。 十个客户端连续跑,才是它真正赢的地方 十个工作线程,每个循环做「主库插入、备库等待」,连续跑五秒,期间用 docker stats 采样备库 CPU。两轮平均下来:完成的工作更多,平均 CPU 大约是原来的三分之二。 这才是值得拿来规划的数字。忙轮询对一个客户端查一次写入来说没问题,但它不会闲着——每一个等待中的连接都是一个后端在紧循环里空转查询,十个这样的连接,会在那台承担副本读的机器上叠加起来。WAIT FOR 是把后端挂起,而不是让它空转。 需要说明的是,每轮五秒只采到两三个 CPU 样本,因为启动 docker stats --no-stream 本身有开销,所以 CPU 数字当作方向性参考,别抠到百分点;每秒完成数那个数字是直接计数而非采样得来的,更可信。 喂错输入,它全拒了 把能想到的错误输入都试了一遍: 垃圾 LSN:报错 invalid input syntax for type pg_lsn:

about image
觉得有用?分享给朋友

让更多人看到这篇内容

推荐阅读

Search
热点新闻
曼城夏窗5.26亿,英超19家血压拉满:这不是引援,是挑衅!
曼城夏窗5.26亿,英超19家血压拉满:这不是引援,是挑衅!

英超联盟谋划针对曼城长达七年,目前总数115项的指控当中,有114项最终被裁定成立。但罚分降级恐怕还只是开胃菜,逼迫曼城易主很可能才是英超联盟的最终目的。 裁决结果公开的当晚,曼城主席穆巴拉克就发布了公开信,他明确表示俱乐部能够自证清白,相关后续流程还会持续很长时间。 但裁决细节已经披露,违规行为涉及2009年至2018年间的财务操作,包括虚增关联企业赞助收入、通过账外支付方式规避财务监管等核心指

樊振东独砍两分!杜塞3:1取胜,对手赛后评价:和他不在一个层级
樊振东独砍两分!杜塞3:1取胜,对手赛后评价:和他不在一个层级

9月27日,德国杜塞尔多夫俱乐部将原定于常规场馆举行的德甲乒乓球联赛,临时移师至一座可容纳4000人的现代化室内体育馆。当天现场涌入近3000名球迷,座无虚席。 对德国乒乓球甲级联赛而言,如此规模的观赛盛况极为罕见,其背后动因清晰而有力:世界顶尖选手樊振东正式披上杜塞尔多夫战袍,迎来首秀。 三千人专程为一场普通联赛奔赴现场,这一现象本身已是最具说服力的答案 最终,主队以3比1力克劲敌多特蒙德,豪取

英国的二手市场,让很多刚去的人彻底改变了消费观
英国的二手市场,让很多刚去的人彻底改变了消费观

◎ 没人觉得用旧东西丢人。 来英国之前,我以为二手店是穷人无奈的选择。在国内的逻辑里,买二手意味着预算不够,意味着将就,意味着在生活里退了一步。我甚至觉得慈善商店就是英国的“废品回收站”,里面堆着发黄的毛衣和缺了角的盘子。但住进布里斯托的第三周,我的房东苏珊——一个六十多岁、围裙口袋里永远揣着狗零食的老太太——带我去了一趟街角的慈善商店。那天下午我花了4英镑,买了一只1960年代的陶瓷杯、一本企鹅

湖人签下前冈萨加大学锋线球星,上赛季他在发展联盟表现中规中矩
湖人签下前冈萨加大学锋线球星,上赛季他在发展联盟表现中规中矩

根据The Athletic记者Dan Woike的推特消息,洛杉矶湖人已经与此前处于自由球员状态的锋线球员安东-沃特森(Anton Watson)签下了一份包含了Exhibit 10条款的训练营合同。 沃特森出生于2000年10月,现年25岁,是去年NBA选秀大会中凯尔特人在次轮第54顺位选中的锋线新星。根据去年NBA选秀大会前G联赛精英训练营的体测数据,沃特森的裸足身高为201.9cm,臂展为

4场4球1助攻,热刺盯上23岁德甲前锋
4场4球1助攻,热刺盯上23岁德甲前锋

热刺正在密切关注一名23岁的德甲前锋。据TEAMTalk报道,托特纳姆热刺是关注尤内斯·埃布努塔利布(Younes Ebnoutalib)发展的俱乐部之一,布莱顿和埃弗顿同样在观望。 这名法兰克福前锋本赛季开局的表现,让他的名字迅速进入了英超的讨论范围。报道称,热刺是这名前锋的"忠实欣赏者",并且一直在"关注他的进步"。 从埃尔弗斯贝格到法兰克福 埃布努塔利布今年1月才从埃尔弗斯贝格加盟法兰克福,