IDE Performance Enhancements Version 2.0 ============================ =========== This version of hd.c includes support for two optional features: (1) The disk I/O routines can now run with interrupts unmasked most of the time, making them much friendlier to high speed serial ports and other system activity. (2) Support is included for IDE "Multiple Sector Mode", the use of which can reduce disk I/O kernel overhead by 10-30% on many systems, with a corresponding 10-20% increase in data throughput. By default, both features are DISABLED, for compatibility with systems on which they may cause troubles. The IRQ unmasking has been known to CORRUPT FILESYSTEMS in the past on systems with strange hard drives. Backup before trying! It works on most systems, but use at your own risk!! Drives which support "Multiple Sector Mode" are identified by the kernel at boot time, and a message is displayed indicating the largest possible setting for "MaxMult". I recommend using settings of 8, 16, or 32. Many drives also support non-powers of two, but many other drives do not -- try strange values at your own risk! For more detailed boot-time information about your drive, change the definition of VERBOSE_DRIVE_INFO from 0 to 1 near the top of hd.c and rebuild/reinstall the kernel. Some drives (mostly older CONNER drives) do not implement multiple mode correctly, and data corruption may occur.. but if you wait long enough the error recovery logic *should* be able to recover eventually. To try this out more safely, mount the drive's partitions read-only before using hdparm (see below) for the first time. If it doesn't work, email me (mlord@bnr.ca) with the drive name as displayed at boot time, so I can warn others and possibly add a hook to the code. To enable the features, a small program is included: hdparm.c This one is *different* from previous versions -- be sure to recompile it! Compile this using cc -O -o /usr/bin/hdparm hdparm.c and then use it to enable/disable the new features, as follows: To turn on 16-sector multiple mode, with interrupt unmasking: hdparm /dev/hda 16 1 To view the current settings: hdparm /dev/hda If you have more than one drive, a separate command would need to be issued for the second drive as well, using the same or different settings as desired: hdparm /dev/hdb 16 1 To turn off both features on the first drive, use: hdparm /dev/hda 0 0 To benchmark the performance difference, try: hdparm /dev/hda 0 0 sync time dd if=/dev/hda of=/dev/null bs=1024k count=30 time dd if=/dev/hda of=/dev/null bs=1024k count=30 time dd if=/dev/hda of=/dev/null bs=1024k count=30 hdparm /dev/hda 16 1 sync time dd if=/dev/hda of=/dev/null bs=1024k count=30 time dd if=/dev/hda of=/dev/null bs=1024k count=30 time dd if=/dev/hda of=/dev/null bs=1024k count=30 This gives before and after views. Compare the total elapsed times, as well as the percent of CPU used in each case. Run several trials to ensure/verify consistent results. Some drives are actually *slower* with multiple mode enabled, but those are very rare indeed. Most systems experience a 10-30% increase in throughput, with a corresponding 5-50% decrease in kernel/system CPU usage. If you are using linux kernel 1.1.4 or higher (with the "cluster" code), then you may not notice a big difference with the above tests. However, I have noticed that the iozone benchmark program does seem to work fairly reliably under kernels with the "cluster" code, so you could try that instead (under older kernels, iozone seems to give wildly varying results from trial to trial, at least on my system). To have your favorite settings installed automatically at boot time, place the hdparm command(s) into the /etc/rc.d/rc.local file. Alternatively, one could modify the DEFAULTs near the top of hd.c and rebuild and install the new kernel. Enjoy, mlord@bnr.ca