linux 磁盘 I/O 性能诊断
<p><strong>常用 I/O 性能分析命令和性能诊断方法</strong></p>
<h2>I/O 性能分析命令</h2>
<ul>
<li>
<h4>iostat</h4>
<p>iostat 是 Linux 最常见的磁盘 I/O 监控工具
基本用法: <code>iostat -d -x -k 1 10</code></p>
<pre><code>d表示:显示设备(磁盘)使用状态。
k表示:某些使用 block 为单位的列强制使用 Kilobytes 为单位。
1 10 表示:数据显示每隔 1 秒刷新一次,共显示 10 次。
x 参数:我们可以获得更多统计信息</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/1ac10de710df248f383442546d11c621" alt="" />
参数含义</p>
<pre><code>rrqm/s:每秒进行 merge(多个 IO 的合并)读操作的数量。
wrqm/s:每秒进行 merge(多个 IO 的合并)写操作的数量。
rsec/s:每秒读取的扇区数。
wsec/s:每秒写入的扇区数。
rKB/s:每秒读多少k字节,在 kernel 2.4 以上,rkB/s=2×rsec/s,因为一个扇区为 512 bytes。
wKB/s:每秒写多少k字节,在 kernel 2.4 以上,wkB/s=2×wsec/s,因为一个扇区为 512 bytes。
avgrq-sz:平均请求扇区的大小。
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好。
await:每一个 IO 请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为 IO 的响应时间,一般地系统 IO 响应时间应该低于 5 ms,如果大于 10 ms 就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:表示平均每次设备 I/O 操作的服务时间(以毫秒为单位)。如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢。
%util:在统计时间内所有处理 IO 时间,除以总共统计时间,该参数暗示了设备的繁忙程度,如果该参数是 100% 表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。</code></pre>
<p>系统性能评估标准:</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>影响性能因素</th>
<th>好</th>
<th>坏</th>
<th>糟糕</th>
</tr>
</thead>
<tbody>
<tr>
<td>磁盘</td>
<td>iowait % < 20%</td>
<td>iowait % =35%</td>
<td>iowait % >= 50%</td>
</tr>
</tbody>
</table>
<h2>I/O 性能诊断</h2>
<ul>
<li>
<h4>用 vmstat 命令了解系统状况</h4>
<p><code>vmstat 1 10</code>
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/b961d0a3a9de79259ae27bb3498f95d1" alt="" />
如果 b 的值为 2~3 倍 CPU 数量,bi 和 bo 的值很大(有时 bi 和 bo 值很小,但 in 和 cs 很大,也会引起磁盘 IO 负载重),wa 的值持续很高,如高于 40,id 也持续高于 70,这些现象都表明系统的 IO 可能出现性能问题。</p>
</li>
<li>
<h4>可以进一步通过 iostat 命令分析,如下所示:</h4>
<p><code>iostat -x 1 5</code>
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/4eca081ade110dc1432ece2da81ba830" alt="" />
查看 iostat 的结果时注意事项如下:</p>
<pre><code>首先看 %util(服务 IO 的时间占总时间的百分比),如果这个值接近 100%,表示 IO 的请求很多(表示任务服务的所有时间几乎都用在 IO 上),这种现象表明磁盘 IO 性能出现瓶颈。
再看 await(表示每次io设备等待时间)和 svctm(表示每次 IO 设备服务时间,一般性能越好的磁盘,这个值越小)。
如果 svctm 接近 await ,说明 IO 几乎没有等待,每个 IO 设备都得到及时的响应。
如果 svctm 远小于 await ,说明 IO 等待队列可能很长,IO 的得到服务的时间将延长(排队+服务时间)。
avgqu-sz:表示 IO 排队的现象,如果排队过长会影响 IO 的响应时间。
r/s+w/s:可以计算当前系统的 iops(可以结合硬盘的测试或者硬件参数来衡量是否超过磁盘的 iops 最大值)。
通过 iostat 了解到如果磁盘 I/O 出现性能瓶颈,我们可以借助 pidstat ,定位出导致瓶颈的进程,分析进程的 I/O 行为,结合应用程序的原理,分析这些 I/O 的来源</code></pre>
</li>
</ul>