我有一个运行 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_bytes
、 systemd_process_virtual_memory_bytes
和systemd_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 中所有内容的内存(此服务的进程以及由此启动的所有内容)。您还可以通过使用/来区分system
和user
(我笔记本电脑上当前的图形会话,也就是我写这篇文章的地方,将在 中) 。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
通过这个日志文件,我可以轻松找出最大使用量。