这是输出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()“[尝试]加速其回收”。我没有具体检查这意味着什么:-)。