我遇到了一个问题,我的服务器开始无法通过它的一些正常进程和检查,因为服务器的内存已完全填满并被占用。
我查看了日志记录历史,发现它杀死的是一些 Java 进程。
我使用“top”命令查看现在哪些进程占用了最多的内存(在问题解决之后),它是一个 Java 进程。所以本质上,我可以知道哪些进程现在占用了最多的内存。
我想知道的是,是否有办法查看在故障开始发生时哪些进程占用了最多的内存?也许 Linux 在特定时间跟踪或记录内存使用情况?我真的不知道,但如果我能看到那种细节,那就太好了。
@Andy 已回答您的问题。但是,我想补充一点,以供将来参考使用监控工具。像这样的东西。这些将为您提供崩溃期间发生的情况,因为您显然无法始终监控所有服务器。希望能帮助到你。
你是说内核OOM杀手消失了吗?dmesg 中的日志说明了什么?请注意,您可以约束 JVM 使用固定的堆大小,这意味着它会在满时肯定失败,而不是让内核杀死其他东西。但是您的问题的一般答案是否定的:在 OOM 故障时无法可靠地运行任何东西,因为系统内存不足!充其量,您可以使用单独的进程来轮询进程表并记录进程大小以捕获内存泄漏情况等...
默认情况下,linux 中没有内存使用历史记录,但是您可以使用一些简单的命令行工具来实现它,例如sar
.
关于您的内存问题:如果 OOM-killer 在机器上造成了一些混乱,那么您有一个很好的选择来确保它不会再次发生(当然在减少 JVM 堆大小之后)。
默认情况下,Linux 内核分配的内存比实际分配的多。在某些情况下,如果没有用于内核任务的内存,这可能会导致 OOM-killer 杀死最消耗内存的进程。此行为由vm.overcommit
sysctl 参数控制。
因此,您可以尝试将其设置为vm.overcommit = 2
issysctl.conf
然后运行sysctl -p
.
这将禁止过度使用,并使 OOM-killer 做出令人讨厌的事情的可能性非常低。您还可以考虑添加一点交换空间(如果您还没有)并设置vm.swappiness
为一些非常低的值(例如5
,默认值为60
),因此在正常工作流程中,您的应用程序不会进入交换,但如果你的内存真的很短,它会暂时开始使用它,你甚至可以看到它df
警告如果您的服务器因内存过载,这可能会导致进程收到“无法分配内存”错误。在这种情况下: