従来のLinuxはread(2)やwrite(2)によるメモリアクセスは二回タッチでactiveリストへ移動だったのに、
mmapによるタッチは(pteのaccess bitが1bitしかない関係で)1回タッチでactiveリストになっていた。

そのため、現代的なマシンではmmapを使ってコピーすると逆に遅いという自体が発生していた。
以下のURL参照

http://d.hatena.ne.jp/kzk/20060513


んで、1年ぐらい前にmadviseしたときだけ、page activationを控えめにするパッチが入っていたのだが
今回2.6.34において、madviseなしでもused onceページはactiveリストに移動しないように論理が変更された。

と、定性的に説明するのも芸がないので、ベンチをとってみた。


測定ソフト
--------------------------
copybench ver 0.1 http://code.google.com/p/copybench/

測定環境
------------------------------------
メモリ: 500M (の環境をcgroupで作った)
コピー対象ファイルサイズ: 1.5G


+ time ./rw_cp /tmp/bigfile /tmp/bigfile2
0.09user 26.19system 0:54.32elapsed 48%CPU (0avgtext+0avgdata 1360maxresident)k
3072832inputs+5674032outputs (0major+106minor)pagefaults 0swaps

+ time ./rw_fadv_cp /tmp/bigfile /tmp/bigfile2
0.08user 25.82system 0:50.83elapsed 50%CPU (0avgtext+0avgdata 1376maxresident)k
3072584inputs+6752512outputs (0major+107minor)pagefaults 0swaps

+ time ./mm_sync_cp /tmp/bigfile /tmp/bigfile2
3.42user 32.59system 0:59.75elapsed 60%CPU (0avgtext+0avgdata 2042576maxresident)k
3073104inputs+3080320outputs (7major+768105minor)pagefaults 0swaps

+ time ./mm_sync_madv_cp /tmp/bigfile /tmp/bigfile2
3.54user 32.91system 1:00.02elapsed 60%CPU (0avgtext+0avgdata 2041536maxresident)k
3072856inputs+6056488outputs (2major+768103minor)pagefaults 0swaps

+ time ./mw_cp /tmp/bigfile /tmp/bigfile2
0.00user 28.39system 0:53.09elapsed 53%CPU (0avgtext+0avgdata 1380608maxresident)k
3072832inputs+4456448outputs (3major+384101minor)pagefaults 0swaps

+ time ./mw_madv_cp /tmp/bigfile /tmp/bigfile2
0.00user 27.91system 0:52.49elapsed 53%CPU (0avgtext+0avgdata 1021680maxresident)k
3072856inputs+5076432outputs (1major+384103minor)pagefaults 0swaps


以前は mm_sync_cp (readもwriteもmmapで、madviseなし)だけelapsが二倍遅いとかザラだったので、
結構いい感じ。

しかし、いまだに多くのツールでmmapのほうが速いと盲目的に信じているのは困りものである。ほむり。