$ cat /proc/mounts | egrep ' /tmp '
tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0
$ dd if=/dev/zero bs=1M count=3000 of=/tmp/q
3000+0 records in
3000+0 records out
3145728000 bytes (3.1 GB) copied, 1.04961 s, 3.0 GB/s
$ time rm /tmp/q
real 0m0.296s
user 0m0.000s
sys 0m0.290s
なぜダメなの0.000s
?ディスクは含まれておらず、使用されなくなったメモリを表示するだけです。
答え1
「このメモリを未使用としてマーク」は、システムコールが実行する必要があるワークロードの関数でありunlinkat(2)
、これはファイルサイズに応じて線形に拡張されます。tmpfs
約4Gメモリを搭載したRHEL 6システムの基本的な状況では、デモは次のように実行できます。
$ sudo mkdir /tmpfs; sudo mount -t tmpfs -o size=75% tmpfs /tmpfs; cd /tmpfs
$ dd if=/dev/zero bs=1M of=blah count=2859
...
$ strace -c rm blah 2>&1 | head -3
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.241964 241964 1 unlinkat
$ for c in 500 1000 1500 2000 2500; do dd if=/dev/zero bs=1M of=blah count=$c 2>/dev/null; echo -n "$c "; strace -c rm blah 2>&1 | awk '/unlinkat/{print $3}'; done
500 53992
1000 88986
1500 135980
2000 174974
2500 222966
システムコールが正確に何をしているのかについては、unlinkat(2)
ソースコードを掘り下げる必要があります。私の考えでは、ファイルが削除されたときにメモリ内のファイルを表すデータ構造(リンクリスト?)が繰り返されるので、タスクの変更について説明します。ファイルサイズによる時間線形増加。