首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
宝塔
V2EX  ›  Linux

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

  •  
  •   coderqbc · 34 天前 · 2295 次点击
    这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    20 回复  |  直到 2019-10-18 15:50:48 +08:00
        1
    AmrtaShiva   34 天前 via Android
    有 swap 会占用 swap 吧 编译过几次软件 都是满了直接占 swap
        2
    love   34 天前
    这个是自动管理的,可以当成是可用内存,管它干什么
        3
    fuzhuo233   34 天前   ♥ 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   34 天前 via Android
    @fuzhuo233 是从 anon cache 和 file cache 里面回收吧,而且并不是所有的 cache 都能够被回收,具体得看程序是怎样写的
        5
    fuzhuo233   34 天前
    @Nitroethane 嗯,cached 就是 file cache,anon 貌似没有 cache 的说法。anon 和 file 各有一个 LRU,只回收 inactive 的部分,inactive 不足的时候将最不活跃的 active 移至 inactive,active/inactive 保持一定的比例。file cache 理论上应该都能被回收,当发生文件系统读操作时 free 会转化为新的 file cache。整个过程加上回收形成一个循环
        6
    wangyzj   34 天前
    不会
        7
    Cyshall   34 天前
    @fuzhuo233 anon cache gogole 搜了下是 anonymous page, 是这个意思么?
        8
    hkitdog   34 天前 via iPhone
    不会,要自己 free
        9
    fuzhuo233   34 天前
    @Cyshall 对的,anon 就是匿名页。没有文件作为后备的页,不像 file cache 丢失后可以再从文件读回来,它不能直接丢弃只能 swap。一般用户层应用程序 new malloc brk 或者 mmap null 来的内存 page fault 映射的物理内存都是匿名页
        10
    coderqbc   34 天前
    @AmrtaShiva swap 应该是物理内存不足时才占用吧
        11
    coderqbc   34 天前
    @love 有时候往 /tmp 目录(挂载到内存)里写文件,占用的是内存 cached,删除写入的文件之后好像不会立即释放 cached
        12
    coderqbc   34 天前
    @fuzhuo233 往 /tmp 目录(挂载到内存)里写文件,关闭并删除写入的文件之后会不会立即释放该文件占用的 cached?
        13
    coderqbc   34 天前
    @hkitdog 内存不足时那咋办?
        14
    love   34 天前
    @coderqbc 那我没玩过内存文件系统,可能人家设计上就是文件系统可以增大不能自动收缩的
        15
    pedia0992   34 天前
    1. Linux 系统会自动释放 cache 的内存, 再加上现在默认 OOM 机制, 内存管理这块基本无需人工干预.
    2. 除了你自己想清空 Page Cache, 否则无需执行`echo 3 > ....`.
        16
    starsriver   34 天前 via Android
    自动管理机,给你省时还不愿意?
        17
    Nitroethane   33 天前 via Android   ♥ 1
    @coderqbc 不一定在物理内存不足的时候才用 swap,只要有不活跃的内存,内核都会换出去。
    /tmp 就是实现为内存文件系统,占用的是 cache,写入的文件删除后对应的内存即成为空闲内存可被回收,即使空闲内存大小不会立即显示出来。会不会被立即释放看内核,不过无所谓了,因为已经被标记成空闲。
        18
    coderqbc   33 天前 via iPhone
    @pedia0992
    @Nitroethane
    感谢解惑,看来需要系统学习一下内存管理机制扫盲🤣
        19
    Srar   33 天前
    @coderqbc 关于 swap 的话 可以查下内核参数 vm.swappiness
        20
    coderqbc   33 天前 via iPhone
    @Srar 好的,和内存管理一起学习下
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   992 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 22:33 · PVG 06:33 · LAX 14:33 · JFK 17:33
    ♥ Do have faith in what you're doing.