Linux内存使用历史

时间:2012-10-24 15:55:22

标签: linux memory process

我遇到了一个问题,我的服务器开始失败了一些正常的进程和检查,因为服务器的内存已经完全充满并被占用了。

我查看了日志记录,发现它杀死的是一些Java进程。

我使用“top”命令来查看现在占用最多内存的进程(在问题解决之后)并且它是一个Java进程。所以从本质上讲,我现在可以告诉哪些进程占用了大部分内存。

我想知道的是,是否有办法看到哪些进程在发生故障时占用的内存最多?也许Linux会在特定时间跟踪或记录内存使用情况?我真的不知道,但如果我能看到那种细节那就太棒了。

3 个答案:

答案 0 :(得分:3)

@Andy已经回答了你的问题。但是,我想补充一点,以便将来参考使用监控工具。像these这样的东西。这些将为您提供崩溃期间发生的事情,因为您显然无法一直监控所有服务器。希望它有所帮助。

答案 1 :(得分:2)

你是说内核OOM杀手熄灭了吗?登录dmesg说什么?请注意,您可以约束JVM以使用固定的堆大小,这意味着它在完整时将肯定地失败而不是让内核杀死其他内容。但对你的问题的一般答案是否定的:在OOM失败时无法可靠地运行任何,因为系统内存不足!充其量,您可以使用单独的进程轮询进程表并记录进程大小以捕获内存泄漏情况等...

答案 2 :(得分:1)

默认情况下,linux中没有内存使用历史记录,但您可以使用sar之类的简单命令行工具来实现。

关于你的记忆问题: 如果OOM杀手在机器上造成了一些混乱,那么你有一个很好的选择来确保它不会再次发生(当然在减少JVM堆大小之后)。

默认情况下,linux内核会分配比实际内存更多的内存。在某些情况下,如果没有内核任务的内存,这可能导致OOM杀手杀死最耗尽内存的进程。 此行为由vm.overcommit sysctl参数控制。

因此,您可以尝试将其设置为vm.overcommit = 2 sysctl.conf,然后运行sysctl -p

这将禁止过度使用,并使OOM杀手的可能性非常低。此外,您可以考虑添加一点交换空间(如果您还没有),并将vm.swappiness设置为某个非常低的值(例如5)。默认值是60),所以在正常的工作流程中,您的应用程序不会进入交换,但如果您的内存非常短缺,它将暂时开始使用它,您将能够看到它即使有df

警告这可能导致进程收到"无法分配内存"如果您的服务器因内存过载而出错。在这种情况下:

  1. 尝试限制应用程序的内存使用量
  2. 将部分内容移至另一台计算机