Linux

為什麼從 tmpfs 中刪除大文件不是即時的?

  • February 1, 2016
$ 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呢?不涉及磁碟,只是標記記憶體不再使用。

“將該記憶體標記為未使用”是系統呼叫必須完成多少工作的函式unlinkat(2),而這又與文件大小成線性關係。對於具有約 4G 記憶體的 RHEL 6 系統上的預設設置tmpfs,可以如下所示進行展示。

$ 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)系統呼叫具體在做什麼,則需要深入研究原始碼;我的猜測是,當文件被刪除時,表示記憶體中文件的資料結構(鍊錶?)正在循環,因此考慮了操作時間與文件大小的線性增長。

引用自:https://unix.stackexchange.com/questions/259163