SQL慢可能是触发了ring buffer
简介
最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但是其同样入参在不同时间执行时间却相差甚远。进行 SQL 优化并不能对其根除,查看了一下 shared_buffers 才 12GB。SQL 查询得表 size 就有 16GB 且没有所有和分区剪裁,也没有索引。这里就涉及得内存得环形缓冲机制了
一、什么是环形缓冲区?
环形缓冲区(ring buffer 又称循环缓冲区,Circular Buffer)是一种逻辑上首尾相接的固定大小数组结构,主要用于数据的连续读写操作。它具备高效、无碎片、空间可复用等特点
在结构上,它依赖两个核心指针:
写指针(write pointer):指向即将写入数据的位置。
读指针(read pointer):指向即将读取数据的位置。
由于缓冲区是固定大小的,写入末尾之后指针会回绕至起点,形成 “环形”行为。
二、运行机制
环形缓冲区采用一段固定长度的数组作为底层结构。其核心思想在于逻辑上将数组首尾相连,实现空间的循环复用。
例如,一个长度为 8 的缓冲区:
物理空间: [0] [1] [2] [3] [4] [5] [6] [7]
逻辑行为: ↑ ↑read_ptr w