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