cached 是 free -m 显示的。
已知 /proc/sys/vm/drop_caches 值=0。
1.如果内存不足时系统会自动释放 cached 占用的空间吗?
2.什么情况下需要"echo 3 > /proc/sys/vm/drop_caches"手动释放?
1
AmrtaShiva 2019-10-17 17:00:16 +08:00 via Android
有 swap 会占用 swap 吧 编译过几次软件 都是满了直接占 swap
|
2
love 2019-10-17 17:19:15 +08:00
这个是自动管理的,可以当成是可用内存,管它干什么
|
3
fuzhuo233 2019-10-17 17:20:56 +08:00 6
在 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 量会激增。除非有场景需要在申请大量内存且对内存申请性能有很严格的要求 |
4
Nitroethane 2019-10-17 17:27:16 +08:00 via Android
@fuzhuo233 是从 anon cache 和 file cache 里面回收吧,而且并不是所有的 cache 都能够被回收,具体得看程序是怎样写的
|
5
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。整个过程加上回收形成一个循环
|
6
wangyzj 2019-10-17 17:42:55 +08:00
不会
|
8
hkitdog 2019-10-17 17:54:27 +08:00 via iPhone
不会,要自己 free
|
9
fuzhuo233 2019-10-17 18:10:14 +08:00
@Cyshall 对的,anon 就是匿名页。没有文件作为后备的页,不像 file cache 丢失后可以再从文件读回来,它不能直接丢弃只能 swap。一般用户层应用程序 new malloc brk 或者 mmap null 来的内存 page fault 映射的物理内存都是匿名页
|
10
coderqbc OP @AmrtaShiva swap 应该是物理内存不足时才占用吧
|
11
coderqbc OP @love 有时候往 /tmp 目录(挂载到内存)里写文件,占用的是内存 cached,删除写入的文件之后好像不会立即释放 cached
|
12
coderqbc OP @fuzhuo233 往 /tmp 目录(挂载到内存)里写文件,关闭并删除写入的文件之后会不会立即释放该文件占用的 cached?
|
15
pedia0992 2019-10-17 22:56:50 +08:00
1. Linux 系统会自动释放 cache 的内存, 再加上现在默认 OOM 机制, 内存管理这块基本无需人工干预.
2. 除了你自己想清空 Page Cache, 否则无需执行`echo 3 > ....`. |
16
starsriver 2019-10-18 00:05:03 +08:00 via Android
自动管理机,给你省时还不愿意?
|
17
Nitroethane 2019-10-18 06:40:30 +08:00 via Android 1
@coderqbc 不一定在物理内存不足的时候才用 swap,只要有不活跃的内存,内核都会换出去。
/tmp 就是实现为内存文件系统,占用的是 cache,写入的文件删除后对应的内存即成为空闲内存可被回收,即使空闲内存大小不会立即显示出来。会不会被立即释放看内核,不过无所谓了,因为已经被标记成空闲。 |
18
coderqbc OP |