性能测试实战 30 讲
高楼
前 HP 高级性能专家,7DGroup 创始人
45941 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 37 讲
性能测试实战 30 讲
15
15
1.0x
00:00/00:00
登录|注册

32丨当Postgres磁盘读引起I/O高的时候,应该怎么办?

TPS趋势预期内重要性
加大buffer减少磁盘I/O压力原因
参数配置重要性
PostgreSQL数据库分析点
加断言
TPS趋势判断逻辑
优化效果
降低读取,提高写入
优化参数调整
Walsender和Walreceiver
数据库资源查看
数据库性能问题
架构图
压力场景有效性
TPS图
SQL执行时间
调优阶段
整理阶段
错误压力场景
合理性
分析逻辑
解决目的
思考题
总结
问题解决
优化结果
分析过程
案例问题描述
项目阶段
压力场景
性能瓶颈
性能分析

该思维导图由 AI 生成,仅供参考

在性能分析的人眼里,性能瓶颈就是性能瓶颈。无论这个性能瓶颈出现在代码层、操作系统层、数据库层还是其他层,最终的目的只有一个结果:解决掉!
有人可能会觉得这种说法过于霸道。
事实上,我要强调的性能分析能力,是一套分析逻辑。在这一套分析逻辑中,不管是操作系统、代码还是数据库等,所涉及到的都只是基础知识。如果一个人都掌握这些内容,那确实不现实,但如果是对一个性能团队的要求,我觉得一点也不高。
在性能测试和性能分析的项目中,没有压力发起,就不会有性能瓶颈,也就谈不上性能分析了。所以每个问题的前提,都是要有压力。
但不是所有的压力场景都合理,再加上即使压力场景不合理,也能压出性能瓶颈,这就会产生一种错觉:似乎一个错误的压力场景也是有效的。
我是在介入一个项目时,首先会看场景是否有效。如果无效,我就不会下手去调了,因为即使优化好了,可能也给不出生产环境应该如何配置的结论,那工作就白做了。
所以要先调场景。
我经常会把一个性能测试项目里的工作分成两大阶段:

整理阶段

在这个阶段中,要把之前项目中做错的内容纠正过来。不止有技术里的纠正,还有从上到下沟通上的纠正。

调优阶段

这才真是干活的阶段。
在这个案例中,同样,我还是要表达一个分析的思路。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文从性能分析的角度出发,强调了解决性能瓶颈的重要性。作者通过一个案例问题描述和分析过程,详细阐述了如何应对Postgres数据库磁盘读引起的I/O高的情况。通过分析架构图、系统资源、I/O情况等,发现了Walsender Postgres进程读取过高的问题,并提出了降低读取、提高写入的优化方向。最终,通过调整关键参数和优化动作,有效降低了持续的读取,稳定了TPS,达到了优化的目标。文章深入浅出地介绍了Postgres磁盘读引起I/O高的问题及解决方法,对于需要解决类似性能问题的读者具有一定的参考价值。文章还提到了性能测试中的分析和优化的简单性,以及对PostgreSQL数据库重要分析点的建议,为读者提供了实用的思考题,引发读者对性能分析和优化的深入思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能测试实战 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-05
    3
    11
  • Geek_7cf52a
    bi 是指每秒读磁盘的块数。所以要先看一下,一块有多大。 [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-09
    3
  • jy
    bi 是指每秒读磁盘的块数。所以要先看一下,一块有多大。 [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-20
    5
    2
  • 月亮和六便士
    老师假如一条SQL语句执行100毫秒,我们一般觉得需要去优化SQL语句,但是也可能是等到磁盘读取消耗了大部分时间,我们如何区分这种情况?

    作者回复: 这肯定是在剖析中可以看到的。

    2020-04-25
    2
  • rainbowzhouj
    CPU的处理速度与磁盘的处理速度不同,Buffer能起到协调和缓冲的作用,增加Buffer增加了缓冲的空间,故磁盘I/O的压力就会减少。

    作者回复: 理解合理。

    2020-04-05
    2
  • Geek_6a9aeb
    原文:这个 bi 挺高,能达到 30 万以上。那这个值说明了什么呢?我们来算一算。 bi 是指每秒读磁盘的块数。 ------------------------------------------- 老师这里,30万是指有30万块数,还是30万kb的数据, 如果是kb那没有必要查一块是多大的呀?

    作者回复: 块数。

    2021-02-03
    1
  • 。。。
    继续打卡

    作者回复: 坚持学习是唯一进步的方式。

    2020-03-12
    1
  • 坚持半途而废
    一块是4096个字节,读每秒到了300000次 为啥是: (300000*1024)/1024/1024? 不应该是: (300000*4096)/1024?

    作者回复: 仔细看了一下,是算的不对。这里要修改一下。多谢。

    2021-11-05
  • 坚持半途而废
    确实没有看明白,怎么等于300M的

    作者回复: 已修改。

    2021-11-05
  • Geek_6a9aeb
    老师,看了一下午太困惑了,后面一下子就写到优化的动作,看 shared_buffers 最后一下子是20g, 没看到调优前这些值是多大的? 难道调优前是特别小吗?

    作者回复: 是的,之前太小。

    2021-02-03
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部