Disk benchmark (long)
Shawn Hayes
shawn at jdyx.UUCP
Tue Oct 9 11:59:48 AEST 1990
The company I work for is looking for a 386 based Unix for a new product.
One of the requirements for any system we use is that it have very good disk
access capabilites. To judge the capabilites of AIX 1.2 and OS/2 (our first
candidates) a benchmark was written that does random and sequential reads
and writes to a file.
I'd like for anyone who has a 386 based Unix system to run the included
benchmark and post(or email) the results so we have some basis for comparison
with any other Unixes. The benchmark is very short. The only requirement
is that you have a C compiler and a little over two megabytes of disk space
as the file that's used will be 2 megabytes in size.
To compile the benchmark: cc -o disktest disktest.c sm0run.c
and to run the benchmark:
touch DISKTST ;create the test file
time disktest SYNC ;run the benchmark and force all writes to
; disk
then record the results
If you wish you can remove the DISKTST file, recreate it and rerun the
benchmark in NOSYNC mode which will result in all writes being postponed
until the OS is ready to post them. (time disktest NOSYNC)
The results that we recieved from AIX 1.2 were 1.11 minutes for the SYNC test
and about 20 seconds for OS/2 using the same hardware.
------------------------cut here----------------------------------
#!/bin/sh
# This is c, a shell archive (shar 3.32)
# made 10/08/1990 15:19 UTC by root at amber
# Source directory /u/shar/disktest
#
# existing files WILL be overwritten
# This format requires very little intelligence at unshar time.
# "echo" and "sed" will be needed.
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 2623 -rw-r--r-- disktest.c
# 3506 -rw-r--r-- sm0run.c
# 1665 -rw-r--r-- sm0run.h
#
# ============= disktest.c ==============
echo "x - extracting disktest.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > disktest.c &&
X
X#include "sm0run.h"
X
Xchar *FileName = "DISKTST";
Xchar Record[70] = { "123456789012345678901234567890123456789012345678901234567890123456789" };
Xchar BlankRecord[4096];
Xunsigned long next = 1;
X
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int i;
X int j;
X int Read;
X int Wrote;
X int Display;
X int SyncMode;
X int NumLoops = 50;
X char Buf[100];
X FileType Handle;
X
X Display = TRUE;
X SyncMode = SYNC;
X if( argc >=2 )
X {
X if( strncmp("NO",argv[1],2) == 0 )
X SyncMode = NOSYNC;
X if( strncmp("no",argv[1],2) == 0 )
X SyncMode = NOSYNC;
X }
X if( argc >=3 )
X NumLoops = atoi(argv[2]);
X if( argc >=4 )
X Display = FALSE;
X
X printf("Using %s mode.\n", SyncMode==SYNC ? "SYNC" : "NOSYNC" );
X
X Handle = GenericOpen( FileName, SyncMode );
X
X /*******************/
X /* Create File */
X /*******************/
X printf("Creating file\n");
X GenericSeek( Handle, 0L );
X for( i=0; i<560; i++ )
X {
X Wrote = GenericWrite(Handle, (void *) BlankRecord,
X 4096, SyncMode );
X if (Wrote != 4096)
X {
X printf("\nError writing to file\n");
X exit(0);
X }
X if( (i%100)==0 )
X if( Display )
X printf("%d\n",i);
X }
X
X /****************************/
X /* Perform Random Reads */
X /****************************/
X printf("Performing Random Reads\n");
X for( i=0; i<NumLoops; i++ )
X {
X GenericSeek( Handle, (long)RndRec() * sizeof(Record) );
X Read = GenericRead(Handle, (void *) Buf,
X sizeof(Record));
X if (Read != sizeof(Record))
X {
X printf("\nError reading file\n");
X exit(0);
X }
X if( (i%100)==0 )
X if( Display )
X printf("%d\n",i);
X }
X
X /*****************************/
X /* Perform Random Writes */
X /*****************************/
X printf("Performing Random Writes\n");
X for( i=0; i<NumLoops; i++ )
X {
X GenericSeek( Handle, (long)RndRec() * sizeof(Record) );
X Wrote = GenericWrite(Handle, (void *) Record,
X sizeof(Record), SyncMode );
X if (Wrote != sizeof(Record))
X {
X printf("\nError writing to file\n");
X exit(0);
X }
X if( (i%100)==0 )
X if( Display )
X printf("%d\n",i);
X }
X printf("Finished.\n");
X}
X
Xint RndRec()
X{
X next = next * 1103515245 + 12345;
X return( (unsigned int)(next/65536)%32768 );
X}
SHAR_EOF
# ============= sm0run.c ==============
echo "x - extracting sm0run.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > sm0run.c &&
X/*
X*************************************************************************
X* sm0run.c *
X*************************************************************************
X* *
X* Description: This module deals with queue calls, hopefully *
X* generically between unix and os/2. *
X* *
X* COPYRIGHT 1990 SCIENTIFIC-ATLANTA, INC. *
X* ALL RIGHTS RESERVED *
X*************************************************************************
X* Rev Date Author Change Description *
X* ----- -------- ------ --------------------------------------- *
X* 1.0 03/21/90 Original Release *
X*************************************************************************
X*/
X
X#include <sys/types.h>
X#include <errno.h>
X#include "sm0run.h"
X
X#define Q_PERM_ALL 00666
X#define BAD_VALUE -1
X#define GOOD_VALUE 0
X
X
X
X
X
X
X
X/*
X***********************************
X* *
X* Generic routines *
X* *
X***********************************
X*/
X#if 0
X
XFileType GenericOpen(FileName)
X char *FileName;
X{
X return(fopen(FileName, "r+b"));
X}
X
X
Xint GenericFailure(Handle)
X FileType Handle;
X{
X return(Handle == NULL);
X}
X
X
Xvoid GenericClose(Handle)
X FileType Handle;
X{
X fclose(Handle);
X}
X
X
Xint GenericRead(Handle, Buffer, BufLen)
X FileType Handle;
X void *Buffer;
X int BufLen;
X{
X return(fread(Buffer, 1, BufLen, Handle));
X}
X
X
Xint GenericWrite(Handle, Buffer, BufLen)
X FileType Handle;
X void *Buffer;
X int BufLen;
X{
X return(fwrite(Buffer, 1, BufLen, Handle));
X}
X
X
Xvoid GenericSeek(Handle, Position)
X FileType Handle;
X long Position;
X{
X int err ;
X
X err = fseek(Handle, Position, 0);
X if (err) printf("fseek err=%d; Position=%ld\n", err, Position ) ;
X}
X
Xvoid GenericFlush( File1, File2, File3 )
X FileType File1, File2, File3;
X{
X fflush( File1 );
X fflush( File2 );
X fflush( File3 );
X}
X
X#else
X
X#include <fcntl.h>
X#define O_BINARY 0
X
XFileType GenericOpen( FileName, SyncMode )
X char *FileName;
X int SyncMode;
X{
X if( SyncMode == NOSYNC )
X return(open(FileName, O_RDWR | O_BINARY ));
X else
X return(open(FileName, O_RDWR | O_BINARY | O_SYNC ));
X}
X
X
Xint GenericFailure(Handle)
X FileType Handle;
X{
X return(Handle <= 0);
X}
X
X
Xvoid GenericClose(Handle)
X FileType Handle;
X{
X close(Handle);
X}
X
X
Xint GenericRead(Handle, Buffer, BufLen)
X FileType Handle;
X void *Buffer;
X int BufLen;
X{
X return(read(Handle, Buffer, BufLen));
X}
X
X
Xint GenericWrite(Handle, Buffer, BufLen, SyncMode)
X FileType Handle;
X void *Buffer;
X int BufLen;
X int SyncMode;
X{
X return(write(Handle, Buffer, BufLen));
X}
X
X
Xvoid GenericSeek(Handle, Position)
X FileType Handle;
X long Position;
X{
X long err ;
X
X err = lseek(Handle, Position, 0);
X if (err==-1L) printf("lseek err=%ld; Position=%ld\n", err, Position ) ;
X}
X
Xvoid GenericFlush( File1, File2, File3 )
X FileType File1, File2, File3;
X{
X/* fsync( File1 );
X fsync( File2 );
X fsync( File3 );
X*/}
X
X#endif
X
X
X/* end of file */
SHAR_EOF
# ============= sm0run.h ==============
echo "x - extracting sm0run.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > sm0run.h &&
X/* File: sm0run.h for the IBM-6000 Model 320 */
X
X#include <stdio.h>
X#include <stdlib.h>
X#include <fcntl.h> /* needed for OS/2 and AIX */
X
X/* #define TRUE 1 */
X/* #define FALSE 0 */
X#define forever 1
X
Xtypedef unsigned char BYTE ;
Xtypedef unsigned short BOOL ;
Xtypedef unsigned long ULONG ;
Xtypedef int logical ;
Xtypedef int FileType;
X
X#define DONTWAIT 0L
X#define WAITFOREVER -1L
X#define MAXQUEUES 10
X#define EMPTY 0
X#define FULL 100
X#define MAXBUFFERS 600
X#define MAXBUFSIZ 70
X
X#define SYNC -1
X#define NOSYNC 0
X
Xint Comm_Read_String(); /* (char *StrBuffer, char Terminator,
X int MaxLength, long TimeOut, int PortID); */
Xint Comm_Write_String (char *StrBuffer, int MaxLength, int PortID);
X
Xint Read_Queue (int WhoAmI, int *WhoIsMsgFrom, char *Buffer,
X int *Length, long TimeOut);
Xint Write_Queue (int WhoAmI, int WhoIsMsgTo, char *Buffer,
X int Length);
X
Xvoid Timer_Reset ();
Xlong Timer_Now ();
Xvoid sleep (long Time);
X
XFileType GenericOpen ();
XBOOL GerericFailed ();
Xvoid GenericClose ();
Xint GenericRead ();
Xint GenericWrite ();
Xvoid GenericSeek ();
Xvoid GenericFlush ();
X
X/* end of file */
SHAR_EOF
exit 0
Please post your results. Thanks.
Shawn Hayes
More information about the Comp.unix.sysv386
mailing list