読者です 読者をやめる 読者になる 読者になる

davfs2 の キャッシュディレクトリを tmpfs にしたら大きいファイルのコピーがエラーになった

以下、最初はベンチマークとってみたって記事にしようと思って書いた文章です。 あと以下の記事の続きです。

tyru.hatenablog.com

スペック

ちなみに http (not https) です。over SSL だったらもっと違うかも。 そんな真面目にベンチマークやるつもりなかったけど一応バージョンも。*1

  • サーバ
    • CentOS Linux release 7.2.1511 (Core)
    • MicroServer N36L
      • CPU: AMD Athlon(tm) II Neo N36L Dual-Core Processor
      • メモリ: 7.5 MB
    • パッケージ: httpd-2.4.6-40.el7.centos.1.x86_64
  • クライアント
    • CentOS Linux release 7.2.1511 (Core)
    • KVM 上の VM
      • CPU: Intel(R) Core(TM) i5-2390T CPU @ 2.70GHz (の 1 Core)
      • メモリ: 1024 MB
    • パッケージ: davfs2-1.4.7-6.el7.x86_64

試行1:CentOS 7の ISO image (4329570304 B, 4.1 GB)

まずはファイルサイズの大きい手頃なファイルとして CentOS 7 の ISO image があったので単純に cp でホームディレクトリにコピーしてみる。

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time cp /mnt/dav/{iso image} .
real    1m6.660s
user    0m0.049s
sys     0m4.311s

だいたい 500 Mbps *2

試行2:ログファイル (ファイル数:多い、ファイルサイズ:小さい)

ファイル数が多くて1個1個のファイルサイズが小さいやつ。

$ sudo du -cksh /mnt/dav/{ログファイルのディレクトリ}
152M    /mnt/dav/{ログファイルのディレクトリ}
152M    合計
$ sudo find /mnt/dav/{ログファイルのディレクトリ} -type f | wc -l
107
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ sudo bash -c 'time cp -R /mnt/dav/{ログファイルのディレクトリ} .'

real    0m2.178s
user    0m0.006s
sys     0m0.190s

パフォーマンスチューニング

単にクライアント側のキャッシュ用のディレクトリを tmpfs にしただけ。 デフォルトの use_locks 1 だと {書き込もうとしたディレクトリ}/.DAV/.locknull とかにも書き込んでるみたいだけど、use_locks 0 は前述した通りしたくないので見送った。 できるだけデフォルトの設定のままにしたいのもある。

/etc/fstab

tmpfs /var/cache/davfs2 tmpfs defaults 0 0

/etc/davfs2/davfs2.conf

有効にしてる設定は下記だけ。 cache_dir にはデフォルトだと /var/cache/davfs2~/.davfs2/cache らしいけど後者がいつ使われるかわからなかったので1つだけにして tmpfs のディレクトリを指定。

ask_auth        0
cache_dir       /var/cache/davfs2 # system wide cache only
cache_size      50                # MiByte
delay_upload    0

…と思ったけど大きいファイルをコピーしようとすると cache_size を無視して cache_dir にキャッシュファイルを置こうとするらしくコピーがエラーになった (man 5 davfs2.conf より引用)。 *3

cache_size

The amount of disk space in MiByte that may be used. mount.davfs will always take enough space to cache open files, ignoring this value if necessary.

結論

ちゃんと試しておいてよかった。

*1:Hinemos で定期実行してるジョブも止めずにやった…結局ベンチマーク意味なくなったけど

*2:4329570304(バイト) / 66(秒) * 8 / 10242

*3:cache_size って何のための値なんだろう…