
麻烦请教大家一个问题,有台机器,没有使用 swap ,但是内存不够用了,,cached 有点高,导致磁盘 io 读会高,,我理解 cached 是读缓存,如果不够了,就需要不断从内存换出到磁盘,导致磁盘 io 高,这也理解对吗?
1 kkadmin 2021-12-24 15:49:45 +08:00 遇到了同样问题,大数据 boy 吗? |
2 snuglove 2021-12-24 16:04:10 +08:00 主要还是看磁盘性能; 可以验证是不是不管内存够不够,都高还是怎么样. |
3 eason1874 2021-12-24 16:04:16 +08:00 我的理解是:会 内存的作用之一就是共享文件内容,物理内存放不下,虚拟内存又没有,那还怎么共享,不得每次都读硬盘啊 |
4 documentzhangx66 2021-12-24 16:47:00 +08:00 分情况。 大多数由系统进行内存管理的,无论 Linux 还是 Win 的 app ,都会。 但如果是程序自己进行内存管理的,那得看程序是怎么设计的了。 |
6 liaohongxing 2021-12-24 17:23:04 +08:00 linux 有个 swap 分区, swap 就是一个文件,在磁盘上, 内存不够会溢出到 swap , 溢出 这个过程就是写磁盘 。会导致磁盘 IO 高,有了 swap 程序不会立即崩溃 ,只是会响应慢。 反之 ,关掉 swap ,就不会写磁盘 。IO 不会高,其中内存不够程序直接崩溃,崩溃后继续被守护拉起,继续循环崩溃,如果时间间隔过短,频繁开启进程会导致 CPU 高。 linux 跟 windows 不一样,有多少内存吃多少。会用空闲的内存缓存文件句柄,常访问的文件等等,那个 cache 就是缓存的句柄,文件,关掉 swap 情况下,是在内存中,这个缓存跟磁盘 IO 影响比较小,读一次就被缓存了。 |
7 suqingbin OP @liaohongxing 也就是内存不足就会 oom kill 掉程序。磁盘读 io 高可能是有程序在读文件。 |
8 dbow 2021-12-24 17:46:52 +08:00 禁了 swap 就不会,内存用光直接 OOM 杀死程序 |
9 yidinghe 2021-12-24 17:55:16 +08:00 这个 IO 应该是进程自身要读写文件产生的,与操作系统无关。虽说要读的文件不在 cache 中就产生磁盘 IO ,但在我看来这属于是从一个优化场景降级为正常场景。 |
10 kxuanobj 2021-12-24 17:56:02 +08:00 你分析是对的。 比如 进程 elf 本身、加载的.so 共享库,它们的代码段等内容在内存中 是“有 backing file 的内存页”,并且它都是 readonly 的。 当内存不足时,Linux 内核会直接从 page cache 中扔掉这类页面。因为可以加载回来,并且由于是 read only 内存页,它与外部存储器上的内容是等价的。抛弃这些页面并不会造成数据上出现问题。 然而,当近程被调度,执行代码时执行到了这块被扔掉的代码,Linux 内核没有办法,只能阻塞进程(表现为进程状态为 D ),然后从外部存储中把这些数据再加载回来。 再加载回来时,也需要内存页,那就需要把其它进程的某些内存页扔掉。而其它进程被调度到时,又要继续循环,扔掉一些内存页。 最终恶性循环造成磁盘 IO 占用高,CPU 占用表现为%iowait 占用过高。 |
11 Nitroethane 2021-12-24 20:29:01 +08:00 @kxuanobj #10 不止 readonly 的啊,只要是有 ”backing file“的 writable 内存页都可以被交换到 swap 里。这不就是经典的“脏页”么 |
12 cev2 2021-12-24 20:33:47 +08:00 @liaohongxing 6# “linux 跟 windows 不一样,有多少内存吃多少。”Windows 一样 |
14 aheadlead 2021-12-25 09:00:27 +08:00 via iPhone @liaohongxing 句柄在 linux 下是什么意思 |
15 Nitroethane 2021-12-25 09:53:45 +08:00 via iPhone @aheadlead 文件描述符吧。Linux 应该不缓存这玩意吧,只有一 buffer cache 和一 file cache 。不过据说新内核把两者统一了。再吐槽一下垃圾翻译,谁 tm 翻译的文件句柄 |
16 aheadlead 2021-12-25 10:19:52 +08:00 @Nitroethane #15 不过 linux 有 dentry cache 之类的东西。另外 buffer 和 page cache 已经统一了十几年了… |
17 tkl 2021-12-25 11:27:30 +08:00 |
18 kxuanobj 2021-12-25 13:24:15 +08:00 @Nitroethane 这是没有 swap 的情况。有 swap 的情况下,部分页面会与 swap 建立 backing file 关系。建立好关系之后,会一样处理。 |
19 NeoZephyr 2021-12-25 16:44:06 +08:00 @liaohongxing 可以把 swap 设置为 1 ,这样能达到监控效果,同时程序不会 crash 掉 |
20 sorrowfulliu 2021-12-25 23:21:06 +08:00 内存压力大时,kswapd0 会回收 page cache 中的一些脏页,这个过程应该会根据脏页水位在系统不太忙时异步去做,一般不会造成 IO 高的问题。如果 IO 高了,情况可能很复杂,感觉挺难分析的。 |
21 leimao 2021-12-26 12:48:13 +08:00 内存不够,在有 GUI 的情况下就直接“死机”了。 |
22 chtcrack 2021-12-27 10:36:22 +08:00 内存不够,如果没虚拟内存机制,那么进程将会直接崩溃被杀死. 所以你希望是进程直接消失还是磁盘 io 高点进程继续活着好呢? |