Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

27 | 案例篇:为什么我的磁盘I/O延迟很高?

优化算法解决I/O性能问题
使用filetop和opensnoop跟踪文件读写情况
使用strace和lsof定位文件写入问题
使用pidstat观察进程的I/O情况
使用iostat观察磁盘I/O情况
观察CPU和内存使用情况
使用Docker镜像启动应用
安装docker和sysstat工具
机器配置
分析
环境准备
动态调整日志级别或修改应用配置解决问题
使用iostat、strace和lsof定位问题
调试日志未关闭导致I/O问题
Python解释型语言和Docker对性能分析的影响
性能工具输出无法解释的原因
Python Flask应用响应速度不满意
日志级别导致I/O性能问题
思考
性能问题案例
为什么我的磁盘I/O延迟很高?

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

你好,我是倪朋飞。
上一节,我们研究了一个狂打日志引发 I/O 性能问题的案例,先来简单回顾一下。
日志,是了解应用程序内部运行情况,最常用也是最有效的工具。日志一般会分为调试、信息、警告、错误等多个不同级别。
通常,生产环境只用开启警告级别的日志,这一般不会导致 I/O 问题。但在偶尔排查问题时,可能需要我们开启调试日志。调试结束后,很可能忘了把日志级别调回去。这时,大量的调试日志就可能会引发 I/O 性能问题。
你可以用 iostat ,确认是否有 I/O 性能瓶颈。再用 strace 和 lsof ,来定位应用程序以及它正在写入的日志文件路径。最后通过应用程序的接口调整日志级别,完美解决 I/O 问题。
不过,如果应用程序没有动态调整日志级别的功能,你还需要修改应用配置并重启应用,以便让配置生效。
今天,我们再来看一个新的案例。这次案例是一个基于 Python Flask 框架的 Web 应用,它提供了一个查询单词热度的 API,但是 API 的响应速度并不让人满意。
非常感谢携程系统研发部资深后端工程师董国星,帮助提供了今天的案例。

案例准备

本次案例还是基于 Ubuntu 18.04,同样适用于其他的 Linux 系统。我使用的案例环境如下所示:
机器配置:2 CPU,8GB 内存
预先安装 docker、sysstat 等工具,如 apt install docker.io sysstat
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

作者倪朋飞分享了解决磁盘I/O延迟高问题的实际案例和技术指导。文章首先回顾了一个由于开启调试日志导致的I/O性能问题,并介绍了通过iostat、strace和lsof等工具来定位和解决这类问题的方法。接着,作者提出了一个新的案例,讲述了一个基于Python Flask框架的Web应用响应速度不佳的情况。作者提供了案例准备的详细步骤,包括机器配置和预先安装的工具,并分享了使用Docker镜像来运行案例的方法。最后,作者强调了在操作过程中避免提前查看源码,而是将应用视为一个黑盒来分析,以更好地从系统资源使用问题出发,找出应用中的瓶颈所在。整篇文章以实际案例为基础,通过详细的操作步骤和技术指导,帮助读者了解如何定位和解决磁盘I/O延迟高的问题,展现了作者的技术专长和解决问题的方法论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 划时代
    赞同在strace -p PID后加上-f,多进程和多线程都可以跟踪。

    作者回复: 👍

    2019-01-21
    3
    129
  • jeff
    写文件是由子线程执行的,所以直接strace跟踪进程没有看到write系统调用,可以通过pstree查看进程的线程信息,再用strace跟踪。或者,通过strace -fp pid 跟踪所有线程。

    作者回复: 👍 默认选项是不开启线程的

    2019-01-21
    76
  • 郭江伟
    strace -p -f可以查看进程的所有线程信息,本例中python进程下可能同时存在两个线程,一个线程是socket相关,一个是跟文件读写相关,与文件读写相关的会频繁变化,只需跟踪进程树的最后一个线程就可以。 可以用pstree -p 查看Python的进程树,然后strace -p 线程号,不过本例中线程消失非常快,需要写个脚本才行 比如:Python进程号是13205 strace -p `pstree -p 13205 | tail -n 1 | awk -F '(' '{print $NF}' | awk -F ')' '{print $1}'

    作者回复: 赞,很好的思路

    2019-01-23
    3
    31
  • 萧易客
    perf record -e 'fs:*' -ag perf report 使用perf命令可以从kernel层级记录文件系统的内核事件,相对strace我觉得perf还有一个优势就是对系统的消耗更低,更利于在生产环境使用。 http://www.brendangregg.com/perf.html

    作者回复: 嗯嗯,谢谢分享新的思路。 不过perf report 更多的是统计上的分析,而 strace 则是可以看到每一个调用的细节。

    2019-01-23
    15
  • 不用那么麻烦吧,一般看用户进程cpu高的,iowait显著的话,直接lsof -p就能找到了什么文件了

    作者回复: 简单场景一条 lsof 就解决了,但复杂的场景则还需要更多的步骤

    2019-01-22
    2
    9
  • 仲鬼
    老师好,案例里pidstat的iodelay为0,kB_wr/s也有300MB,是否说明应用程序写文件的性能没有收到影响,造成进程响应慢的可能是其他问题(如系统调用、打开文件等)?

    作者回复: 应该反过来,进程大量的 I/O 时,自己可能问题不大,但却导致了其他进程出现问题

    2019-01-22
    2
    7
  • Geek_00d753
    老师,请教个问题。在cpu密集型任务中一个进程的cpu利用率是各cpu的us%+sy%之和。但当iow%高的时候,这个进程的cpu利用率是怎么算的呢?就像第一个例子中,进程cpu利用率14%,比两个cpu的us%+sy%大很多。我之前理解的iow状态,进程在等io资源,这个时候应该是off-cpu的,是不是我理解错了。难道iow%有一部分也算是cpu占用的吗?那又是怎么计算的呢?谢谢

    作者回复: 很好的问题。多个工具对比计算的时候一定要使用相同的时间间隔,间隔不同时,很可能就会碰到这个问题

    2019-03-21
    2
    6
  • ninuxer
    打卡day28 我一般用strace -cp 来看系统调用的统计信息,然后用-e 查看对应调用的详情

    作者回复: 嗯,不过注意strace默认不跟踪子线程的系统调用

    2019-01-21
    2
    5
  • 仲鬼
    老师,线上环境kernal版本4.1以上的很少,能不能同时讲一些2.6、3.1等版本的替代工具?提一下名字也好,不然学半天原理,还是不能“实战”啊!

    作者回复: 别急,工具是有的,但旧版本的工具难用的多,所以从简单易用的开始讲起

    2019-01-21
    4
  • 我来也
    [D27打卡] Ubuntu 18.04在安装bcc时出错,然后参考[https://www.codetd.com/article/3092913]可以成功安装. 因为ppa:hzwhuang/ss-qt5 并没有18.04版本的源,因此会出现 E: 仓库 “http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu bionic Release” 没有 Release 文件 的错误。 这时,只要编辑/etc/apt/sources.list.d/hzwhuang-ubuntu-ss-qt5-bionic.list 文件,将bionic (18.04版本代号)改成xenial(16.04版本代号) 然后再执行第二三步骤即可。

    作者回复: 谢谢分享

    2019-01-22
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部