GEOM gcache を dump で試す2008年04月15日 18時03分15秒

Abyssmal dump cache efficiency によると、dump はキャッシュを通して使えないのでとても効率が悪いらしい。
After instrumenting dump(8) and looking at its access patterns, it turns out that it typically reads roughly three times as much data into its camp che as it should, whilst using five times as much RAM as requested.
三回ディスクから読みだし、五倍以上もメモリを必要とするとの報告だ。

昔は、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 三回だけではなく、若干他の作業も含まれている。


# gcache list
Geom name: root
WroteBytes: 0
Writes: 0
CacheFull: 0
CacheMisses: 36618
CacheHits: 521275
CacheReadBytes: 2474321408
CacheReads: 557893
ReadBytes: 2474321408
Reads: 557893
InvalidEntries: 0
UsedEntries: 987
Entries: 987
TailOffset: 2147483648
BlockSize: 65536
Size: 1073741824
Providers:
1. Name: cache/root
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: ad4s3a
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Mode: r0w0e0

前回次回