tmpfs: tmpfs에서 파일을 생성해도 htop/top의 메모리 사용량이 변경되지 않습니다.

tmpfs: tmpfs에서 파일을 생성해도 htop/top의 메모리 사용량이 변경되지 않습니다.

나는 tmpfs에 대해 읽었고 그것의 이점이 궁금했습니다. 그래서 디렉토리를 생성하고 tmpfs로 마운트했습니다.

따라서 이론적으로 tmpfs에 작성된 모든 내용은 RAM에 직접 저장되며 재부팅할 때까지 지속됩니다. 그래서 tmpfs 드라이브에 10GB 파일을 만들었습니다. 이론에 따르면 htop/top 명령은 10GB 이상의 RAM 소비를 표시해야 합니다. 256GB의 RAM이 있지만 RAM 소비량은 tmpfs에서 10GB 파일을 생성하기 전과 동일합니다.

내가 놓친 것이 있나요?

답변1

Braatchley가 이미 지적했듯이 htop은 다른 사람들과 마찬가지로 +- 캐시 라인을 자유롭게 볼 수 있는 것 같습니다. 3.14 이전의 커널 버전을 사용하는 경우에는 실제로 변경되지 않습니다. 최신 커널이 있더라도 free 및 htop은 올바른 값을 얻으려면 어디를 찾아야 하는지 알 만큼 똑똑해야 합니다.

무슨 일이 일어나고 있는지 더 깊이 이해하려면 /proc/meminfo를 살펴보고 이전 시스템에서 무료로 제공되는 것과 비교해 보세요.

root@localhost:/media/user# free
             total       used       free     shared    buffers     cached
Mem:        291152     268264      22888          0          0      47180
-/+ buffers/cache:     221084      **70068**
Swap:            0          0          0

root@localhost:/media/user# cat /proc/meminfo
MemTotal:         291152 kB
MemFree:           **22904** kB
Buffers:               0 kB
Cached:            **47144** kB
SwapCached:            0 kB
Active:           154752 kB
Inactive:          32376 kB
Active(anon):     143632 kB
Inactive(anon):    21936 kB
Active(file):      11120 kB
Inactive(file):    10440 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        139996 kB
Mapped:            25276 kB
Shmem:             **25584** kB
Slab:              64096 kB
SReclaimable:       3364 kB
SUnreclaim:        60732 kB
KernelStack:        2280 kB
PageTables:         3588 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      145576 kB
Committed_AS:    1500824 kB
VmallocTotal:     499712 kB
VmallocUsed:        7256 kB
VmallocChunk:     449196 kB

tmpfs는 shmem 아래에 포함되지만 "cache" 섹션에도 추가됩니다. 이전 Linux(커널 + procps)에서는 이는 "사용 가능한" 메모리를 결정하는 데 사용되었지만 대부분의 사용자가 캐시 메모리를 즉시 회수 가능한 것으로 취급하기 때문에 이는 매우 문제가 됩니다. tmpfs에서는 더 이상 그렇지 않습니다.

최근 시스템(커널 >= 3.14)에서는 /proc/meminfo에서 새로운 것을 찾을 수 있습니다:

MemAvailable:    xxxx kB

이는 이러한 모든 요소를 ​​고려하며 htop과 free가 이 값에 의존하는 한 정확한 표현을 얻을 수 있습니다. 내 Debian 8 시스템에서는 커널이 MemAvailable을 인식하지만 그렇지 않습니다.

ardi@oab1ardi-mcdev:~/mc/oattest1/workspace/bcm_linux_3_4rt$ cat /proc/meminfo | grep Avail
MemAvailable:    **1319148** kB

ardi@oab1ardi-mcdev:~/$ free
             total       used       free     shared    buffers     cached
Mem:       2058360    1676332     382028      33116      40356     933916
-/+ buffers/cache:     702060    **1356300**
Swap:            0          0          0

ardi@oab1ardi-mcdev:~/$ sudo dd if=/dev/zero bs=1M count=200 of=/run/delme
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.0628098 s, 3.3 GB/s

ardi@oab1ardi-mcdev:~/$ free
             total       used       free     shared    buffers     cached
Mem:       2058360    1881060     177300     237916      40372    1138720
-/+ buffers/cache:     701968    **1356392**
Swap:            0          0          0

ardi@oab1ardi-mcdev:~/mc/oattest1/workspace/bcm_linux_3_4rt$ cat /proc/meminfo | grep Avail
MemAvailable:    **1114152 kB**

마지막 참고 사항:

실제로 tmpfs는 매우 위험할 수 있습니다. 다른 유형의 메모리 사용량과 달리 tmpfs 파일은 OOM Killer로 정리할 수 없으며 실제로 어떤 프로세스가 tmpfs 파일을 생성했는지에 대한 기록이 없습니다. 따라서 데비안 8이 /tmp(모든 프로세스에 쓸 수 있음)에 tmpfs를 사용하지 않기로 선택한 이유는 무엇입니까?

다음 링크에 대한 크레딧: https://linuxraj.wordpress.com/2015/03/10/memory-utilization-from-procmeminfo-memavailable/ https://rwmj.wordpress.com/2012/09/12/tmpfs-considered-harmful/

관련 정보