一、什么是oom-killer
在Linux操作系统中,当内存不足时,Linux会使用oom-killer来关闭一些进程,以释放内存空间。oom-killer是Linux自带的一个内核机制,它可以识别哪些进程对系统的影响最小,并强制关闭它们,从而避免系统崩溃,保证系统的正常运转。
二、oom-killer的作用
1、保障系统的稳定运行
如果系统中有一些进程消耗了大量内存,而且这些进程又无法回收这些内存,那么系统的运行就会变得非常不稳定。如果不及时采取措施,很可能会导致系统崩溃。
2、优化系统性能
当整个系统内存不足时,oom-killer会关闭某些进程来释放内存,这将迫使内核直接回收收缩缓存的页并释放内存。这样可以为内核释放内存空间,为新的缓存和新的传入连接腾出空间。
三、oom-killer的工作原理
oom-killer的工作原理是以OOM_SCORE为标准来确定哪个进程更容易被杀掉。OOM_SCORE是Linux中恶意代码用户进程(例如微信红包跑分)的识别标准。OOM_SCORE的值越高,发生OOM时就越容易被杀掉。OOM_SCORE会根据进程消耗的内存和其他一些因素动态计算。
四、如何使用oom-killer
使用oom-killer时,需要修改/proc/sys/vm/overcommit_memory文件,这个文件中保存着各种OOM行为的配置。具体的修改命令与修改内容如下:
$ sudo sysctl -w vm.overcommit_memory=1 # 开启overcommit_memory功能 $ sudo sysctl -w vm.overcommit_ratio=80 # 设置80%的内存预留值
其中,“vm.overcommit_memory”参数表示内核对内存的使用管理策略,其默认值为0,表示不开启此功能。通过设置这个参数,告诉系统要开启进程启动前内存检查功能,提示不足以及其它问题。
如果设置"vm.overcommit_memory=2",表示禁止内核释放任何一块内存,并抛出OOM异常,导致应用强制崩溃。
五、oom-killer的实现过程
1、内核分配内存时,会产生一个新的结构体vm_area_struct,并加入到进程的虚拟地址空间。 2、在用户态,如果进程申请内存成功,则会返回一个指向被分配内存的指针。 3、但是,在OOM时,内核尝试释放一些悬空的或可回收的物理页,以释放部分内存。在此之后,如果内存依然不足,那么oom-killer将会介入进程的内存。 4、OOM_SCORE最高的进程被杀掉,oom-killer通知这个进程被杀掉的原因(OOM)和释放的内存量。 5、oom-killer然后重复上面的步骤,直到系统有足够的内存为止。
六、你需要知道的防止oom-killer方法
1、增加系统内存
增加系统内存是最直接有效的防止OOM的方法。内存越大,越能够容纳更多的进程和应用程序。
2、限制进程的内存使用量
使用一些工具,如cgroup限制进程的内存使用量,以避免某个进程占用大量内存导致系统出现OOM故障。
3、使用Swap空间
在Linux中,Swap是虚拟内存的一种形式,它允许在物理内存不足的情况下将部分内存转移至硬盘上来解决OOM问题。
七、总结
通过本文对oom-killer的详细介绍,我们了解了oom-killer的概念、作用、工作原理和如何应用它来避免系统崩溃。在日常使用中,要注意使用合理的内存管理策略和一些防止OOM的方法,保证系统的稳定运行。