请问 Linux 在内存不足时会自动回收 cached 占用的空间吗?

2019-10-17 16:49:48 +08:00
 coderqbc

cached 是 free -m 显示的。
已知 /proc/sys/vm/drop_caches 值=0。
1.如果内存不足时系统会自动释放 cached 占用的空间吗?
2.什么情况下需要"echo 3 > /proc/sys/vm/drop_caches"手动释放?

6451 次点击
所在节点    Linux
20 条回复
AmrtaShiva
2019-10-17 17:00:16 +08:00
有 swap 会占用 swap 吧 编译过几次软件 都是满了直接占 swap
love
2019-10-17 17:19:15 +08:00
这个是自动管理的,可以当成是可用内存,管它干什么
fuzhuo233
2019-10-17 17:20:56 +08:00
在 free 足够大的时候是不会回收 cached。仅当 zone 的 free 小于 low 水位线的时候才会开始唤醒 kswapd 回收内存,回收内存可以从 anon 和 cached 两处回收,anon 会回收进入 swap,cached 回收会直接变成 free,这样 cached 就会减少了。anon 和 cached 回收的比例按照 /proc/sys/vm/swappiness 和最大值 200 的比例来

正常情况下不需要"echo 3 > /proc/sys/vm/drop_caches"来手动释放,这样会造成 IO 缓存丢失,IO 量会激增。除非有场景需要在申请大量内存且对内存申请性能有很严格的要求
Nitroethane
2019-10-17 17:27:16 +08:00
@fuzhuo233 是从 anon cache 和 file cache 里面回收吧,而且并不是所有的 cache 都能够被回收,具体得看程序是怎样写的
fuzhuo233
2019-10-17 17:38:24 +08:00
@Nitroethane 嗯,cached 就是 file cache,anon 貌似没有 cache 的说法。anon 和 file 各有一个 LRU,只回收 inactive 的部分,inactive 不足的时候将最不活跃的 active 移至 inactive,active/inactive 保持一定的比例。file cache 理论上应该都能被回收,当发生文件系统读操作时 free 会转化为新的 file cache。整个过程加上回收形成一个循环
wangyzj
2019-10-17 17:42:55 +08:00
不会
Cyshall
2019-10-17 17:50:58 +08:00
@fuzhuo233 anon cache gogole 搜了下是 anonymous page, 是这个意思么?
hkitdog
2019-10-17 17:54:27 +08:00
不会,要自己 free
fuzhuo233
2019-10-17 18:10:14 +08:00
@Cyshall 对的,anon 就是匿名页。没有文件作为后备的页,不像 file cache 丢失后可以再从文件读回来,它不能直接丢弃只能 swap。一般用户层应用程序 new malloc brk 或者 mmap null 来的内存 page fault 映射的物理内存都是匿名页
coderqbc
2019-10-17 19:11:54 +08:00
@AmrtaShiva swap 应该是物理内存不足时才占用吧
coderqbc
2019-10-17 19:25:00 +08:00
@love 有时候往 /tmp 目录(挂载到内存)里写文件,占用的是内存 cached,删除写入的文件之后好像不会立即释放 cached
coderqbc
2019-10-17 19:29:07 +08:00
@fuzhuo233 往 /tmp 目录(挂载到内存)里写文件,关闭并删除写入的文件之后会不会立即释放该文件占用的 cached?
coderqbc
2019-10-17 19:30:43 +08:00
@hkitdog 内存不足时那咋办?
love
2019-10-17 21:29:38 +08:00
@coderqbc 那我没玩过内存文件系统,可能人家设计上就是文件系统可以增大不能自动收缩的
pedia0992
2019-10-17 22:56:50 +08:00
1. Linux 系统会自动释放 cache 的内存, 再加上现在默认 OOM 机制, 内存管理这块基本无需人工干预.
2. 除了你自己想清空 Page Cache, 否则无需执行`echo 3 > ....`.
starsriver
2019-10-18 00:05:03 +08:00
自动管理机,给你省时还不愿意?
Nitroethane
2019-10-18 06:40:30 +08:00
@coderqbc 不一定在物理内存不足的时候才用 swap,只要有不活跃的内存,内核都会换出去。
/tmp 就是实现为内存文件系统,占用的是 cache,写入的文件删除后对应的内存即成为空闲内存可被回收,即使空闲内存大小不会立即显示出来。会不会被立即释放看内核,不过无所谓了,因为已经被标记成空闲。
coderqbc
2019-10-18 10:01:17 +08:00
@pedia0992
@Nitroethane
感谢解惑,看来需要系统学习一下内存管理机制扫盲🤣
Srar
2019-10-18 10:18:20 +08:00
@coderqbc 关于 swap 的话 可以查下内核参数 vm.swappiness
coderqbc
2019-10-18 15:50:48 +08:00
@Srar 好的,和内存管理一起学习下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/610352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX