如何在 Linux 中查找内存泄漏?

如何在 Linux 中查找内存泄漏?

我有一颗数字海洋水滴。最近我将它与另一个结合起来,现在系统会随机(每隔几天)完全达到 CPU 使用率的最大限度(对于单个用户,而不是对于系统),并且会抛出一堆“内存不足”错误。我无法使用 top 来找出导致问题的过程,因为它是随机发生的。

为了尝试解决这个问题,我最近将可用内存和 CPU 能力增加了四倍。这个问题消失了大约一个月,现在它又出现了,而且比以前更频繁。

我不知道它什么时候会发作。一旦发作,整个系统就会被锁定,我必须硬重启。我检查了 /var/log/messages,发现 php、mysqld、spamd 和一些其他东西出现了一堆“内存不足”错误。我如何找出哪个用户导致了这个问题,更具体地说,我如何找出解决方法?

就上下文而言,它是一个安装了 cpanel 的常规网络托管系统。

答案1

阅读 OOM 消息。它将打印出当时的内存使用情况详细信息和被终止的 PID。该任务不一定是根本原因,只是当时对内核来说它看起来比较大。

查看 /proc/meminfo 并使用 top 观察进程。您应该大致了解系统的大小。假设一个 4 GB 实例需要 2 GB 用于数据库共享内存,1 GB 用于 Web 服务器进程,1 GB 用于操作系统和管理工具。这些类别中的任何一个超过其估计值都会导致内存压力。

使用 cgroup accounting 精确测量每个服务的内存使用情况。容器可以做到这一点,尽管您没有说您正在使用容器。

如果您的服务管理器是 cgroup,则 systemd 切片也会使用 cgroup。设置 默认内存会计=是并查看 systemd-cgtop 的输出。尝试使用以下工具进行 cgroup 感知监控netdata 的 cgroups 插件. 一旦您知道资源限制应该是多少,就可以对设备进行设置。

相关内容