JAVA进程诡异消失,oom killer干的

来源:互联网 发布:芭比娃娃淘宝 编辑:程序博客网 时间:2024/05/22 17:29

在beta环境中,俩个项目经常性的崩溃。PS查看进程,JAVA进程消失。

先加Dump、ErrorFile查看,再次发生时,俩个日志均未输出。

尝试复现,有时发生,有时正常,很不规律。

在这过程中,top查看java进程,发现发生时,JAVA的内存会从50%一直飙升到95%,然后JAVA进程就消失了。

查看linux日志,/var/log/message 发现这么一段日志。


Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: master invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: master cpuset=/ mems_allowed=0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Pid: 1287, comm: master Not tainted 2.6.32-358.23.2.el6.x86_64 #1Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: active_anon:338189 inactive_anon:123825 isolated_anon:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: active_file:4595 inactive_file:15377 isolated_file:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: unevictable:0 dirty:16077 writeback:0 unstable:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: free:13246 slab_reclaimable:2669 slab_unreclaimable:6168Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: mapped:3376 shmem:0 pagetables:1888 bounce:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA free:8316kB min:332kB low:412kB high:496kB active_anon:748kB inactive_anon:6672kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15348kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:4kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:32 all_unreclaimable? noMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: lowmem_reserve[]: 0 2004 2004 2004Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA32 free:44668kB min:44720kB low:55900kB high:67080kB active_anon:1352008kB inactive_anon:488628kB active_file:18380kB inactive_file:61508kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:2052308kB mlocked:0kB dirty:64308kB writeback:0kB mapped:13504kB shmem:0kB slab_reclaimable:10672kB slab_unreclaimable:24672kB kernel_stack:3352kB pagetables:7552kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:1559392 all_unreclaimable? noMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: lowmem_reserve[]: 0 0 0 0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA: 3*4kB 2*8kB 2*16kB 2*32kB 12*64kB 6*128kB 8*256kB 1*512kB 2*1024kB 1*2048kB 0*4096kB = 8316kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA32: 813*4kB 465*8kB 308*16kB 216*32kB 132*64kB 52*128kB 12*256kB 11*512kB 2*1024kB 0*2048kB 0*4096kB = 44668kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 34657 total pagecache pagesMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 14553 pages in swap cacheMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Swap cache stats: add 659065, delete 644512, find 159998/176201Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Free swap  = 4091960kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Total swap = 4194296kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 524284 pages RAMMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 10683 pages reservedMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 22147 pages sharedMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 475274 pages non-sharedMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Out of memory: Kill process 6728 (java) score 286 or sacrifice childMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Killed process 6728, UID 40001, (java) total-vm:5041844kB, anon-rss:1773172kB, file-rss:11236kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: rsyslogd invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: rsyslogd cpuset=/ mems_allowed=0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Pid: 1158, comm: rsyslogd Not tainted 2.6.32-358.23.2.el6.x86_64 #1Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: active_anon:338189 inactive_anon:123825 isolated_anon:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: active_file:4595 inactive_file:15407 isolated_file:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: unevictable:0 dirty:16077 writeback:0 unstable:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: free:13246 slab_reclaimable:2669 slab_unreclaimable:6168Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: mapped:3376 shmem:0 pagetables:1888 bounce:0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA free:8316kB min:332kB low:412kB high:496kB active_anon:748kB inactive_anon:6672kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15348kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:4kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:32 all_unreclaimable? noMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: lowmem_reserve[]: 0 2004 2004 2004Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA32 free:44668kB min:44720kB low:55900kB high:67080kB active_anon:1352008kB inactive_anon:488628kB active_file:18380kB inactive_file:61504kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:2052308kB mlocked:0kB dirty:64308kB writeback:0kB mapped:13504kB shmem:0kB slab_reclaimable:10672kB slab_unreclaimable:24672kB kernel_stack:3352kB pagetables:7552kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:2114272 all_unreclaimable? noMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: lowmem_reserve[]: 0 0 0 0Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA: 3*4kB 2*8kB 2*16kB 2*32kB 12*64kB 6*128kB 8*256kB 1*512kB 2*1024kB 1*2048kB 0*4096kB = 8316kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Node 0 DMA32: 813*4kB 465*8kB 308*16kB 216*32kB 132*64kB 52*128kB 12*256kB 11*512kB 2*1024kB 0*2048kB 0*4096kB = 44668kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 34657 total pagecache pagesMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 14553 pages in swap cacheMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Swap cache stats: add 659065, delete 644512, find 159998/176201Mar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Free swap  = 4091960kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: Total swap = 4194296kBMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 524284 pages RAMMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 10683 pages reservedMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 22179 pages sharedMar 21 10:53:33 l-noahs687ktdv1.auto.beta.cn0 kernel: 475274 pages non-shared

这里我们可以看到,JAVA进程的确是被LINUX的oom killer干掉了。
oom killer是linux系统的一个保护进程,当linux系统所剩的内存空间不足以满足系统正常运行时,会触发。
oomkiller执行时,会找出系统所有线程的score值最高的那个pid,然后干掉。
这个score的值影响因素有很多,内存占用大小、运行时间、权重等。权重越高,分值越高,运行时间越短,分值越高,内存越大,分值越高。
我们这个JAVA进程,在第一次运行时,会加载某些内容到内存。所以系统运行时间短,内存占比高,权重值可以查看/proc/<pid>/oom_score_adj,目前为0,所以分值最高了。
killer就把JAVA干掉了。当前的分值可以查看/proc/<pid>/oom_score查看。
但是查看日志可以发现,系统仍然有大量的swap交换空间没有使用,为什么就直接触发oom了呢?
查看/proc/sys/vm/swapiness值为0。说明系统倾向于使用物理内存。但这个值是有倾向性的,并不是配置了0就不使用swap。
查资料发现在linux2.6.32-303.el6之后,这个含义就被干掉了。
This patch changes the behavior with swappiness==0.  If we set
swappiness==0, the kernel does not swap out completely (for global reclaim
until the amount of free pages and filebacked pages in a zone has been
reduced to something very very small (nr_free + nr_filebacked < high
watermark)).
就像这个patch写的,这个patch修改了swappiness=0的行为,如果你设置swappiness=0,那么只有在(nr_free + nr_filebacked < high watermark)才会交换内存,也就是说空闲内存和文件缓存基本没有了才会触发内存swap。
这样的话,副作用在于:内存如果不够了,Linux有可能触发OOM,从而kill掉耗费内存最多的JAVA进程。
现在明白了。那解决方法也就出来了。
1、调整JVM 最大内存,小于系统最大物理内存。(我是这么干的。之前的情况是系统是2G,最大内存配成2G出现问题。改成1G)。
2、新内核,设置vm.swappiness=1
3、关闭oomkiller。
4、降低进程oom_score_adj的权重。可以为负数-1000 ~ 1000。oom_adj是老的,即使更改了,内核算法也是正对oom_score_adj计算的。




原创粉丝点击