tmpfs에서 대용량 파일을 삭제하는 것이 즉시 이루어지지 않는 이유는 무엇입니까?

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? 디스크는 포함되지 않으며 더 이상 사용되지 않는 메모리를 표시하기만 하면 됩니다.

답변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)소스 코드를 파헤쳐야 할 것입니다. 제 생각에는 파일이 삭제될 때 메모리에 있는 파일을 나타내는 데이터 구조(연결된 목록?)가 반복되므로 작업 변경이 설명됩니다. 파일 크기에 따른 시간 선형 증가.

관련 정보