这是一个读取 iostat -dmx 1 输出,对磁盘使用进行可视化的 notebook。

不要太在意代码左边的序号。它们是执行顺序。我反复执行过,所以它们比较大,还有些乱序。

首先我们配置一下 matplotlib。第一行是给 Jupyter 的指令,告诉它我们想要直接在网页上显示 matplotlib 的图。

In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (20.0, 10.0)

import 一些东西。pandas 是待会做滑动平均用的。

In [46]:
import pandas as pd

这个是我自己写的模块。在 winterpy 里可以找到。

In [47]:
from sysstatutils import read_iostat

导入数据文件。这个日志文件是我在进行系统备份的时候取得的。

In [78]:
with open('iostat2.log') as f:
    data = read_iostat(f)
In [67]:
devices = sorted(data.keys())
devices
Out[67]:
['sda', 'sdb', 'sdc']
In [50]:
data['sda'].keys()
Out[50]:
dict_keys(['await', 'r/s', 'wMB/s', 'rMB/s', 'r_await', '%util', 'avgrq-sz', 'svctm', 'w/s', 'wrqm/s', 'w_await', 'avgqu-sz', 'rrqm/s'])
In [68]:
def plot(x, l='(unknown)'):
    s = pd.Series(x)
    s1 = s.rolling(window=10).mean()
    return plt.plot(s1, label=l)[0]

先画一下磁盘使用率的图。外部磁盘 sdc 是我的备份盘,最忙碌了。sda 是我的主硬盘,大部分时候都还有点余力,所以系统不怎么卡。它忙的时候整个系统就会卡起来了。

sdb 是我的 SSD。一开始做缓存,一年之后坏掉了。过了一段时间我发现它又可以用了,但是不敢放数据上去,就只是把火狐的缓存弄过去了。

In [79]:
lines = [plot(data[x]['%util'], x) for x in devices]
plt.legend(handles=lines, framealpha=0.5, fontsize=11)
Out[79]:
<matplotlib.legend.Legend at 0x7f3a3600bb38>

如下图所示,备份过程中主要在读 sda,写 sdc

In [80]:
lines = [plot(data[x]['wMB/s'], x+'/w') for x in devices] + \
    [plot(data[x]['rMB/s'], x+'/r') for x in devices]
plt.legend(handles=lines, framealpha=0.5, fontsize=11)
Out[80]:
<matplotlib.legend.Legend at 0x7f3a35ce5208>

所以 sdc 都忙不过来了。sda 还好。作为 SSD,sdb 自然是响应十分迅速的(而且也没多少活干)。

In [81]:
lines = [plot(data[x]['await'], x) for x in devices]
plt.legend(handles=lines, framealpha=0.5, fontsize=11)
Out[81]:
<matplotlib.legend.Legend at 0x7f3a35f64c50>

分别看一下读写等待时间:

In [82]:
lines = [plot(data[x]['w_await'], x+'/w') for x in devices] + \
    [plot(data[x]['r_await'], x+'/r') for x in devices]
plt.legend(handles=lines, framealpha=0.5, fontsize=11)
Out[82]:
<matplotlib.legend.Legend at 0x7f3a35ebb9b0>