我有一个构建服务器,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'
您将获得一个定期更新的按排序的进程列表RSS
。w
选项显示完整的命令名称。
答案3
您是否尝试过使用 top 和使用 c 切换以便查看进程名称和命令行?