32丨当Postgres磁盘读引起I/O高的时候,应该怎么办?
高楼
该思维导图由 AI 生成,仅供参考
在性能分析的人眼里,性能瓶颈就是性能瓶颈。无论这个性能瓶颈出现在代码层、操作系统层、数据库层还是其他层,最终的目的只有一个结果:解决掉!
有人可能会觉得这种说法过于霸道。
事实上,我要强调的性能分析能力,是一套分析逻辑。在这一套分析逻辑中,不管是操作系统、代码还是数据库等,所涉及到的都只是基础知识。如果一个人都掌握这些内容,那确实不现实,但如果是对一个性能团队的要求,我觉得一点也不高。
在性能测试和性能分析的项目中,没有压力发起,就不会有性能瓶颈,也就谈不上性能分析了。所以每个问题的前提,都是要有压力。
但不是所有的压力场景都合理,再加上即使压力场景不合理,也能压出性能瓶颈,这就会产生一种错觉:似乎一个错误的压力场景也是有效的。
我是在介入一个项目时,首先会看场景是否有效。如果无效,我就不会下手去调了,因为即使优化好了,可能也给不出生产环境应该如何配置的结论,那工作就白做了。
所以要先调场景。
我经常会把一个性能测试项目里的工作分成两大阶段:
整理阶段
在这个阶段中,要把之前项目中做错的内容纠正过来。不止有技术里的纠正,还有从上到下沟通上的纠正。
调优阶段
这才真是干活的阶段。
在这个案例中,同样,我还是要表达一个分析的思路。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文从性能分析的角度出发,强调了解决性能瓶颈的重要性。作者通过一个案例问题描述和分析过程,详细阐述了如何应对Postgres数据库磁盘读引起的I/O高的情况。通过分析架构图、系统资源、I/O情况等,发现了Walsender Postgres进程读取过高的问题,并提出了降低读取、提高写入的优化方向。最终,通过调整关键参数和优化动作,有效降低了持续的读取,稳定了TPS,达到了优化的目标。文章深入浅出地介绍了Postgres磁盘读引起I/O高的问题及解决方法,对于需要解决类似性能问题的读者具有一定的参考价值。文章还提到了性能测试中的分析和优化的简单性,以及对PostgreSQL数据库重要分析点的建议,为读者提供了实用的思考题,引发读者对性能分析和优化的深入思考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能测试实战 30 讲》,新⼈⾸单¥59
《性能测试实战 30 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(18)
- 最新
- 精选
- 罗辑思维分享下自己学习体会: 为什么缓存可以加速I/O的访问速度? 老师说的缓存应该有两个:操作系统的缓存和PostgreSQL的缓存。它俩作用都是为了把经常访问的数据(也就是热点数据),提前读入到内存中。这样,下次访问时就可以直接从内存读取数据,而不需要经过硬盘,从而加速I/O 的访问速度。 因为没接触过PostgreSQL,在做思考题时找了些资料,下面是延伸的学习。 PostgreSQL缓存跟操作系统的缓存有啥联系? 1.在访问数据时,数据会先加载到操作系统缓存,然后再加载到shared_buffers,这个加载过程可能是一些查询,也可以使用pg_prewarm预热缓存。 2.当然也可能同时存在操作系统和shared_buffers两份一样的缓存(双缓存)。 3.查找到的时候会先在shared_buffers查找是否有缓存,如果没有再到操作系统缓存查找,最后再从磁盘获取。 4.操作系统缓存使用简单的LRU(移除最近最久未使用的缓存),而PostgreSQL采用的优化的时钟扫描,即缓存使用频率高的会被保存,低的被移除。 PostgreSQL缓存读顺序share_buffers -> 操作系统缓存 -> 硬盘。那么也可能是操作系统缓存不足,而不定是share_buffers。通过文章中vmstat命令看到cache有260G,free值也很稳定,所以应该检查PostgreSQL的缓存。(老师执行vmstat是不是埋了个伏笔)。 参考资料 https://www.cnblogs.com/zhangfx01/p/postgresql_shared_buffer.html https://blog.csdn.net/kwame211/article/details/78665999
作者回复: 认真的同学,必须赞!
2020-03-05311 - Geek_7cf52abi 是指每秒读磁盘的块数。所以要先看一下,一块有多大。 [root@7dgroup1 ~]# tune2fs -l /dev/vda1 | grep "Block size" Block size: 4096 [root@7dgroup1 ~]# (300000∗1024)/1024/1024≈293M ===================================================== ===================================================== 上面为原文 这里指的是块。但是老师这样算也错了吧,一块是4096byte,那300000块的大小应该是300000*4096/1024/1024=1172M
作者回复: 这里并没有算错。因为这个300000对应的单位是kB/s。
2020-07-093 - jybi 是指每秒读磁盘的块数。所以要先看一下,一块有多大。 [root@7dgroup1 ~]# tune2fs -l /dev/vda1 | grep "Block size" Block size: 4096 [root@7dgroup1 ~]# (300000∗1024)/1024/1024≈293M ===================================================== ===================================================== 上面为原文 问题一: 老师,这里是不是有问题? bi表示从块设备读入数据的总量(即读磁盘)(kb/s),而不是每秒读磁盘的块数 其实,这样算就可以了:300000/1024≈293M 问题二:查询Block size的目的是?我看这个4096和iostat图中r/s列的值差不多, 而r/s表示每秒完成读IO设备的次数
作者回复: 问题1, 你可以看一下vmstat的帮助手册,里面有这么一句。 bi: Blocks received from a block device (blocks/s). 所以这个是块,而不是kb。 问题2,查block size就是为了看查询了多少次,每次查询了多少块,以判断随机读写多还是顺序读写多。
2020-05-2052 - 月亮和六便士老师假如一条SQL语句执行100毫秒,我们一般觉得需要去优化SQL语句,但是也可能是等到磁盘读取消耗了大部分时间,我们如何区分这种情况?
作者回复: 这肯定是在剖析中可以看到的。
2020-04-252 - rainbowzhoujCPU的处理速度与磁盘的处理速度不同,Buffer能起到协调和缓冲的作用,增加Buffer增加了缓冲的空间,故磁盘I/O的压力就会减少。
作者回复: 理解合理。
2020-04-052 - Geek_6a9aeb原文:这个 bi 挺高,能达到 30 万以上。那这个值说明了什么呢?我们来算一算。 bi 是指每秒读磁盘的块数。 ------------------------------------------- 老师这里,30万是指有30万块数,还是30万kb的数据, 如果是kb那没有必要查一块是多大的呀?
作者回复: 块数。
2021-02-031 - 。。。继续打卡
作者回复: 坚持学习是唯一进步的方式。
2020-03-121 - 坚持半途而废一块是4096个字节,读每秒到了300000次 为啥是: (300000*1024)/1024/1024? 不应该是: (300000*4096)/1024?
作者回复: 仔细看了一下,是算的不对。这里要修改一下。多谢。
2021-11-05 - 坚持半途而废确实没有看明白,怎么等于300M的
作者回复: 已修改。
2021-11-05 - Geek_6a9aeb老师,看了一下午太困惑了,后面一下子就写到优化的动作,看 shared_buffers 最后一下子是20g, 没看到调优前这些值是多大的? 难道调优前是特别小吗?
作者回复: 是的,之前太小。
2021-02-03
收起评论