有关OOM killer和磁盘缓存的问题

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
wtz
帖子: 39
注册时间: 2015-06-27 23:08
系统: Ubuntu Kylin 16.04

Re: 有关OOM killer和磁盘缓存的问题

#16

帖子 wtz » 2016-04-03 16:14

科学之子 写了:说实话,我非常不理解为何在无swap的情况下OOM速度会慢,是不是根本就没有发生OOM?
系统卡只是因为桌面环境的相关组件IO负荷过高,磁盘缓存又太小
个人推测是OOM执行不利(已经没有资源进行kill操作了)。
我今天又在台式机上做了实验,4G内存+7200rpm硬盘,结果打开大文件的时候仍然卡死,并且设置swappiness=100和1G zram也没有效果(无法自行kill进程)。
科学之子 写了:还有,推荐个shell脚本给楼主参考:viewtopic.php?f=21&t=476869
最好设置多个zram作为交换设备,数量与CPU(核心)数量相同.
这样有利于发挥多核的并行优势.
谢谢。目前只把zram的streams参数设为2,不知道和多个zram效果是否相同。
科学之子 写了:sudo -i
echo 1>/proc/sys/vm/laptop_mode
以上简单方法试试看,可以这个本来是给笔记本用的,原理是减少硬盘访问来提高电池的续航能力.
不知道这个是否会减少硬盘IO从而提高响应速度.
这个参数我也看过。但是按文档中所说的,参数的功能是延长dirty page的写入时间,这个在OOM的时候似乎没有作用,并且会增加意外断电时数据丢失的风险。
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#17

帖子 科学之子 » 2016-04-03 19:06

rosynirvana 写了:
科学之子 写了: Windows也有OOM了?
根据我的常识如果不开swap,不应该卡,最多只是OOM
卡的话,很可能就是文件缓存空间太低,硬盘速度又太慢
这真的只是你的猜测了
没有swap分区或文件很容易被kswapd0卡死的,google有个搜索提示是"kswapd0 cpu 100"
那有什么办法禁用这个kswapd0吗?
明明已经不需要交换了,为什么kswapd0还会卡死?
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#18

帖子 科学之子 » 2016-04-03 19:09

wtz 写了:
科学之子 写了:说实话,我非常不理解为何在无swap的情况下OOM速度会慢,是不是根本就没有发生OOM?
系统卡只是因为桌面环境的相关组件IO负荷过高,磁盘缓存又太小
个人推测是OOM执行不利(已经没有资源进行kill操作了)。
我今天又在台式机上做了实验,4G内存+7200rpm硬盘,结果打开大文件的时候仍然卡死,并且设置swappiness=100和1G zram也没有效果(无法自行kill进程)。
科学之子 写了:还有,推荐个shell脚本给楼主参考:viewtopic.php?f=21&t=476869
最好设置多个zram作为交换设备,数量与CPU(核心)数量相同.
这样有利于发挥多核的并行优势.
谢谢。目前只把zram的streams参数设为2,不知道和多个zram效果是否相同。
科学之子 写了:sudo -i
echo 1>/proc/sys/vm/laptop_mode
以上简单方法试试看,可以这个本来是给笔记本用的,原理是减少硬盘访问来提高电池的续航能力.
不知道这个是否会减少硬盘IO从而提高响应速度.
这个参数我也看过。但是按文档中所说的,参数的功能是延长dirty page的写入时间,这个在OOM的时候似乎没有作用,并且会增加意外断电时数据丢失的风险。
谢谢。目前只把zram的streams参数设为2,不知道和多个zram效果是否相同。
http://kernel.taobao.org/index.php?titl ... %A52013-04
因为单个交换设备的操作是有严格并发限制的
貌似交换设备是一类特殊的设备,单个交换设备是没法并行swap out/in的.
所以还是设置多个交换设备吧,当然我仅仅是猜测.
上次由 科学之子 在 2016-04-03 19:48,总共编辑 1 次。
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#19

帖子 科学之子 » 2016-04-03 19:25

感谢15楼提醒
楼主试试:

代码: 全选

echo 3 > /proc/sys/vm/drop_caches
看还卡吗?
https://bbs.archlinux.org/viewtopic.php ... 1#p1589231
难道kswapd0还负责缓存回收?
Sun Apr 3 19:31:28 CST 2016补充:
http://www.science.unitn.it/~fiorella/g ... ode39.html
看来是真的,只要有页缓存,kswapd0就会很忙.
等我方便时试试这个方法是否管用,也欢迎楼主尝试反馈,谢谢.
上次由 科学之子 在 2016-04-03 20:18,总共编辑 1 次。
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#20

帖子 科学之子 » 2016-04-03 20:14

