我正在写 yat (yet-another-tool :)) 来监控 Linux 上的磁盘使用情况。我正在使用python 3.3.2和psutil 3.3.0。
我正在监控的进程做了一些非常基本的事情:我使用dd工具并改变块大小(128、512、1024、4096)
#!/bin/bash
dd if=./bigfile.txt of=./copy.img bs=4096
大文件.txt:
$ stat bigfile.txt
File: ‘bigfile.txt’
Size: 87851423 Blocks: 171600 IO Block: 4096 regular file
监视器的片段如下:
def poll(interval, proc):
d_before = proc.io_counters()
time.sleep(interval)
tst = time.time()
d_after = proc.io_counters()
usage = OrderedDict.fromkeys(d_after.__dict__.keys())
for k, v in usage.items():
usage[k] = d_after.__dict__[k] - d_before.__dict__[k]
return tst, usage
在每次运行时,我都会清除缓存(正如 stackoverflow 上多次建议的那样):
rm copy.img && sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
我的问题是:为什么数字不匹配?
bs=128:
dd:
686339+1 records in
686339+1 records out
87851423 bytes (88 MB) copied, 1.21664 s, 72.2 MB/s
监视器.py:
1450778750.104943 OrderedDict([('read_count', 686352), ('write_count', 686343), ('read_bytes', 87920640), ('write_bytes', 87855104)])
bs=4096
dd:
21448+1 records in
21448+1 records out
87851423 bytes (88 MB) copied, 0.223911 s, 392 MB/s
监视器.py:
1450779294.5541275 OrderedDict([('read_count', 21468), ('write_count', 21452), ('read_bytes', 88252416), ('write_bytes', 87855104)])
bs的所有值仍然存在差异。
是否确定读/写不被计算在内?psutil 是否执行一些额外的工作?例如,使用bs=4096,为什么在 psutil 400993 中报告了更多字节(用于读取)和 3681(用于写入)?
我错过了什么大事吗?
非常感谢。
编辑:作为更新,测量中的时间粒度无关紧要,即 time.sleep(interval) 调用。我尝试了不同的值,并总结了 psutil 报告的读写总数。差异仍然存在。
EDIT2:代码段中的错字