We now present the performance results for our implementation of Semi-preemptible IO. Our experiments aimed to answer the following questions:
In order to answer these questions, we have implemented a prototype system which can service IO requests using either the traditional non-preemptible method (non-preemptible IO) or Semi-preemptible IO. Our prototype runs as a user-level process in Linux and talks directly to a SCSI disk using the Linux SCSI-generic interface. The prototype uses the logical-to-physical block mapping of the disk, the seek curves, and the rotational skew times, all of which are automatically generated by the Diskbench [7]. All experiments were performed on a Pentium III MHz machine with a Seagate STLW SCSI disk. This SCSI disk has two tracks per cylinder, with to blocks per track depending on the disk zone. The total disk capacity is GB. The rotational speed of the disk is RPM. The maximum sequential disk throughput is between and MBps.
For performance benchmarking, we performed two sets of experiments. First, we tested the preemptibility of the system using simulated IO workload. For the simulated workload, we used equal-sized IO requests within each experiment. The low-priority IOs are for data located at random positions on the disk. In the experiments where we actually performed preemption, the higher-priority IO requests were also at random positions. However, their size was set to only one block in order to provide the lower estimate for preemption overhead. We tested the preemptibility under first-come-first-serve (FCFS) and elevator disk scheduling policies. In the second set of experiments we used trace workload obtained on the tested Linux system. We obtained the traces from the instrumented Linux-kernel disk-driver. In the simulated experiments, non-preemptible IOs are serviced using chunk sizes of kB. This is the size used by Linux and FreeBSD for breaking up large IOs. We assume that a large IO cannot be preempted between chunks, since such is the case for current operating systems. On the other hand, our prototype services larger IOs using multiple disk commands and preemption is possible after each disk command is completed. Based on disk profiling, our prototype used the following parameters for Semi-preemptible IO. Chunking divided the data transfer into chunks of disk blocks each, except for the last chunk, which can be smaller. JIT-seek used an offset of ms to reduce the probability of prediction errors. Seeks for more than a half of the disk size in cylinders were split into two equal-sized, smaller seeks. We used the SCSI seek command to perform sub-seeks.