为什么有些缓存不可删除?

为什么有些缓存不可删除?

这是输出free -m

              total        used        free      shared  buff/cache   available
Mem:            421         158         153          39         109         195
Swap:             0           0           0

我执行了echo 3 > /proc/sys/vm/drop_caches删除所有可能的缓存,但buff/cache值仍然保持在 109MB。这些缓存是由什么保存的?我可以以某种方式放弃它们吗?

使用的系统是XUbuntu 16.04。

其中一些缓存(43mb)可能由 tmpfs 使用:

tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=43188k,mode=700,uid=1000,gid=1000)

这留下了更多的空间来解释。

输出df -mt tmpfs

Filesystem     1M-blocks  Used Available Use% Mounted on
tmpfs                 43     3        40   7% /run
tmpfs                211     1       211   1% /dev/shm
tmpfs                  5     1         5   1% /run/lock
tmpfs                211     0       211   0% /sys/fs/cgroup
tmpfs                 43     1        43   1% /run/user/1000

答案1

如果您填满了 tmpfs,它只会使用这 43MB。它不提前保留内存。然而:

不管你信不信,39M“共享”这个数字是不能掉的,全部算作“buff/cache”。它包括所有 tmpfs 文件。它还包括从秘密内核 tmpfs 分配的“共享”内存:-)。这包括“系统 V 共享内存”,以及某些类型的图形缓冲区

无论如何,这两个错误大致抵消了。那么剩下的记忆呢?

当您在 Linux 中删除缓存时,它会选择不删除当前正在运行的程序映射的任何缓存。 其中许多映射将是程序/库代码文件。

某些数据文件也可能被映射。例如,当您运行journalctl浏览日志时,它使用(而不是)systemd访问日志文件。mmap()read()

您可以使用 来检查剩余的缓存sudo smem -t -m。我预计他们当前将主要运行程序以及他们使用的库。

证明

如果您想验证这一点,请参阅以下内核代码的链接:

删除缓存通过为每个缓存的“inode”(文件)调用 invalidate_mapping_pages() 来工作。

invalidate_mapping_pages()- 使一个inode的所有未锁定页面失效

[...]

invalidate_mapping_pages() 不会阻塞 IO 活动。它不会使脏页、锁定页、回写页或映射到页表

如果您有任何“脏”页面(缓存的写入)或正在进行的写入,这些也不会被删除或等待。这也被提到在文档/sysctl/vm.txt

在脏/回写页的情况下,invalidate_mapping_pages()通过调用deactivate_file_page()“[尝试]加速其回收”。我没有具体检查这意味着什么:-)。

相关内容