小樱 发表于 2019/1/29 23:53

Linux下简单通过dmesg抓包搜索被系统内核因为物理内存不足杀死进程的日志记录

dmesg | grep 'killed process'


输出例如
Out of memory in UB 1090: OOM killed process 22746 (kangle) score 0 vm:964244kB, rss:462320kB, swap:146824kB
Out of memory in UB 1090: OOM killed process 30476 (kangle) score 0 vm:964244kB, rss:456916kB, swap:151772kB
Out of memory in UB 1090: OOM killed process 3588 (kangle) score 0 vm:833172kB, rss:467888kB, swap:141332kB
Out of memory in UB 1090: OOM killed process 587 (transmission-da) score 0 vm:322820kB, rss:6556kB, swap:9156kB
Out of memory in UB 1090: OOM killed process 16870 (kangle) score 0 vm:964248kB, rss:466188kB, swap:146176kB
Out of memory in UB 1090: OOM killed process 11381 (kangle) score 0 vm:964244kB, rss:449100kB, swap:148264kB
Out of memory in UB 1090: OOM killed process 10884 (CmsGoAgent.linu) score 0 vm:750004kB, rss:7852kB, swap:600kB
Out of memory in UB 1090: OOM killed process 9604 (cdnbest) score 0 vm:738160kB, rss:7072kB, swap:1124kB
Out of memory in UB 1090: OOM killed process 6111 (kangle) score 0 vm:954000kB, rss:461560kB, swap:148020kB


或者
dmesg | grep 'Out of memory'
Out of memory: Kill process 9986 (kangle) score 326 or sacrifice child


OOM killer可以永久关闭,临时生效(vm.overcommit_memory该选项测试无效,占用200M SWAP后还是会被杀死)
sysctl -w vm.overcommit_memory=2
永久关闭
echo 'vm.overcommit_memory=2' >> /etc/sysctl.conf
sysctl -p
使其永久生效

增加swap优先级,设置更大的swappiness值也可以做到缓解Out of memory: Kill process现象
https://bbs.itzmx.com/thread-94781-1-1.html

关闭OOM killer参考
https://www.percona.com/blog/2019/08/02/out-of-memory-killer-or-savior/

https://serverfault.com/questions/141988/avoid-linux-out-of-memory-application-teardown

https://www.kernel.org/doc/gorman/html/understand/understand016.html

可以使用以下设置控制 vm_overcommit_memory 变量内存:

0: 将变量设置为 0,内核将决定是否过量使用。这是大多数 Linux 版本的默认值。

1: 将变量设置为 1 意味着内核将始终过量使用。这是一个有风险的设置,因为内核总是将内存过度分配给进程。这可能导致内核内存不足,因为进程很有可能最终使用内核提交的内存。

2:将变量设置为 2 意味着内核不应过度使用大于 overcommit_ratio 的内存。这个 overcommit_ratio 是另一个内核设置,您可以在其中指定内核可以过度使用的内存百分比。如果没有空间用于过量使用,则内存分配功能失败,过量使用被拒绝。这是 PostgreSQL 最安全的选项和推荐值。   

可以影响 OOM 杀手的第二件事是 Swappiness 的行为。这种行为可以由变量 cat /proc/sys/vm/swappiness 控制。这些值指定用于处理页面交换的内核设置。该值越大,OOM 杀死进程的机会越少,但会因为 I/O 而影响数据库效率。一个较小的用于可变控制所述swappiness手段,存在用于OOM杀手在踢几率要高的值,但它也提高了数据库的性能。默认值为 60,但如果整个数据库都适合内存,则建议将此值设置为 1。

概括
您不必被 Killer (OOM-Killer) 这个名字所迷惑。凶手并不总是有害的;它是您系统的救星。它会杀死罪魁祸首的进程,并防止您的系统崩溃。为了避免必须使用OOM-Killer杀死PostgreSQL,建议将vm .overcommit_memory 值设置为2。它不会100%避免OOM-Killer,但会减少杀死PostgreSQL进程的机会。
如果vm.oom-kill = 1,那么OOM功能将会从系统内核中彻底禁用,可能导致系统内存不足直接崩溃(该选项测试无效)。

页: [1]
查看完整版本: Linux下简单通过dmesg抓包搜索被系统内核因为物理内存不足杀死进程的日志记录