Linux でディスクの使用状況を監視するために、yat (yet-another-tool :)) を作成しています。私はpython 3.3.2とpsutil 3.3.0を使用しています。
私が監視しているプロセスは、非常に基本的なことを行います。dd ツールを使用し、ブロックサイズを変更します(128、512、1024、4096)。
#!/bin/bash
dd if=./bigfile.txt of=./copy.img bs=4096
bigfile.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 :
日:
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
日:
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 (書き込み用) が報告されるのはなぜですか?
私は何か大きなものを見逃していますか?
どうもありがとう。
EDIT : 更新として、測定のタイミングの粒度、つまり time.sleep(interval) 呼び出しは関係ありません。さまざまな値を試し、psutil によって報告された読み取りと書き込みの合計数を合計しました。違いは残ります。
EDIT2:スニペットコードのタイプミス