eugene@pioneer.arpa (Eugene Miya N.) (10/20/87)
Recently, the IOcall benchmark has become popular. During a recent
visit to the Stanford CS Libray and a chance meeting at SIGMETRICS,
I came across this interesting paper. In it, Arvin Park and Richard
Lipton present the attached program as an interesting "benchmark."
(These are the people with the "Massive Memory (sic)" machine.
I have problems with IOStone [so don't tell me how bogus you think this
thing is, Arvin and I already know], but I have agreed to post it for Arvin and
collect results for him [he is no longer at Princeton]. Please observe
the commentary about sending conditions. I have one hardcopy of the
report dated January 1987 (with VAX 750, 785, 8600, Pyramid 90x, SUN 2
(with and without disk), and PC/AT. I will post results as I collect it
and will send a hardcopy of the report (there are figures and graphs)
provided I get a US snail address.
On another disk note, I have been asked to post something further on
disk striping for `anonymous.' I am not an I/O expert, but due to the
amount of mail I received, I am willing to set up an alias here on
pioneer for a short while on the topic. If interested, send mail address.
From the Rock of Ages Home for Retired Hackers:
--eugene miya
NASA Ames Research Center
eugene@ames-aurora.ARPA
"You trust the `reply' command with all those different mailers out there?"
"Send mail, avoid follow-ups. If enough, I'll summarize."
{hplabs,hao,ihnp4,decwrl,allegra,tektronix}!ames!aurora!eugene
----------cut here-------------------------
/*
* "I/O Stone" Benchmark Program
*
* Written by: Arvin Park (park@princeton)
* Department of Computer Science
* Princeton University
* Princeton, New Jersey 08544
* (609) 452-6304 [--enm: no longer this phone or address]
*
* Version: C/1
* Date: 12/10/86
*
* Defines: If your version of "C" does not include a time(2)
* function, define NOTIME. Use a stopwatch to measure
* elapsed wall time. Divide 400000 by the elapsed time
* to get the correct number of iostones/second.
*
* To compile: cc -O io.c -o io
*
* Note: [1] This program should be run without other processes
* competing for system resources. Run it in the dead of
* night if you have to.
*
* [2] This program uses 4 megabytes of disk space. Make
* sure that at least this much space is available on
* your file system before you run the program.
*
* Results: If you get results from a new (machine/operating
* system/disk controller and drive) combination please
* send them to park@princeton. Please include complete
* ********* no! send them to eugene@ames-aurora.arpa*****
* ********* do not bother Arvin as he is no longer @princeton
* information on the machine type, operating system,
* version, disk controller, and disk drives. Also make
* a note of any system modifications that have been
* performed.
*/
#define FILESIZE (4L*1024L*1024L) /*size of file in bytes*/
#define MAXBUFFERSIZE (64L*1024L) /*maximum buffer size*/
#define NBLOCKSIZES 9 /*number of different block sizes*/
#define SEED 34710373L /*random number generator seed*/
#define CONST 100000L /*iostone normalization constant*/
#define ITER 4 /*number of iterations of the code*/
/* Define only one of the following two.*/
/*#define NOTIME /*define if no time function in library*/
#define TIME /*Use time(2)function*/
char buffer [MAXBUFFERSIZE]; /*a temporary data buffer*/
char *filename="/tmp/iostone_temp_file"; /*name of temporary file*/
unsigned int nbytes; /*number of bytes transferred*/
int fd; /*file descriptor*/
long offset; /*file offset*/
int i,j,k; /*counter variables*/
long bsize [NBLOCKSIZES]; /*array for different block sizes*/
int bfreq [NBLOCKSIZES]; /*number of accesses for each block*/
#ifdef TIME
long time();
long starttime;
long totaltime;
#endif
main() {
init();
/*start timing*/
#ifdef NOTIME
printf("start timing\n");
#endif
#ifdef TIME
starttime = time(0);
#endif
for(k=0; k<ITER; k++) /*perform string of file operations*/
readswrites();
/*stop timer*/
#ifdef NOTIME
printf("stop timing\n");
#endif
#ifdef TIME
totaltime = time(0) - starttime;
printf("total time = %ld\n", totaltime);
if(totaltime!=0)
printf("This machine benchmarks at %ld iostones/second\n",
(long) (CONST*ITER)/totaltime);
#endif
}
init(){
/* create a temporary file*/
if((fd = creat(filename, 0640))<0){
printf("init: Cannot create temporary file\n");
exit(1);
}
/*To both read and write the file*/
/*it must be closed then opened*/
close(fd);
if((fd = open(filename,2))<0){
printf("init: Cannot open temporary file\n");
exit(1);
}
/*Unlink the file so that it will*/
/*disappear when the program*/
/*terminates.*/
unlink(filename);
lseek(fd,0L,0); /*write initial portion of file*/
for(i=0; i<(FILESIZE)/4096; i++){
if((nbytes = write(fd, buffer, 4096))<0){
printf("init: error writing block\n");
exit(1);
}
}
/*set file block sizes and access*/
/*frequencies.*/
bsize[0] = 256; bfreq[0] = 128;
bsize[1] = 512; bfreq[1] = 64;
bsize[2] = 1024; bfreq[2] = 64;
bsize[3] = 2048; bfreq[3] = 64;
bsize[4] = 4096; bfreq[4] = 32;
bsize[5] = 8192; bfreq[5] = 16;
bsize[6] = 16384; bfreq[6] = 8;
bsize[7] = 32768; bfreq[7] = 4;
bsize[8] = 65536; bfreq[8] = 4;
random(SEED); /*initialize random number generator*/
}
readswrites(){
for(j=0; j<NBLOCKSIZES; j++){
for(i=0; i<bfreq[j]; i++){
offset=(long) ((random()%(FILESIZE/bsize[j]))*bsize[j]);
lseek(fd,offset,0);
if((nbytes = read(fd, buffer, bsize[j]))<0){
printf("readwrites: read error\n");
exit(1);
}
offset=(long) ((random()%(FILESIZE/bsize[j]))*bsize[j]);
lseek(fd, offset, 0);
if((nbytes = read(fd, buffer, bsize[j]))<0){
printf("readswrites: read error\n");
exit(1);
}
offset=(long) ((random()%(FILESIZE/bsize[j]))*bsize[j]);
lseek(fd, offset, 0);
if((nbytes = write (fd, buffer, bsize [j]))<0){
printf("readswrites: write error\n");
exit(1);
}
}
}
}