【问题标题】:Linux memory usage historyLinux 内存使用历史
【发布时间】:2012-10-14 17:05:51
【问题描述】:

我遇到了一个问题,我的服务器开始无法通过一些正常的进程和检查,因为服务器的内存已满并被占用。

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

我使用“top”命令查看现在哪些进程占用了最多的内存(在问题得到解决之后),它是一个 Java 进程。因此,从本质上讲,我可以知道哪些进程现在占用的内存最多。

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

【问题讨论】:

    标签: linux memory process


    【解决方案1】:

    你是说内核 OOM 杀手消失了吗? dmesg 中的日志说明了什么?请注意,您可以限制 JVM 使用固定的堆大小,这意味着它会在满时肯定失败,而不是让内核杀死其他东西。但您的问题的一般答案是否定的:在 OOM 故障时无法可靠地运行 anything,因为系统内存不足!充其量,您可以使用单独的进程来轮询进程表并记录进程大小以捕获内存泄漏情况等...

    【讨论】:

    • FWIW,您可以使用 mlockall() 或类似方法在内存紧缩期间使进程相对可靠。例如:stromberg.dnsalias.org/~strombrg/fallback-reboot
    • 这仅适用于非常有限的应用程序。由于内核中的分配失败,进行任何系统调用都可能失败。产生外部进程是不可能的。由于缓冲区耗尽,文件系统 I/O 可能会无限期挂起。诚然,这并非不可能,但必须格外小心。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      linux默认没有内存使用历史,但是你可以使用一些简单的命令行工具来实现它,比如sar

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

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

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

      这将禁止过度使用,并使 OOM-killer 做出令人讨厌的事情的可能性非常低。您也可以考虑添加一点交换空间(如果您还没有)并将vm.swappiness 设置为一些非常低的值(例如5。默认值为60),所以在正常的工作流程中,您的应用程序不会进入交换状态,但如果您的内存真的很短,它会暂时开始使用它,即使使用df,您也可以看到它

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

      1. 尝试限制应用程序的内存使用量
      2. 将其中的一部分移到另一台机器上

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 2011-05-30
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多