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

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

  •  
  •   coderqbc · 2019-10-17 16:49:48 +08:00 · 6637 次点击
    这是一个创建于 1889 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    AmrtaShiva
        1
    AmrtaShiva  
       2019-10-17 17:00:16 +08:00 via Android
    有 swap 会占用 swap 吧 编译过几次软件 都是满了直接占 swap
    love
        2
    love  
       2019-10-17 17:19:15 +08:00
    这个是自动管理的,可以当成是可用内存,管它干什么
    fuzhuo233
        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 量会激增。除非有场景需要在申请大量内存且对内存申请性能有很严格的要求
    Nitroethane
        4
    Nitroethane  
       2019-10-17 17:27:16 +08:00 via Android
    @fuzhuo233 是从 anon cache 和 file cache 里面回收吧,而且并不是所有的 cache 都能够被回收,具体得看程序是怎样写的
    fuzhuo233
        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。整个过程加上回收形成一个循环
    wangyzj
        6
    wangyzj  
       2019-10-17 17:42:55 +08:00
    不会
    Cyshall
        7
    Cyshall  
       2019-10-17 17:50:58 +08:00
    @fuzhuo233 anon cache gogole 搜了下是 anonymous page, 是这个意思么?
    hkitdog
        8
    hkitdog  
       2019-10-17 17:54:27 +08:00 via iPhone
    不会,要自己 free
    fuzhuo233
        9
    fuzhuo233  
       2019-10-17 18:10:14 +08:00
    @Cyshall 对的,anon 就是匿名页。没有文件作为后备的页,不像 file cache 丢失后可以再从文件读回来,它不能直接丢弃只能 swap。一般用户层应用程序 new malloc brk 或者 mmap null 来的内存 page fault 映射的物理内存都是匿名页
    coderqbc
        10
    coderqbc  
    OP
       2019-10-17 19:11:54 +08:00
    @AmrtaShiva swap 应该是物理内存不足时才占用吧
    coderqbc
        11
    coderqbc  
    OP
       2019-10-17 19:25:00 +08:00
    @love 有时候往 /tmp 目录(挂载到内存)里写文件,占用的是内存 cached,删除写入的文件之后好像不会立即释放 cached
    coderqbc
        12
    coderqbc  
    OP
       2019-10-17 19:29:07 +08:00
    @fuzhuo233 往 /tmp 目录(挂载到内存)里写文件,关闭并删除写入的文件之后会不会立即释放该文件占用的 cached?
    coderqbc
        13
    coderqbc  
    OP
       2019-10-17 19:30:43 +08:00
    @hkitdog 内存不足时那咋办?
    love
        14
    love  
       2019-10-17 21:29:38 +08:00
    @coderqbc 那我没玩过内存文件系统,可能人家设计上就是文件系统可以增大不能自动收缩的
    pedia0992
        15
    pedia0992  
       2019-10-17 22:56:50 +08:00
    1. Linux 系统会自动释放 cache 的内存, 再加上现在默认 OOM 机制, 内存管理这块基本无需人工干预.
    2. 除了你自己想清空 Page Cache, 否则无需执行`echo 3 > ....`.
    starsriver
        16
    starsriver  
       2019-10-18 00:05:03 +08:00 via Android
    自动管理机,给你省时还不愿意?
    Nitroethane
        17
    Nitroethane  
       2019-10-18 06:40:30 +08:00 via Android   ❤️ 1
    @coderqbc 不一定在物理内存不足的时候才用 swap,只要有不活跃的内存,内核都会换出去。
    /tmp 就是实现为内存文件系统,占用的是 cache,写入的文件删除后对应的内存即成为空闲内存可被回收,即使空闲内存大小不会立即显示出来。会不会被立即释放看内核,不过无所谓了,因为已经被标记成空闲。
    coderqbc
        18
    coderqbc  
    OP
       2019-10-18 10:01:17 +08:00 via iPhone
    @pedia0992
    @Nitroethane
    感谢解惑,看来需要系统学习一下内存管理机制扫盲🤣
    Srar
        19
    Srar  
       2019-10-18 10:18:20 +08:00
    @coderqbc 关于 swap 的话 可以查下内核参数 vm.swappiness
    coderqbc
        20
    coderqbc  
    OP
       2019-10-18 15:50:48 +08:00 via iPhone
    @Srar 好的,和内存管理一起学习下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1018 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:15 · PVG 03:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.