系统内存不足
有时候我们会面临一些非常情况的现象, 没有异常的情况下进程无缘无故的退出, 无法写如日志文件。 非常奇怪的错误抛出在终端。
现象及分析
有时候我们会面临一些非常情况的现象, 没有异常的情况下进程无缘无故的退出, 无法写如日志文件。 非常奇怪的错误抛出在终端。
这个时候就需要查看一下系统日志 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 的工具运行程序检测内存释放出现泄漏。