如何使用 Linux 持续监控内存使用情况?

如何使用 Linux 持续监控内存使用情况?

我有一个运行 Ubuntu 服务器(20.04.1)的守护进程服务应用程序。总物理内存为 2G,交换空间为 4G。

有时我的服务会被操作系统悄悄地杀死,尽管我将其添加OOMScoreAdjust=-1000到我的 systemd 服务描述文件中/etc/systemd/system/,但这是一个关键的应用程序应该不是被杀死。我猜它被杀死的原因可能是它占用了太多内存。

我需要获取有关我的服务内存使用情况的详细日志,例如每分钟的日志条目,以便我可以找出该值的最大值,并调整其他服务(如 postgresql)的要求。

它是一个守护进程应用程序,运行云 VPS,所以我可以不是启动一个top命令并持续观察它。

有什么方法可以生成这样的日志吗?

谢谢!

答案1

根据 Halfgaar 的回答,采用简单的 hack 方式,但没有systemd status | grep something

首先,我强烈建议使用某种监控解决方案 - 安装 Prometheussystemd-导出器应该相当容易,在任何其他机器上运行 Prometheus 来检索统计数据也应该如此 - 甚至可以在您调试此问题时在家中/公司设备上使用。在此设置中,指标systemd_process_resident_memory_bytessystemd_process_virtual_memory_bytessystemd_process_virtual_memory_max_bytes可能是最有趣的指标。

cgroups(所有这些都取决于 v2)在 /sys/fs/cgroup 下有一个文件系统,您可以在其中查询大量信息。对您来说最有趣的是memory.stat,其中第一行anon $someNumber可能是最有趣的值(为您提供正在使用的内存字节,这些内存不受文件支持,因此无法从交换区以外的任何内存中删除)。

如果您希望每个 systemd 服务都这样,则可以使用例如/sys/fs/cgroup/system.slice/systemd-journald.service/memory.stat,为您提供 systemd-journald.service 中所有内容的内存(此服务的进程以及由此启动的所有内容)。您还可以通过使用/来区分systemuser(我笔记本电脑上当前的图形会话,也就是我写这篇文章的地方,将在 中) 。user/sys/fs/cgroup/system.slice/memory.stat.../user.slice/memory.stat

你的旧版本 Ubuntu 可能有 cgroups v1,在这种情况下路径会有所不同 - 请查看相关文档:https://manpages.ubuntu.com/manpages/focal/man7/cgroups.7.html对于一般的 cgroup 来说,https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt#cat-sysfscgroupmemory0memoryusage_in_bytes适用于 cgroup v1 内存控制器。

答案2

你可以用专业的方式或黑客的方式去做。你可以使用各种监控和/或进程统计解决方案,或者你可以简单地systemctl status | grep something每分钟运行一次并写入 Systemd(使用内核控制组)报告的内存使用情况。

答案3

经过一些实验,我觉得这是一个足够好的和简单的解决方案:

添加一个 crontab 作业,每分钟执行以下命令:

*/1 * * * * top -bn1|grep my_app_name >> /some/where/memory-usage.log

通过这个日志文件,我可以轻松找出最大使用量。

相关内容