系统内存不足

有时候我们会面临一些非常情况的现象, 没有异常的情况下进程无缘无故的退出, 无法写如日志文件。 非常奇怪的错误抛出在终端。

现象及分析

有时候我们会面临一些非常情况的现象, 没有异常的情况下进程无缘无故的退出, 无法写如日志文件。 非常奇怪的错误抛出在终端。

这个时候就需要查看一下系统日志 kern.log 了。

MAIN kernel: [17832.300370]  [<c1090380>] ? oom_kill_process+0x60/0x201
MAIN kernel: [17832.300408]  [<c10908fd>] ? __out_of_memory+0xf4/0x107
MAIN kernel: [17832.300445]  [<c109096a>] ? out_of_memory+0x5a/0x7c
MAIN kernel: [17832.300482]  [<c109322c>] ? __alloc_pages_nodemask+0x3ef/0x4d9
MAIN kernel: [17832.300522]  [<c109460d>] ? __do_page_cache_readahead+0x98/0x16b
MAIN kernel: [17832.300562]  [<c10946f4>] ? ra_submit+0x14/0x18
MAIN kernel: [17832.300597]  [<c108ec9a>] ? filemap_fault+0x16d/0x2e6
MAIN kernel: [17832.300634]  [<c10a0c9a>] ? __do_fault+0x53/0x3fb
MAIN kernel: [17832.300670]  [<c10a2f56>] ? handle_mm_fault+0x4d1/0xa22
MAIN kernel: [17832.300708]  [<c1144ae3>] ? copy_to_user+0x29/0xf8
MAIN kernel: [17832.300745]  [<c10c6b9a>] ? poll_select_copy_remaining+0xbd/0xd9
MAIN kernel: [17832.300785]  [<c12830a8>] ? do_page_fault+0x2f1/0x307
MAIN kernel: [17832.300822]  [<c1282db7>] ? do_page_fault+0x0/0x307
MAIN kernel: [17832.300857]  [<c12815e3>] ? error_code+0x73/0x78

这个时候我们可以发现内存已经不足了。 Linux的保护机制在杀内存消耗大的进程。 所以会有进程无缘无故的推出。 有一些日志是先写到buffer的内存中,然后再调用日志接口把内存中的日志刷到文件中。 此时内存已经不足了,所以内存中已经写不进去了。 最终我们看到的现象就是写不到文件中。

解决办法

内存确实不足

最简单的办法就是直接使用 top 工具。 使用Memory usage的排序方式,实时查看进程的内存占用情况。 查看哪个服务占用了非常大的内存空间。 检查一下为什么占用的内存空间非常大。 是不是真的需要。

内存泄漏

使用 valgrind 的工具运行程序检测内存释放出现泄漏。