我有一个运行 Ubuntu 服务器(20.04.1)的守护程序服务应用程序。总物理内存2G,交换空间4G。
有时我的服务被操作系统悄悄地杀死了,尽管我OOMScoreAdjust=-1000
在我的 systemd 服务描述文件中添加了/etc/systemd/system/
,但它是一个不应该被杀死的关键应用程序。我想它被杀死的原因可能是它使用了太多的内存。
我需要获取有关我的服务的内存使用情况的详细日志,例如每分钟的一个日志条目,以便我可以找出其中的最大值,并调整其他服务(如 postgresql)的要求。
它是一个守护程序应用程序并运行云 VPS,因此我无法启动命令top
并连续观看它。
有没有办法可以生成这样的日志?
谢谢!
您可以通过专业或黑客方式进行操作。您可以使用各种监控和/或进程记帐解决方案,或者您可以简单地
systemctl status | grep something
每分钟运行一次并写入 Systemd(它使用内核控制组)报告的内存使用情况。根据Halfgaar的回答,做简单的hacky方式但没有
systemd status | grep something
首先,我强烈建议使用某种监控解决方案 - 安装 Prometheus systemd-exporter应该非常容易,并且在任何其他机器上运行 Prometheus 以检索统计数据应该是 - 甚至可以在家庭/公司的设备上只要你调试这个问题。在这个设置中,metrics
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 服务,您可以使用 eg
/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 用于一般 cgroups , https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt#cat-sysfscgroupmemory0memoryusage_in_bytes用于 cgroup v1 内存控制器。
经过一些实验,我觉得这是一个很好且足够简单的解决方案:
添加一个 crontab 作业以每分钟执行一次以下命令:
*/1 * * * * top -bn1|grep my_app_name >> /some/where/memory-usage.log
有了这个日志文件,我可以很容易地找出最大使用量。