我编写了一个程序,将MB作为3个参数并给出了吞吐时间。
int main(int argc,char* argv[]){
double kb = 0;
int time_taken = 0;
double throughput = 0;
int i = 0;
int w_rw = 0;
int fd = -1;
int bw = -1;
unsigned long long nob = 0;
char ip;
char* file_name = "myfile";
char* buff;
struct stat info;
struct timeval start_time,end_time;
int mb = 1024 * 1024;
/* Check the nos for W/RW and MBs*/
if(1 == argc){
printf("\n Missing 2 params R/RW & MB,Eg: execute ./a.out 2 100 \n");
return 1;
}
if(argc < 4){
w_rw = atoi(argv[1]);
if(w_rw > 2){
w_rw = 2;
}
nob = (atoi(argv[2]) * mb);
printf("\n W/RW : %d BYTES : %u \n",w_rw,nob);
}
else{
// Do Nothing
}
/* Allocate Buffer */
buff = (char *)malloc(nob * sizeof(char));
if(NULL == buff){
perror("Buffer NULL!");
return -1;
}
printf("\n File - Create,Open,Write,Close \n");
for(i = 0; i < w_rw; i++){
if(i == 0){
printf("\n --- Write IO Performance--- \n");
}
else{
printf("\n --- Re-write IO Performance--- \n");
printf("\n Press any char to continue : \n");
ip = getchar();
}
/* Open file*/
if((fd = open(file_name,O_CREAT | O_RDWR))< 0){
perror("Open failed!");
return -1;
}
/*Calculating the start and end time of write*/
gettimeofday(&start_time,NULL);
if((bw = write(fd,buff,nob)) < 0){
perror("Write failed!");
return -1;
}
gettimeofday(&end_time,NULL);
/*Calculating the throughput*/
time_taken = (end_time.tv_sec - start_time.tv_sec);
kb = bw/1024;
throughput = kb/time_taken;
/* Start */
if(-1 == stat(file_name,&info)){
perror("STAT Failed");
return -1;
}
printf("\n Inode no: %d \n Blocks : %d \n",info.st_ino,info.st_blocks);
printf("\n Start sec : %u \n",start_time.tv_sec);
printf("\n End sec : %u \n",end_time.tv_sec);
printf("\n Bytes written : %d bytes \n",bw);
printf("\n Time_taken : %d secs \n",time_taken);
printf("\n Throughput : %f kb/sec \n",throughput);
close(fd);
}
unlink(file_name);
return 0;
}
O / P:
[root @ rw gfs]#。/ a.out 2 76800
W / RW:2 BYTES:3221225472 Buffer NULL!:无法分配内存答案 0 :(得分:2)
您正在请求巨大的内存块(78GB!)和malloc
失败,正如在任何标准(台式机/笔记本电脑)计算机上所预期的那样。
事实上,你有:
int mb = 1024 * 1024;
// ...
nob = (atoi(argv[2]) * mb);
// ...
buff = (char *)malloc(nob * sizeof(char));
因此nob
1024 * 1024 * 76800
就是{{1}}。
尝试使用较小的尺寸,它会起作用。