在上一篇文章中,我们已经讲了监控系统层面的分析思路以及 CPU 分析,今天我们分析一下操作系统中其他的层面。
首先是 I/O。
I/O
I/O 其实是挺复杂的一个逻辑,但我们今天只说在做性能分析的时候,应该如何定位问题。
对性能优化比较有经验的人(或者说见过世面比较多的人)都会知道,当一个系统调到非常精致的程度时,基本上会卡在两个环节上,对计算密集型的应用来说,会卡在 CPU 上;对 I/O 密集型的应用来说,瓶颈会卡在 I/O 上。
我们对 I/O 的判断逻辑关系是什么呢?
我们先画一个 I/O 基本的逻辑过程。我们很多人嘴上说 I/O,其实脑子里想的都是 Disk I/O,但实际上一个数据要想写到磁盘当中,没那么容易,步骤并不简单。
这个简化的图是思虑再三的结果。
I/O 有很多原理细节,那我们如何能快速地做出相应的判断呢?首先要祭出的一个工具就是iostat。
在这张图中,我们取出一条数据来做详细看下:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz
vda 0.00 0.67 18.33 114.33 540.00 54073.33 823.32
avgqu-sz await r_await w_await svctm %util
127.01 776.75 1.76 901.01 7.54 100.00
我解释一下其中几个关键计数器的含义。
svctm代表 I/O 平均响应时间。请注意,这个计数器,有很多人还把它当个宝一样,实际上在 man 手册中已经明确说了:“Warning! Do not trust this field any more. This field will be removed in a future sysstat version.” 也就是说,这个数据你爱看就爱,不一定准。