davfs2 の キャッシュディレクトリを tmpfs にしたら大きいファイルのコピーがエラーになった
以下、最初はベンチマークとってみたって記事にしようと思って書いた文章です。 あと以下の記事の続きです。
スペック
ちなみに http (not https) です。over SSL だったらもっと違うかも。 そんな真面目にベンチマークやるつもりなかったけど一応バージョンも。*1
- サーバ
 - クライアント
 
試行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.
結論
ちゃんと試しておいてよかった。