tmpfsはスワップアウトするのか
試してみました。確かにスワップアウトします。
しかし、少しでも実メモリの容量を超える量をtmpfsに書き込もうとすると、swapを使い果たすまで実メモリを空けようとするようです。実メモリからswapにデータが移動している間、そのデータを書き込もうとしたプロセスはブロックします。
試したのはメモリを2GB積んだ実機で、カーネルは2.6.19.7。OSはdebootstrapで作ったDebian etchで、VIVER CORE Serverでネットワークブートしています。(つまり/がtmpfs)
まずブートしただけの状態だと、free -mの実行結果は↓こうなっています。
total used free shared buffers cached Mem: 1996 266 1729 0 0 230 -/+ buffers/cache: 36 1959 Swap: 0 0 0
swaponすると、↓こうなります。
total used free shared buffers cached Mem: 1996 267 1728 0 0 230 -/+ buffers/cache: 37 1958 Swap: 1655 0 1655
swapは1655MBで、実メモリは1996MB。内267MBが使用済み。
/mntにtmpfsを -o size=2000m でマウントし、20MBのファイルを100個作ってみます。
# free -m total used free shared buffers cached Mem: 1996 267 1728 0 0 230 -/+ buffers/cache: 37 1959 Swap: 1655 0 1655 # mount tmpfs /mnt -t tmpfs -o size=2000m # for i in `seq 1 100`; do dd if=/dev/zero of=/mnt/img20m.$i bs=1M count=20; done # # 別のコンソールで # while true; do free -m; echo; sleep 1; done
free -mの実行結果
total used free shared buffers cached Mem: 1996 534 1461 0 0 496 -/+ buffers/cache: 38 1957 Swap: 1655 0 1655 total used free shared buffers cached Mem: 1996 1251 744 0 0 1210 -/+ buffers/cache: 41 1954 Swap: 1655 0 1655 total used free shared buffers cached Mem: 1996 1975 20 0 0 1930 -/+ buffers/cache: 45 1951 Swap: 1655 0 1655 total used free shared buffers cached Mem: 1996 1982 13 0 0 1134 -/+ buffers/cache: 848 1147 Swap: 1655 803 851 total used free shared buffers cached Mem: 1996 1967 28 0 0 282 -/+ buffers/cache: 1685 311 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 1944 51 0 0 282 -/+ buffers/cache: 1662 333 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 1922 73 0 0 282 -/+ buffers/cache: 1640 356 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 1896 99 0 0 282 -/+ buffers/cache: 1614 382 Swap: 1655 1655 0 # …中略…Mem: の freeが6MB/sくらいで増え続ける… total used free shared buffers cached Mem: 1996 356 1639 0 0 282 -/+ buffers/cache: 74 1922 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 349 1646 0 0 282 -/+ buffers/cache: 67 1929 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 341 1654 0 0 282 -/+ buffers/cache: 59 1936 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 398 1597 0 0 349 -/+ buffers/cache: 49 1947 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 620 1375 0 0 570 -/+ buffers/cache: 49 1946 Swap: 1655 1655 0 total used free shared buffers cached Mem: 1996 620 1375 0 0 570 -/+ buffers/cache: 49 1946 Swap: 1655 1655 0 # ここでddが終了
どうやらswapを使い果たすまで実メモリを空けているようです。この間ddはブロックしています。
ここで作成したファイルを削除すると、↓こうなりました。
# rm -f /mnt/* # free -m total used free shared buffers cached Mem: 1996 80 1916 0 0 43 -/+ buffers/cache: 36 1959 Swap: 1655 186 1468
実メモリにぎりぎり収まる分だけ、20MBのファイルを95個作ってみてると、ddは一瞬で終わり、free -mは↓こうなりました。
# for i in `seq 1 95`; do dd if=/dev/zero of=/mnt/img20m.$i bs=1M count=20; done # free -m total used free shared buffers cached Mem: 1996 1959 36 0 0 1901 -/+ buffers/cache: 57 1938 Swap: 1655 230 1424
swapに使ったデバイスの書き込み速度を測ってみると、約19MB/sでした。ちなみにUSBメモリです(RUF2-R2G)。
# sync; time (dd if=/dev/zero of=/dev/sdb2 bs=1M count=300; sync) 300+0 records in 300+0 records out 314572800 bytes (315 MB) copied, 15.9577 seconds, 19.7 MB/s real 0m15.961s user 0m0.000s sys 0m1.188s # perl -e 'print 300 / 15.961' 18.7958147985715
…詳しいことは良く分かりませんが、スワップアウトはするようです。