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

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

你好,我是倪朋飞。
上一节,我们研究了一个狂打日志引发 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(35)

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

    作者回复: 👍

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

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

    72
  • 郭江伟
    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}'

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

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

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

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

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

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

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

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

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

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

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

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

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

    3
  • 远方
    使用strace时,没有加-f选项查看线程

    作者回复: 👍

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