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