昔は、FreeBSD にもディスクアクセス用にもブロックデバイスとキャラクタデバイスの両方が実装されていた。いつ頃だか忘れ、その理由も覚えていないが、ブロックデバイスの実装が無くなった。現実的には、ブロックデバイスとしてシステムキャッシュを通しながらディスクにアクセスすることはあまり無い。普段は、ファイルシステムを通してのアクセスがほとんどが占める。せいぜい newfs や dumpfs 等で、ファイルシステムを操作する時か dump でバックアップを取るときぐらいだろう。
しかし、dump などを行なっているとやはりパフォーマンスが気になってくる。bzip2 を行なうので、普段ではディスクを三回読もうがディスクが足を引っ張ることは無いが、少し調べてみたい。
簡単にディスクデバイスにキャッシュを挟む方法を考えていたら、ふと gcache の事が思いうかんだ。どれくらいの効果が出るか試してみる。
まずは、直接 dump を実行する。
# time dump -f - -0 /dev/ad4s3a > /dev/null
DUMP: Date of this level 0 dump: Mon Apr 14 14:49:14 2008
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/ad4s3a to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 727391 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 728256 tape blocks
DUMP: finished in 74 seconds, throughput 9841 KBytes/sec
DUMP: DUMP IS DONE
0.998u 3.629s 1:14.35 6.2% 136+2603k 4+22io 2pf+0w
# time dump -f - -0 /dev/ad4s3a > /dev/null
...
DUMP: finished in 67 seconds, throughput 10869 KBytes/sec
DUMP: DUMP IS DONE
0.990u 3.633s 1:07.00 6.8% 133+2546k 0+13io 0pf+0w
二回 dump を試してみた。そして、gcache を有効にした後に、dump を取り直す。gcache には取り合えず 1GB のメモリを割り当てた。
# gcache create -v -s 1G root /dev/ad4s3a
Done.
# time dump -f - -0 /dev/cache/root > /dev/null
DUMP: Date of this level 0 dump: Mon Apr 14 15:16:15 2008
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/cache/root to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 727391 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: 728256 tape blocks
DUMP: finished in 34 seconds, throughput 21419 KBytes/sec
DUMP: DUMP IS DONE
1.171u 3.554s 0:34.18 13.8% 141+2694k 0+15io 0pf+0w
# time dump -f - -0 /dev/cache/root > /dev/null
...
DUMP: finished in 28 seconds, throughput 26009 KBytes/sec
DUMP: DUMP IS DONE
1.181u 3.557s 0:28.47 16.6% 141+2705k 0+14io 0pf+0w
# time dump -f - -0 /dev/cache/root > /dev/null
...
DUMP: finished in 28 seconds, throughput 26009 KBytes/sec
DUMP: DUMP IS DONE
1.159u 3.564s 0:28.64 16.4% 138+2648k 0+14io 0pf+0w
以下にまとめ直してみると、ユーザ時間が微妙に増えて、システム時間が若干減っている。そして、実時間が半分以下と激減している。確かに、gcache の効果が出ているようだ。
# time dump -f - -0 /dev/ad4s3a > /dev/null
0.998u 3.629s 1:14.35 6.2% 136+2603k 4+22io 2pf+0w
0.990u 3.633s 1:07.00 6.8% 133+2546k 0+13io 0pf+0w
# time dump -f - -0 /dev/cache/root > /dev/null
1.171u 3.554s 0:34.18 13.8% 141+2694k 0+15io 0pf+0w
1.181u 3.557s 0:28.47 16.6% 141+2705k 0+14io 0pf+0w
1.159u 3.564s 0:28.64 16.4% 138+2648k 0+14io 0pf+0w
参考に、gcache list
を付けておく。2GB のパーティション領域に 1GB のキャッシュを付けたので、キャッシュミスが高くなるかと思っていたが、思ったよりも低かった。なお、この gcache list
には上の dump 三回だけではなく、若干他の作業も含まれている。
セコメントをする