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

…詳しいことは良く分かりませんが、スワップアウトはするようです。