聊聊PG double buffering的优化

本文详细阐述了如何优化PostgreSQL的DoubleBuffering问题,包括增大内存、关闭NUMA、使用大页、调整OSVM参数、优化DBCACHE脏块写入、合理设置sharedbuffers和WAL/CHECKPOINT,以及调整IO评估参数,以实现高性能和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谈了PG的Double Buffering,这一点是很多诟病PG的人经常提到的问题。不过昨天老白也说了,Double Buffering其实也不是什么太大的问题,对于绝大多数PG数据库系统来说,这个问题的负面影响绝对没有网上的那些文章​说的那么玄乎,甚至对于绝大多数数据库来说,这个问题我们可以​忽略。不过对于一些超大型的PG数据库,比如从Oracle迁移到PG的大型或者超大型数据库来说,​我们还是需要做一定的优化工作的。虽然采用buffered io的数据库在DB CACHE的优化上比绕过缓冲区直接读写文件要复杂一些,但是这个问题并不是不可解决的。通过对操作系统与数据库参数的一系列优化,我们也可以让PG数据库充分享受BUFFERED IO的好处,规避Double Buffering的缺点。

第一点是确保有足够的内存,对于采用Buffered IO的数据库系统来说,越大的内存拥有越大的FILE CACHE和DB CACHE,肯定对数据库的性能有所帮助。在X86时代,内存已经不少昂贵的硬件了,因此在配置PG服务器的时候,不要为了省几个内存的钱而让自己今后的运维陷入左右为难的境地是比较明智的选择。除了配置较大内存的数据库服务器硬件之外,关闭NUMA是我们要做的第一件事情。关闭NUMA,不用管远程内存本地内存的成本开销问题,因为远程内存再慢也比硬盘快得多。在服务器与操作系统层面均关闭NUMA,可以让物理内存被均匀的使用,不会因为一个NODE上分配内存过大而导致在物理内存尚有很多空闲的时候,出现不必要的换页。对于这个问题,以前老白发过的一篇文章《Postgresql和NUMA》可以参考。

第二是大页的设置,一定要让shared buffers使用大页,对于大型PG数据库来说,这一点十分关键,如果不使用大页,

SDL(Simple DirectMedia Layer),是一个跨平台的多媒体库,主要用于游戏和图形应用的开发。设置双缓冲(Double Buffering)是为了减少屏幕刷新导致的闪烁现象,通过先将图像绘制到第二个缓冲区,再切换至主显示区完成渲染。 以下是使用SDL进行双缓冲的基本步骤: 1. **初始化SDL**: 首先,你需要初始化SDL并创建窗口,这是所有操作的基础。 ```c++ if (SDL_Init(SDL_INIT_VIDEO) < 0) { // 初始化失败处理 } ``` 2. **创建渲染表面**: 创建两个SDL_Surface,一个是主表面(backbuffer),另一个是临时表面(frontbuffer)。通常,主表面用于实际的游戏画面绘制,而临时表面用来存储正在绘制的内容。 ```c++ SDL_Surface* backBuffer = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_Surface* frontBuffer = NULL; ``` 3. **双缓冲循环**: 在每一帧的渲染过程中,首先将前一帧的内容从主表面复制到临时表面,然后清除主表面以便绘制新内容。最后,将临时表面的内容复制回主表面,并更新显示。 ```c++ while (running) { // 渲染到临时表面 SDL_BlitSurface(backBuffer, NULL, frontBuffer, NULL); // 清空主表面 SDL_FillRect(backBuffer, NULL, 0); // 绘制新内容... // 将前表面换到屏幕上 SDL_BlitSurface(frontBuffer, NULL, backBuffer, NULL); SDL_UpdateWindowSurface(window); // 等待事件... } ``` 4. **清理资源**: 当程序结束时,记得释放这两个表面以及其他的SDL资源。 ```c++ SDL_FreeSurface(frontBuffer); SDL_FreeSurface(backBuffer); SDL_Quit(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值