tmpfs :在 tmpfs 中创建文件不会更改 htop/top 中的内存使用情况

tmpfs :在 tmpfs 中创建文件不会更改 htop/top 中的内存使用情况

我阅读了有关 tmpfs 的内容,并很好奇从中获得好处。因此,我创建了一个目录并挂载为 tmpfs。

因此,根据理论,tmpfs 中写入的任何内容都会直接存储在 RAM 上并持续到重新启动为止。因此,我在 tmpfs 驱动器上创建了一个 10 GB 的文件。根据理论,htop/top 命令必须显示 RAM 消耗超过 10 GB。我有 256 GB 的 RAM,但我的 RAM 消耗量与在 tmpfs 上创建 10 GB 文件之前相比更少且相同。

有什么我错过的吗?

答案1

正如 Braatchley 已经指出的那样,htop 和其他人一样,似乎可以自由地查看 +- 缓存行。如果您使用的内核版本早于 3.14,那么这一点确实不会改变。即使您有更新的内核,free 和 htop 也必须足够聪明,知道在哪里查找才能获得正确的值。

要更深入地了解发生的情况,请查看 /proc/meminfo 并将其与我的旧系统上的 free 进行比较:

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 下,但也添加到“缓存”部分中。在较旧的 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 文件。因此,为什么 debian 8 选择不使用 tmpfs 作为 /tmp(任何进程都可以写入)。

归功于以下链接: https://linuxraj.wordpress.com/2015/03/10/memory-utilization-from-procmeminfo-memavailable/ https://rwmj.wordpress.com/2012/09/12/tmpfs-considered-harmful/

相关内容