Tuesday, November 29, 2005

PATA really, really sucks

Trying to figure out why sometimes disk access on my test machine takes way, way too long -- 1000+ ms -- I wrote some test code. My threads ran a function that looks like this:

write = []
def writer():
    while True:
        start = time.time()
        f = tempfile.TemporaryFile()
        f.write('a' * 4000)
        end = time.time()
        write.append(end - start)

Compare the times for max(write) on a machine with a SATA disk and on one with parallel ATA, where the given number of threads are run for a 10 second period:

threads         pata    sata
1               6ms      6ms
2               400ms   11ms   
4               1300ms  24ms


I admit I'm not a hardware nerd. Quite possibly I'm missing something, because even PATA shouldn't be THAT bad. Right? hdparm -i says for the PATA disk:


 Model=ST380011A, FwRev=8.01, SerialNo=4JV59KZT
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=156301488
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: ATA/ATAPI-6 T13 1410D revision 2:

 * signifies the current active mode


Anonymous said...

Your SATA interface probably supports something like native command queueing?

This isn't supported by PATA but a lot of the newer SATA chipsets support this, so a hard disk receives all blocks and can it reorder like it preferes.

Anonymous said...

When you send command to a ide unit, ide is supposed to wait until the drive answers, ie: you've to wait until the command is answered before submitting the second command, which may be what you're seeing (of course things get _much_ worse when you've two hard drives in the same ide cable...)

Anyway - what you're measuring is maxmum latency. What about throughput?