我今天又在台式机上做了实验,4G内存+7200rpm硬盘,结果打开大文件的时候仍然卡死,并且设置swappiness=100和1G zram也没有效果(无法自行kill进程)。
运行top命令看是否是有kswapd开头的项目排在第一.
确定是否是因为页面回收导致卡死
wtz
帖子: 39
注册时间: 2015-06-27 23:08
系统: Ubuntu Kylin 16.04

Re: 有关OOM killer和磁盘缓存的问题

#21

帖子 wtz » 2016-04-03 21:39

科学之子 写了:感谢15楼提醒
楼主试试:

代码: 全选

echo 3 > /proc/sys/vm/drop_caches
看还卡吗?
https://bbs.archlinux.org/viewtopic.php ... 1#p1589231
难道kswapd0还负责缓存回收?
Sun Apr 3 19:31:28 CST 2016补充:
http://www.science.unitn.it/~fiorella/g ... ode39.html
看来是真的,只要有页缓存,kswapd0就会很忙.
等我方便时试试这个方法是否管用,也欢迎楼主尝试反馈,谢谢.
仍然卡。

用htop看了一下,发现OOM时I/O Rate排在前面的几个进程是kded、systemd-journald、Xorg、kwin_x11,以及内存超额的进程(kwrite)。没有发现kswapd0有什么异常。
科学之子 写了:貌似交换设备是一类特殊的设备,单个交换设备是没法并行swap out/in的.
所以还是设置多个交换设备吧,当然我仅仅是猜测.
分别设了1~4个zram,每个大小300M,OOM所需时间分别为:
1×300M:2min;
2×300M:3min;
3×300M:4min;
4×300M:5min。
看来zram也不是越多越好。
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#22

帖子 科学之子 » 2016-04-03 22:17

wtz 写了:
科学之子 写了:感谢15楼提醒
楼主试试:

代码: 全选

echo 3 > /proc/sys/vm/drop_caches
看还卡吗?
https://bbs.archlinux.org/viewtopic.php ... 1#p1589231
难道kswapd0还负责缓存回收?
Sun Apr 3 19:31:28 CST 2016补充:
http://www.science.unitn.it/~fiorella/g ... ode39.html
看来是真的,只要有页缓存,kswapd0就会很忙.
等我方便时试试这个方法是否管用,也欢迎楼主尝试反馈,谢谢.
仍然卡。

用htop看了一下,发现OOM时I/O Rate排在前面的几个进程是kded、systemd-journald、Xorg、kwin_x11,以及内存超额的进程(kwrite)。没有发现kswapd0有什么异常。
科学之子 写了:貌似交换设备是一类特殊的设备,单个交换设备是没法并行swap out/in的.
所以还是设置多个交换设备吧,当然我仅仅是猜测.
分别设了1~4个zram,每个大小300M,OOM所需时间分别为:
1×300M:2min;
2×300M:3min;
3×300M:4min;
4×300M:5min。
看来zram也不是越多越好。
测试程序:

代码: 全选

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <limits.h>
#include <sys/file.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
//time_t current_time=time(NULL);
int
main (void)
{
	unsigned i=0;
	for(;i<1500;i++)
	{
		memset(malloc(1024*1024),'a',1024*1024);
	}
	getchar();
  return 0;
}
我这里卡时有ksoftirqd开头的进程,难道是内核软中断导致的卡慢?
viewtopic.php?p=3159568#p3159568
奇怪,我这里并非OOM ,而是"Segmentation fault"
但在另一个Debian系统提示killer什么的.
难道是我现在用的系统是i368的缘故?哪个提示killer的是amd64版系统.
卡慢时kswapd也经常排在第一,但奇怪的是CPU占用并没有显著提高,好像更像是中断机制出的问题.
看来zram也不是越多越好。
应该是总大小不变的情况下分割并行
4X3=1200,和300当然不一样.
rosynirvana
帖子: 893
注册时间: 2011-02-14 17:46

Re: 有关OOM killer和磁盘缓存的问题

#23

帖子 rosynirvana » 2016-04-04 1:59

科学之子 写了:

代码: 全选

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <limits.h>
#include <sys/file.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
//time_t current_time=time(NULL);
int
main (void)
{
	unsigned i=0;
	for(;i<1500;i++)
	{
		memset(malloc(1024*1024),'a',1024*1024);
	}
	getchar();
  return 0;
}
您忘了检查内存分配有没有成功
rosynirvana
帖子: 893
注册时间: 2011-02-14 17:46

Re: 有关OOM killer和磁盘缓存的问题

#24

帖子 rosynirvana » 2016-04-04 2:18

