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

Linux 内存不够会导致磁盘 io 高吗?

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

    麻烦请教大家一个问题,有台机器,没有使用 swap ,但是内存不够用了,,cached 有点高,导致磁盘 io 读会高,,我理解 cached 是读缓存,如果不够了,就需要不断从内存换出到磁盘,导致磁盘 io 高,这也理解对吗?

    22 条回复    2021-12-27 10:36:22 +08:00
    kkadmin
        1
    kkadmin  
       190 天前
    遇到了同样问题,大数据 boy 吗?
    snuglove
        2
    snuglove  
       190 天前
    主要还是看磁盘性能;
    可以验证是不是不管内存够不够,都高还是怎么样.
    eason1874
        3
    eason1874  
       190 天前
    我的理解是:会

    内存的作用之一就是共享文件内容,物理内存放不下,虚拟内存又没有,那还怎么共享,不得每次都读硬盘啊
    documentzhangx66
        4
    documentzhangx66  
       190 天前
    分情况。

    大多数由系统进行内存管理的,无论 Linux 还是 Win 的 app ,都会。

    但如果是程序自己进行内存管理的,那得看程序是怎么设计的了。
    suqingbin
        5
    suqingbin  
    OP
       190 天前
    @kkadmin 不是大数据
    liaohongxing
        6
    liaohongxing  
       190 天前
    linux 有个 swap 分区, swap 就是一个文件,在磁盘上, 内存不够会溢出到 swap , 溢出 这个过程就是写磁盘 。会导致磁盘 IO 高,有了 swap 程序不会立即崩溃 ,只是会响应慢。

    反之 ,关掉 swap ,就不会写磁盘 。IO 不会高,其中内存不够程序直接崩溃,崩溃后继续被守护拉起,继续循环崩溃,如果时间间隔过短,频繁开启进程会导致 CPU 高。

    linux 跟 windows 不一样,有多少内存吃多少。会用空闲的内存缓存文件句柄,常访问的文件等等,那个 cache 就是缓存的句柄,文件,关掉 swap 情况下,是在内存中,这个缓存跟磁盘 IO 影响比较小,读一次就被缓存了。
    suqingbin
        7
    suqingbin  
    OP
       190 天前
    @liaohongxing 也就是内存不足就会 oom kill 掉程序。磁盘读 io 高可能是有程序在读文件。
    dbow
        8
    dbow  
       190 天前
    禁了 swap 就不会,内存用光直接 OOM 杀死程序
    yidinghe
        9
    yidinghe  
       190 天前
    这个 IO 应该是进程自身要读写文件产生的,与操作系统无关。虽说要读的文件不在 cache 中就产生磁盘 IO ,但在我看来这属于是从一个优化场景降级为正常场景。
    kxuanobj
        10
    kxuanobj  
       190 天前   ❤️ 1
    你分析是对的。
    比如 进程 elf 本身、加载的.so 共享库,它们的代码段等内容在内存中 是“有 backing file 的内存页”,并且它都是 readonly 的。

    当内存不足时,Linux 内核会直接从 page cache 中扔掉这类页面。因为可以加载回来,并且由于是 read only 内存页,它与外部存储器上的内容是等价的。抛弃这些页面并不会造成数据上出现问题。

    然而,当近程被调度,执行代码时执行到了这块被扔掉的代码,Linux 内核没有办法,只能阻塞进程(表现为进程状态为 D ),然后从外部存储中把这些数据再加载回来。

    再加载回来时,也需要内存页,那就需要把其它进程的某些内存页扔掉。而其它进程被调度到时,又要继续循环,扔掉一些内存页。

    最终恶性循环造成磁盘 IO 占用高,CPU 占用表现为%iowait 占用过高。
    Nitroethane
        11
    Nitroethane  
       190 天前
    @kxuanobj #10 不止 readonly 的啊,只要是有 ”backing file“的 writable 内存页都可以被交换到 swap 里。这不就是经典的“脏页”么
    cev2
        12
    cev2  
       190 天前
    @liaohongxing 6# “linux 跟 windows 不一样,有多少内存吃多少。”Windows 一样
    msg7086
        13
    msg7086  
       190 天前
    @cev2 那位老哥说不定生活在二十年前。
    aheadlead
        14
    aheadlead  
       190 天前 via iPhone
    @liaohongxing 句柄在 linux 下是什么意思
    Nitroethane
        15
    Nitroethane  
       190 天前 via iPhone
    @aheadlead 文件描述符吧。Linux 应该不缓存这玩意吧,只有一 buffer cache 和一 file cache 。不过据说新内核把两者统一了。再吐槽一下垃圾翻译,谁 tm 翻译的文件句柄
    aheadlead
        16
    aheadlead  
       190 天前
    @Nitroethane #15 不过 linux 有 dentry cache 之类的东西。另外 buffer 和 page cache 已经统一了十几年了…
    kxuanobj
        18
    kxuanobj  
       189 天前
    @Nitroethane 这是没有 swap 的情况。有 swap 的情况下,部分页面会与 swap 建立 backing file 关系。建立好关系之后,会一样处理。
    NeoZephyr
        19
    NeoZephyr  
       189 天前
    @liaohongxing 可以把 swap 设置为 1 ,这样能达到监控效果,同时程序不会 crash 掉
    sorrowfulliu
        20
    sorrowfulliu  
       189 天前
    内存压力大时,kswapd0 会回收 page cache 中的一些脏页,这个过程应该会根据脏页水位在系统不太忙时异步去做,一般不会造成 IO 高的问题。如果 IO 高了,情况可能很复杂,感觉挺难分析的。
    leimao
        21
    leimao  
       189 天前
    内存不够,在有 GUI 的情况下就直接“死机”了。
    chtcrack
        22
    chtcrack  
       188 天前
    内存不够,如果没虚拟内存机制,那么进程将会直接崩溃被杀死.
    所以你希望是进程直接消失还是磁盘 io 高点进程继续活着好呢?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2492 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:09 · PVG 13:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.