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 内存
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》,新⼈⾸单¥68
《Linux 性能优化实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(35)
- 最新
- 精选
- 划时代赞同在strace -p PID后加上-f,多进程和多线程都可以跟踪。
作者回复: 👍
3125 - 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}'
作者回复: 赞,很好的思路
331 - 萧易客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默认不跟踪子线程的系统调用
25 - 仲鬼老师,线上环境kernal版本4.1以上的很少,能不能同时讲一些2.6、3.1等版本的替代工具?提一下名字也好,不然学半天原理,还是不能“实战”啊!
作者回复: 别急,工具是有的,但旧版本的工具难用的多,所以从简单易用的开始讲起
3 - 远方使用strace时,没有加-f选项查看线程
作者回复: 👍
3
收起评论