查看进程被终止时 Linux 内存使用情况的最简单方法

查看进程被终止时 Linux 内存使用情况的最简单方法

我有一个构建服务器,dmesg 报告说它必须终止进程,因为它的内存不足。由于系统同时运行许多构建和其他进程,我需要找出哪个或哪些进程真正使用了过多的内存。也就是说,我不确定被终止的进程是否占用了内存。

理想情况下,我希望在内存不足终止程序启动时转储内存使用情况,并使用每个进程的完整命令行。有办法吗?或者,如果我无法在特定时间点转储它,我计划设置一个 cron 作业,每隔一两分钟转储一次内存使用情况,但我仍然需要一些帮助才能获得正确的输出。

smem 的输出非常好,但是它会截断命令行:

PID User     Command                         Swap      USS      PSS      RSS
39090 user   /usr/bin/Xvfb +extension RA     4732      144      148      264
20837 user   -bash                              0      780     1100     2144
21144 user   python /usr/bin/smem               0    12120    12320    13248
19224 user   /opt/atlassian/bamboo_home/        0   234940   235303   237144
12414 user   /usr/java/jdk1.8.0_121/bin/   176128  2249180  2249338  2250428

有没有办法告诉 smem 显示完整的命令行?或者,通过管道传输输出以显示我需要的内容的简单方法?我可以通过管道传输到 xargs 和 ps 以获取完整的命令行,如下所示:

smem -H -c "pid" | xargs ps

然而我丢失了 smem 的内存使用值。

答案1

如果您有进程名称,您可能会发现类似这样的答案非常有用:查找设置 MaxClients 的单个 Apache 进程的平均大小

您可以httpd将该命令开头的部分替换为您的进程名称,它将在第一行显示具有该名称的进程的总内存使用量,在第二行显示这些进程的平均内存使用量。希望这对您有所帮助!:)

答案2

我用以下代码模拟了内存占用:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1000*1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1000*1024*1024);
        mb++;
        printf("Allocated %d MB\n", 1000*mb);
        sleep(1);
    }

    return 0;
}

我将代码放入munch.c文件中然后:

gcc -o munch munch.c
./munch # will run until SIGINT or killed by kernel

我打开了另外两个控制台并在其中运行这个:

# 1st console
dmesg -w
# 2nd console
sudo tail -f /var/log/{kern.log,syslog}

munch然而,进程被终止后我并没有发现任何东西。

所以我猜你只需要编写一个脚本来监控内存消耗。这可能是一个起点:

watch 'ps auxw | head -1 && ps auxw | sort -k6 -nr | head -5'

您将获得一个定期更新的按排序的进程列表RSSw选项显示完整的命令名称。

答案3

您是否尝试过使用 top 和使用 c 切换以便查看进程名称和命令行?

https://en.wikipedia.org/wiki/Top_(软件)

相关内容