1. 1.5GB用kde+当前linux desktop,内存不够用,这点我在之前说过了;
2. 4GB是够用的,但是一定记得设置swap,不然就有可能被kswapd0 100% CPU卡得一动不动 ,而且这个问题在这一年的ubuntu 14.04 LTS上很容易重现;
3. 4GB RAM + 4GB swap不需要zram,如果这时候再遇到OoM,很可能是软件设计或者实现的问题了,我这两年只碰到一次,是firefox-plugin内存泄漏造成的;
4. OoM很慢其实一点都不奇怪,oomkiller要终止一个进程,选择这个进程要慎重,要计算很多参数,而且正常情况下OoM不会被触发,所以耗时长在设计上来看没什么
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#25

帖子 科学之子 » 2016-04-04 2:30

感谢23楼提示
测试代码更改如下:

代码: 全选

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <limits.h>
#include <sys/file.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
//time_t current_time=time(NULL);
int
main (void)
{
	unsigned i=0;
	void *tp=NULL;
	for(i=0;;i++)
	{
		tp=malloc(1024*1024);
		if(tp)
		{
		memset(tp,'a',1024*1024);
	}
	}
	getchar();
  return 0;
}
我稍后重启到64位的debian再测试一下...
当初记得测试zram压缩效果的时候用了类似代码,几秒钟就被kill了
这次居然是分配失败而非kill,难道内核参数默认不一样?
测试中...
rosynirvana
帖子: 893
注册时间: 2011-02-14 17:46

Re: 有关OOM killer和磁盘缓存的问题

#26

帖子 rosynirvana » 2016-04-04 2:39

另外还有些可能需要说明的,在linux中无法真正禁用swapping,无论你有没有swap 文件 or 分区(这说法有点奇怪,用英文是swapping partition / paging file)
比如,ram中有几页是某个文件,这几页好久没用了,内核决定把这几页从ram中移出去,那么内核要把这几页拷贝到swapping partition / paging file中去吗?不用,既然是文件,需要的时候从原始位置读就行了。所以说没有swapping partition / paging file并不是禁用了swapping, 只是让swapping的选择更少。

另外和这个相关的内核设置是vm.overcommit_memory,可以改这个参数让内存分配直接失败,而不让系统去做多余的事情,但是1.5GB不够,所以并不推荐去改。
wtz
帖子: 39
注册时间: 2015-06-27 23:08
系统: Ubuntu Kylin 16.04

Re: 有关OOM killer和磁盘缓存的问题

#27

帖子 wtz » 2016-04-04 22:56

科学之子 写了:感谢23楼提示
测试代码更改如下:

代码: 全选

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <limits.h>
#include <sys/file.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
//time_t current_time=time(NULL);
int
main (void)
{
	unsigned i=0;
	void *tp=NULL;
	for(i=0;;i++)
	{
		tp=malloc(1024*1024);
		if(tp)
		{
		memset(tp,'a',1024*1024);
	}
	}
	getchar();
  return 0;
}
这个程序倒是能很快被kill,退出状态是137。
可能主要还是I/O的问题。

另外,改用4×96M zram,效果确实比1×384M zram好。
wtz
帖子: 39
注册时间: 2015-06-27 23:08
系统: Ubuntu Kylin 16.04

Re: 有关OOM killer和磁盘缓存的问题

#28

帖子 wtz » 2016-04-04 23:02

rosynirvana 写了:另外还有些可能需要说明的,在linux中无法真正禁用swapping,无论你有没有swap 文件 or 分区(这说法有点奇怪,用英文是swapping partition / paging file)
比如,ram中有几页是某个文件,这几页好久没用了,内核决定把这几页从ram中移出去,那么内核要把这几页拷贝到swapping partition / paging file中去吗?不用,既然是文件,需要的时候从原始位置读就行了。所以说没有swapping partition / paging file并不是禁用了swapping, 只是让swapping的选择更少。

另外和这个相关的内核设置是vm.overcommit_memory,可以改这个参数让内存分配直接失败,而不让系统去做多余的事情,但是1.5GB不够,所以并不推荐去改。
谢谢。这里的“交换”包括了狭义上的交换分区(可被禁用)和广义上的换页(无法被禁用),不知道这样理解是否正确?

vm.overcommit_memory改成2以后,只要虚拟内存超额就会被立刻kill。但是我想,为什么内核不能根据实际驻留在物理内存中的数据来判断要结束的进程呢?看来Linux用户还是倾向于从技术角度而不是用户体验角度来考虑问题。
rosynirvana
帖子: 893
注册时间: 2011-02-14 17:46

Re: 有关OOM killer和磁盘缓存的问题

#29

帖子 rosynirvana » 2016-04-05 1:22

