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

2021-12-24 15:47:47 +08:00
 suqingbin

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

3904 次点击
所在节点    Linux
22 条回复
kkadmin
2021-12-24 15:49:45 +08:00
遇到了同样问题,大数据 boy 吗?
snuglove
2021-12-24 16:04:10 +08:00
主要还是看磁盘性能;
可以验证是不是不管内存够不够,都高还是怎么样.
eason1874
2021-12-24 16:04:16 +08:00
我的理解是:会

内存的作用之一就是共享文件内容,物理内存放不下,虚拟内存又没有,那还怎么共享,不得每次都读硬盘啊
documentzhangx66
2021-12-24 16:47:00 +08:00
分情况。

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

但如果是程序自己进行内存管理的,那得看程序是怎么设计的了。
suqingbin
2021-12-24 16:58:55 +08:00
@kkadmin 不是大数据
liaohongxing
2021-12-24 17:23:04 +08:00
linux 有个 swap 分区, swap 就是一个文件,在磁盘上, 内存不够会溢出到 swap , 溢出 这个过程就是写磁盘 。会导致磁盘 IO 高,有了 swap 程序不会立即崩溃 ,只是会响应慢。

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

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

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

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

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

最终恶性循环造成磁盘 IO 占用高,CPU 占用表现为%iowait 占用过高。
Nitroethane
2021-12-24 20:29:01 +08:00
@kxuanobj #10 不止 readonly 的啊,只要是有 ”backing file“的 writable 内存页都可以被交换到 swap 里。这不就是经典的“脏页”么
cev2
2021-12-24 20:33:47 +08:00
@liaohongxing 6# “linux 跟 windows 不一样,有多少内存吃多少。”Windows 一样
msg7086
2021-12-25 06:08:44 +08:00
@cev2 那位老哥说不定生活在二十年前。
aheadlead
2021-12-25 09:00:27 +08:00
@liaohongxing 句柄在 linux 下是什么意思
Nitroethane
2021-12-25 09:53:45 +08:00
@aheadlead 文件描述符吧。Linux 应该不缓存这玩意吧,只有一 buffer cache 和一 file cache 。不过据说新内核把两者统一了。再吐槽一下垃圾翻译,谁 tm 翻译的文件句柄
aheadlead
2021-12-25 10:19:52 +08:00
@Nitroethane #15 不过 linux 有 dentry cache 之类的东西。另外 buffer 和 page cache 已经统一了十几年了…
tkl
2021-12-25 11:27:30 +08:00
kxuanobj
2021-12-25 13:24:15 +08:00
@Nitroethane 这是没有 swap 的情况。有 swap 的情况下,部分页面会与 swap 建立 backing file 关系。建立好关系之后,会一样处理。
NeoZephyr
2021-12-25 16:44:06 +08:00
@liaohongxing 可以把 swap 设置为 1 ,这样能达到监控效果,同时程序不会 crash 掉
sorrowfulliu
2021-12-25 23:21:06 +08:00
内存压力大时,kswapd0 会回收 page cache 中的一些脏页,这个过程应该会根据脏页水位在系统不太忙时异步去做,一般不会造成 IO 高的问题。如果 IO 高了,情况可能很复杂,感觉挺难分析的。

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

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

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

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

© 2021 V2EX