I dug up a simple C program that I wrote years ago to test disk performance. I hesitated to publish it because it is rough and limited in scope and other more capable tools exist. But, I have made good use of it so why not share it with others? It takes a file name and the size of the file in megabytes. It sequentially writes the file in 64 kilobyte chunks. It opens the file in synchronous mode so it must write the data to disk before returning to the program. It outputs the rate in bytes/second that the program wrote to disk.
Here is a zip of the code: zip
There is no error checking so if you put in an invalid file name you get no message.
Here is how I ran it in my HP-UX and Linux performance comparison tests:
HP-UX: $ time ./createfile /var/opt/oracle/db01/bobby/test 1024 Bytes per second written = 107374182 real 0m10.36s user 0m0.01s sys 0m1.79s Linux: $ time ./createfile /oracle/db01/bobby/test 1024 Bytes per second written = 23860929 real 0m45.166s user 0m0.011s sys 0m2.472s
It makes me think that my Linux system’s write I/O is slower. I found a set of arguments to the utility dd that seems to do the same thing on Linux:
$ dd if=/dev/zero bs=65536 count=16384 of=test oflag=dsync 16384+0 records in 16384+0 records out 1073741824 bytes (1.1 GB) copied, 38.423 s, 27.9 MB/s
But I couldn’t find an option like dsync on the HP-UX version of dd. In any case, it was nice to have the C code so I could experiment with various options to open(). I used tusc on hp-ux and strace on Linux and found the open options to some activity in the system tablespace. By grepping for open I found the options Oracle uses:
hp trace open("/var/opt/oracle/db01/HPDB/dbf/system01.dbf", O_RDWR|0x800|O_DSYNC, 030) = 8 linux trace open("/oracle/db01/LINUXDB/dbf/system01.dbf", O_RDWR|O_DSYNC) = 8
So, I modified my program to use the O_DSYNC flag and it was the same as using O_SYNC. But, the point is that having a simple C program lets you change these options to open() directly.
I hope this program will be useful to others as it has to me.
p.s. Similar program for sequentially reading through file, but with 256 K buffers: zip