wtz 写了:
rosynirvana 写了:另外还有些可能需要说明的,在linux中无法真正禁用swapping,无论你有没有swap 文件 or 分区(这说法有点奇怪,用英文是swapping partition / paging file)
比如,ram中有几页是某个文件,这几页好久没用了,内核决定把这几页从ram中移出去,那么内核要把这几页拷贝到swapping partition / paging file中去吗?不用,既然是文件,需要的时候从原始位置读就行了。所以说没有swapping partition / paging file并不是禁用了swapping, 只是让swapping的选择更少。

另外和这个相关的内核设置是vm.overcommit_memory,可以改这个参数让内存分配直接失败,而不让系统去做多余的事情,但是1.5GB不够,所以并不推荐去改。
谢谢。这里的“交换”包括了狭义上的交换分区(可被禁用)和广义上的换页(无法被禁用),不知道这样理解是否正确?

vm.overcommit_memory改成2以后,只要虚拟内存超额就会被立刻kill。但是我想,为什么内核不能根据实际驻留在物理内存中的数据来判断要结束的进程呢?看来Linux用户还是倾向于从技术角度而不是用户体验角度来考虑问题。
在我看来没有狭义和广义,用英文来讲非常明确,交换分区是swapping partition,而非swap

我不大明白您想让内核做什么,直接kill内存占用最大(对于用户空间中的进程,RAM和swap device是一回事,只考虑RAM中就是严重的设计错误了)的进程?这当然是非常不负责的,不考虑内存泄露,占内存最大的进程就是在做主要工作的进程,可能是一个跑了十几天的科学计算,可能是一个跑了一个月的服务器,kill掉前者就是十几天的成果没了,kill掉后者站点就要下线直到管理员发现。

我认为您应该专注于自己的例子,用kwriter打开多大的文件?例如内存剩下100M,但是要打开一个200M的文件,那要看kwriter软件本身的设计,是不是需要把数据全放进内存中去,如果需要全放进去,那恐怕是很难正常工作的。另外为什么会希望系统kill掉正在工作的kwriter,之前未保存的更改不是全丢失了吗……
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: 有关OOM killer和磁盘缓存的问题

#30

帖子 科学之子 » 2016-04-06 3:52

rosynirvana 写了:另外还有些可能需要说明的,在linux中无法真正禁用swapping,无论你有没有swap 文件 or 分区(这说法有点奇怪,用英文是swapping partition / paging file)
比如,ram中有几页是某个文件,这几页好久没用了,内核决定把这几页从ram中移出去,那么内核要把这几页拷贝到swapping partition / paging file中去吗?不用,既然是文件,需要的时候从原始位置读就行了。所以说没有swapping partition / paging file并不是禁用了swapping, 只是让swapping的选择更少。

另外和这个相关的内核设置是vm.overcommit_memory,可以改这个参数让内存分配直接失败,而不让系统去做多余的事情,但是1.5GB不够,所以并不推荐去改。
对比了两个版本的vm目录的MD5:

代码: 全选

# diff ./debian_i386 ./debian_amd64
10c10
< 6d7fce9fee471194aa8b5b6e47267f03  drop_caches
---
> 897316929176464ebc9ad085f31e7284  drop_caches
12c12
< 897316929176464ebc9ad085f31e7284  highmem_is_dirtyable
---
> md5sum: highmem_is_dirtyable: No such file or directory
17c17
< dc69419175a96c3aec8205f820e400a6  lowmem_reserve_ratio
---
> 6c58f92b46a30109274592345ab890ed  lowmem_reserve_ratio
21c21
< cc8550da5ed76359008d40d7d3375f83  min_free_kbytes
---
> fea24a3d238dbfa7651e62e3dbbdf3ac  min_free_kbytes
34c34
< 897316929176464ebc9ad085f31e7284  scan_unevictable_pages
---
> md5sum: scan_unevictable_pages: No such file or directory
36,38c36,38
< 919d117956d3135c4c683ff021352f5c  swappiness
< ffae1cf26caffbe2169096820d657fdc  user_reserve_kbytes
< b026324c6904b2a9cb4b88d6d61c81d1  vdso_enabled
---
> ecf27a776cdfc771defab1c5d19de9ab  swappiness
> eaa7f958ffdb4dccda19aa55ac2585c5  user_reserve_kbytes
> md5sum: vdso_enabled: No such file or directory
好像没什么影响OOM的设置...
我是先获取i386版的vm目录文件列表,然后用这个列表分别在两个系统的vm目录执行md5sum
没发现有什么异常的不同
还有一个可能很重要?的不同就是发生kill的是4.x内核
没发生kill的是3.x内核
(困了,具体版本懒得纠结了)
难道连OOM机制都调整了?
回复