Linux:内核httpd调用了oom-killer
时间:2020-02-23 14:39:50 来源:igfitidea点击:
apache报错 kernel: httpd invoked oom-killer
您是否已在系统日志(/var/log/messages)中注意到这种行为?
kernel: httpd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 kernel: Call Trace: kernel: [<ffffffff800cb67d>] out_of_memory+0x8e/0x2f3 kernel: [<ffffffff8002e493>] __wake_up+0x38/0x4f kernel: [<ffffffff8000a7ea>] get_page_from_freelist+0x2/0x442 kernel: [<ffffffff8000f6a2>] __alloc_pages+0x27f/0x308 kernel: [<ffffffff8001308d>] __do_page_cache_readahead+0x96/0x17b kernel: [<ffffffff800139d6>] filemap_nopage+0x14c/0x360 kernel: [<ffffffff80008972>] __handle_mm_fault+0x1fd/0x103b kernel: [<ffffffff8000c795>] _atomic_dec_and_lock+0x39/0x57 kernel: [<ffffffff800671ae>] do_page_fault+0x499/0x842 kernel: [<ffffffff8005ddf9>] error_exit+0x0/0x84
此外,当时系统挂起/非常慢,内存用尽,交换被吃掉了……
好吧,由于某种原因(错误或者流量突然增加),所有可用内存已分配给一个或者多个系统进程(以上内容可以在多个系统进程中注意到,任何可能请求访问内存的人)。
在当前情况下,罪魁祸首是Apache,这种行为在Apache,MySQL,cron等等中可见。
我建议调查以下内容:
- 使用“sar”跟踪当时的load/ressource使用行为
- 导致oom killer/out of \u memory事件的第一个进程上的用法
- 当时的系统繁忙程度
- 可能已触发事件的计划cron作业
如果以上方法均不能解释峰值使用率,则可能是您遇到了软件或者内核错误。
尝试更新所涉及的软件,内核可以解决此问题。
现在,为什么发生"内存不足"情况,我们如何防止这种情况发生?
请记住,默认情况下,内核将分配内存,而不管当前的使用情况或者系统上的内存总量。
您可以通过应用以下内核参数(/etc/sysctl.conf)来改善这种行为:
vm.overcommit_memory = 2 vm.overcommit_ratio = 80
注意:必须重新启动才能应用sysctl.conf参数。
例如,您可以发出" sysctl -w vm.overcommit_memory = 2"命令立即应用设置,但不要忘记添加到sysctl.conf中,因为这些命令将无法重启。
这是" overcommit_memory"参数的可能值和说明:
0:启发式过度限制(这是默认值)
1:总是超负荷,从不检查
2:经常检查,不要过度
另外,在涉及Apache的此特定问题上,您可以在" httpd.conf"中限制每个进程的内存:
RLimitMEM <value_in_bytes>
例如,您希望将进程大小限制为128 MB,参数和值将为:
RLimitMEM 134217728