/* */ /* Written by Roger Heflin roger.a.heflin@conoco.com rahmrh@cableone.net */ /* */ /* Simulates an application writting multiple data streams to several */ /* file to duplicate an application IO issues */ /* code tries to note when a write takes alot longer than expected */ /* and does appear to be able to sometimes detect the bdflush deamon */ /* under the correct conditions */ /* Quite a bit more error checking could be done at various points but is not done */ #include #include #include #include #include double my_tod() { struct timeval t1; gettimeofday(&t1,NULL); return(t1.tv_sec + (double)t1.tv_usec/1e6); } int main(int argc,char **argv) { char *directory; int write_size; char filename[30][256]; int *writebuffer; long long num_writes; long long max_writes; FILE *fn[30]; int nfiles; int i; char hostname1[32]; unsigned long sleep_usec; double delayt; double write_time; double bflush_time; double start_time,end_time,start_time1,end_time1,start_time2,end_time2; int cnt; int num_slowwrite; num_slowwrite = 0; setlinebuf(stdout); if (argc != 5) { fprintf(stderr,"Usage: %s directory size sleep_time numberoffiles\n",argv[0]); fprintf(stderr," directory - is the directory to work in\n"); fprintf(stderr," size - is the block size to use for the writes\n"); fprintf(stderr," sleep_time is the sleep time in second to sleep\n"); fprintf(stderr," after writing to all files using really\n"); fprintf(stderr," small numbers below the kernel resolution will not\n"); fprintf(stderr," result in smaller times - decimals are allowed\n"); fprintf(stderr," numberoffiles - number of write streams\n"); exit(-1); } write_size = atoi(argv[2]); delayt = atof(argv[3]); directory=argv[1]; nfiles=atoi(argv[4]); printf("write size is %d sleep time is %f\n",write_size,delayt); printf("with %d files\n",nfiles); sleep_usec = delayt * 1000000; writebuffer = malloc(write_size+4); if (writebuffer == 0) { fprintf(stderr,"Malloc of %d bytes failed - error is %s\n",write_size,strerror(errno)); exit(-1); } chdir(directory); for (i=0;i 1.0) { num_slowwrite ++; } } /* Only sleep once per every nfiles writes of write_size */ if (sleep_usec != 0) usleep(sleep_usec); /* Print out a rate every xxx writes for each file*/ if (cnt == 10) { end_time1 = my_tod(); end_time2 = end_time1; printf("%s %8.1f secs - last wrt speed %8.2f MB/sec %10.2f GB written %8.2f MB/sec overall average %d slowwrites", hostname1, (end_time2-start_time2), ((cnt*write_size*nfiles) / (end_time1-start_time1))/(1024*1024), ((double)num_writes*(double)write_size*nfiles)/(1024*1024*1024), (((double)num_writes*(double)write_size*nfiles) / (end_time2-start_time2))/(1024*1024),num_slowwrite); if ( ( end_time1 - start_time1) > 5 ) { printf(" Buffer flush %5.2f - last was %f seconds ago\n",end_time1 - start_time1,start_time1 - bflush_time); bflush_time = start_time1; } else { printf("\n"); } start_time1 = my_tod(); cnt = 0; num_slowwrite = 0; } /* if (access("QUIT_NOW",F_OK) == 0) { printf("Average time per write %s %f\n",hostname1,write_time/num_writes); for (i=0;i