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
ST
LW 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.