Files

151 lines
3.1 KiB
C
Raw Permalink Normal View History

2026-09-22 09:38:26 +08:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
unsigned int block_size = 64;
unsigned int cost_size = 1024 * 1024;
int oom_adj = 15;
int force_mlock = 0;
static void usage(void)
{
printf("Usage:\n");
printf(" costmem [-ccost_size(KB) -bblock_size(KB) -oOom_adj(-1000 to 1000)]\n");
printf(" such as: costmem -c2048 -b128 -o0 -m\n");
}
void process_options(int argc, char **argv)
{
int opt = 0;
while ((opt = getopt (argc, argv, "c:b:o:m")) != -1) {
switch (opt) {
case 'c':
cost_size = (unsigned int)atoi(optarg);
break;
case 'b':
block_size = (unsigned int)atoi(optarg);
break;
case 'o':
oom_adj = atoi(optarg);
break;
case 'm':
force_mlock = 1;
break;
default:
break;
}
}
}
int main(int argc, char *argv[])
{
int i, max, left;
size_t allocsize = 0;
char *memory = NULL;
char data = 0;
int rval = -EINVAL;
char text[128] = {0};
int fd;
pid_t pid = getpid();
if (argc < 2) {
usage();
return rval;
} else if (argc == 2) {
if (strstr(argv[1], "help"))
usage();
return rval;
}
process_options(argc, argv);
if (oom_adj < -1000 || oom_adj > 1000) {
printf("Oom_adj must between -1000 to 1000\n");
return rval;
}
sprintf(text, "/proc/%d/oom_adj", pid);
fd = open(text, O_WRONLY);
if (-1 == fd) {
perror("open");
return rval;
} else {
sprintf(text, "%d", oom_adj);
if (write(fd, text, strlen(text)) == -1)
perror("write");
close(fd);
}
printf("Cost mem %d KB, %d KB per Block, oom_adj %d\n", cost_size, block_size, oom_adj);
max = cost_size / block_size;
left = cost_size % block_size;
allocsize = (size_t)block_size * 1024;
srand((unsigned)time(NULL));
for(i = 1; i < max + 1; i++) {
memory = malloc(allocsize);
if(NULL == memory){
perror("malloc");
return rval;
}
memset(memory, 0, allocsize);
if (force_mlock) {
if(mlock(memory, allocsize) == -1) {
perror("mlock");
return rval;
}
} else {
data = (rand()%127) + 1;
memset(memory, data, allocsize);
}
printf("%-7dKB, ", block_size * i);
if(0 == i % 10)
printf("\n");
}
if (left) {
allocsize = (size_t)left * 1024;
memory = malloc(allocsize);
if(NULL == memory){
perror("malloc");
return rval;
}
memset(memory, 0, allocsize);
if (force_mlock) {
if(mlock(memory, allocsize) == -1) {
perror("mlock");
return rval;
}
} else {
data = (rand()%127) + 1;
memset(memory, data, allocsize);
}
printf("%-7dKB, \n", block_size * max + left);
}
printf("\nHave malloc and %s %d KB mem\n", force_mlock ? "mlock" : "write random number to", cost_size);
i = 0;
while(1){
sleep(20);
i++;
printf(".");
if(0 == i % 10)
printf("Please Ctrl+c to kill this APP\n");
}
return 0;
}