0%

【OS】测验malloc的极限(一)

事情的起源是这样的:舍友想通过计算大矩阵的乘法对比多核和单核的性能差异,结果某个程序总是在运行后不久被SIGKILL掉。进一步了解后发现该程序中矩阵大小为100000*100000,数据类型为double,直接使用malloc申请。经过简单估算,malloc要申请的内存约为 80GB,明显消耗资源过大。

进行推测:服务器中对于资源消耗超过阈值的程序发送SIGKILL信号。

遂想到一解决方案:先测量出服务器上通过malloc最大可以申请的内存,然后设定矩阵大小小于这个值,程序就可以正常运行了。

遂想到CSAPP中死循环使用malloc测量最大可用内存的方法。

在本地虚拟机上使用如下代码进行测试:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>

int main(){
int a = 0;
void *p = 0;
while (p = malloc(1024))
a++;
printf("total available memory:%dKB",a);
return 0;
}

编译运行后,等了一会儿,发现竟然卡死。。。死。。。了?说好的测量呢?

又过了亿会儿,虚拟机恢复正常,并且出现了熟悉的SIGKILL。

进一步进行推测:OS杀掉进程的原因之一,就是这个进程把整个系统的内存全抢过来了,导致OS和其他进程无法正常工作。

使用命令cat /var/log/syslog查看系统日志,发现如下相关信息

1
2
3
May  6 21:06:56 uniform64-virtual-machine kernel: [384056.115658] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/[email protected],task=a.out,pid=71486,uid=1000
May 6 21:06:56 uniform64-virtual-machine kernel: [384056.115692] Out of memory: Killed process 71486 (a.out) total-vm:2084532kB, anon-rss:2082116kB, file-rss:4kB, shmem-rss:0kB, UID:1000 pgtables:4116kB oom_score_adj:0
May 6 21:06:56 uniform64-virtual-machine kernel: [384056.254437] oom_reaper: reaped process 71486 (a.out), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

啊哈,找到幕后主使了,就是你,oom-killer。更详细的机制以后再研究,不然要猝死了:p。