• Kazuo Ito's avatar
    dm kcopyd: avoid queue shuffle · b673c3a8
    Kazuo Ito authored
    Write throughput to LVM snapshot origin volume is an order
    of magnitude slower than those to LV without snapshots or
    snapshot target volumes, especially in the case of sequential
    writes with O_SYNC on.
    
    The following patch originally written by Kevin Jamieson and
    Jan Blunck and slightly modified for the current RCs by myself
    tries to improve the performance by modifying the behaviour
    of kcopyd, so that it pushes back an I/O job to the head of
    the job queue instead of the tail as process_jobs() currently
    does when it has to wait for free pages. This way, write
    requests aren't shuffled to cause extra seeks.
    
    I tested the patch against 2.6.27-rc5 and got the following results.
    The test is a dd command writing to snapshot origin followed by fsync
    to the file just created/updated.  A couple of filesystem benchmarks
    gave me similar results in case of sequential writes, while random
    writes didn't suffer much.
    
    dd if=/dev/zero of=<somewhere on snapshot origin> bs=4096 count=...
       [conv=notrunc when updating]
    
    1) linux 2.6.27-rc5 without the patch, write to snapshot origin,
    average throughput (MB/s)
                         10M     100M    1000M
    create,dd         511.46   610.72    11.81
    create,dd+fsync     7.10     6.77     8.13
    update,dd         431.63   917.41    12.75
    update,dd+fsync     7.79     7.43     8.12
    
    compared with write throughput to LV without any snapshots,
    all dd+fsync and 1000 MiB writes perform very poorly.
    
                         10M     100M    1000M
    create,dd         555.03   608.98   123.29
    create,dd+fsync   114.27    72.78    76.65
    update,dd         152.34  1267.27   124.04
    update,dd+fsync   130.56    77.81    77.84
    
    2) linux 2.6.27-rc5 with the patch, write to snapshot origin,
    average throughput (MB/s)
    
                         10M     100M    1000M
    create,dd         537.06   589.44    46.21
    create,dd+fsync    31.63    29.19    29.23
    update,dd         487.59   897.65    37.76
    update,dd+fsync    34.12    30.07    26.85
    
    Although still not on par with plain LV performance -
    cannot be avoided because it's copy on write anyway -
    this simple patch successfully improves throughtput
    of dd+fsync while not affecting the rest.
    Signed-off-by: default avatarJan Blunck <jblunck@suse.de>
    Signed-off-by: default avatarKazuo Ito <ito.kazuo@oss.ntt.co.jp>
    Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
    Cc: stable@kernel.org
    b673c3a8
dm-kcopyd.c 13.7 KB