一、介绍 在业务测试的时候需要测试极限条件下业务工作是否正常,所以需要写一些极限测试工具
二、原理 使用malloc函数分配
三、代码实现 memtest.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
volatile int timer_cnt = 0;
volatile int set_cnt = 0;
volatile int set_memuse = 0;
void fun()
{
timer_cnt++;
alarm(1);
}
int read_memuseinfo()
{
int ret = 0;
char buf[64] = {'\0'};
FILE *Stream;
int MemFree = 0,Memtotal = 0;
Stream = popen("cat /proc/meminfo | grep MemTotal | awk {'print $2'}", "r");
fread(buf, sizeof(char), sizeof(buf), Stream);
Memtotal = atoi(buf);
pclose(Stream);
Stream = popen("cat /proc/meminfo | grep MemFree | awk {'print $2'}", "r");
fread(buf, sizeof(char), sizeof(buf), Stream);
MemFree = atoi(buf);
pclose(Stream);
ret = (Memtotal - MemFree) * 100 / Memtotal;
printf("total:%d byte free:%d byte use:%d%\n", Memtotal, MemFree, ret);
return ret;
}
int memget(int x)
{
int memuse = 0;
void *p = NULL;
static char state = 0;
int memsize = 0;
memuse = read_memuseinfo();
while(memuse < x)
{
memuse = read_memuseinfo();
if(memuse == NULL)
{
state++;
printf("memget fail\n");
}
if(state > 6)
state = 6;
switch(state)
{
case 0:memsize = 1024*1024;break;
case 1:memsize = 500*1024;break;
case 2:memsize = 100*1024;break;
case 3:memsize = 50*1024;break;
case 4:memsize = 10*1024;break;
case 5:memsize = 5*1024;break;
default:memsize = 1*1024;break;
}
p = malloc(memsize);
memset(p, 0, memsize);
}
return 0;
}
int main(int argc, char *argv[])
{
int ret = 0;
if(argc > 1)
{
set_cnt = atoi(argv[1]);
printf("set timer %d s\n", set_cnt);
set_memuse = atoi(argv[2]);
printf("set_memuse %d s\n", set_memuse);
}
else
{
printf("parameter error\n");
exit(-1);
}
signal(SIGALRM, fun);
alarm(1);
while(1)
{
memget(set_memuse);
if(timer_cnt > set_cnt)
break;
}
printf("get mem finish\n");
return 0;
}
编译 mipsel-linux-gcc memtest.c -o memget -w
运行 ./memget 120 80&
现象 会在120s内,内存使用率提升到80%
|