• Nikos Tsironis's avatar
    dm snapshot: Use fine-grained locking scheme · 3f1637f2
    Nikos Tsironis authored
    Substitute the global locking scheme with a fine grained one, employing
    the read-write semaphore and the scalable exception tables with
    per-bucket locks introduced by the previous two commits.
    
    Summarizing, we now use a read-write semaphore to protect the mostly
    read fields of the snapshot structure, e.g., valid, active, etc., and
    per-bucket bit spinlocks to protect accesses to the complete and pending
    exception tables.
    
    Finally, we use an extra spinlock (pe_allocation_lock) to serialize the
    allocation of new exceptions by the exception store. This allocation is
    really fast, so the extra spinlock doesn't hurt the performance.
    
    This scheme allows dm-snapshot to scale better, resulting in increased
    IOPS and reduced latency.
    
    Following are some benchmark results using the null_blk device:
    
      modprobe null_blk gb=1024 bs=512 submit_queues=8 hw_queue_depth=4096 \
       queue_mode=2 irqmode=1 completion_nsec=1 nr_devices=1
    
    * Benchmark fio_origin_randwrite_throughput_N, from the device mapper
      test suite [1] (direct IO, random 4K writes to origin device, IO
      engine libaio):
    
      +--------------+-------------+------------+
      | # of workers | IOPS Before | IOPS After |
      +--------------+-------------+------------+
      |      1       |    57708    |   66421    |
      |      2       |    63415    |   77589    |
      |      4       |    67276    |   98839    |
      |      8       |    60564    |   109258   |
      +--------------+-------------+------------+
    
    * Benchmark fio_origin_randwrite_latency_N, from the device mapper test
      suite [1] (direct IO, random 4K writes to origin device, IO engine
      psync):
    
      +--------------+-----------------------+----------------------+
      | # of workers | Latency (usec) Before | Latency (usec) After |
      +--------------+-----------------------+----------------------+
      |      1       |         16.25         |        13.27         |
      |      2       |         31.65         |        25.08         |
      |      4       |         55.28         |        41.08         |
      |      8       |         121.47        |        74.44         |
      +--------------+-----------------------+----------------------+
    
    * Benchmark fio_snapshot_randwrite_throughput_N, from the device mapper
      test suite [1] (direct IO, random 4K writes to snapshot device, IO
      engine libaio):
    
      +--------------+-------------+------------+
      | # of workers | IOPS Before | IOPS After |
      +--------------+-------------+------------+
      |      1       |    72593    |   84938    |
      |      2       |    97379    |   134973   |
      |      4       |    90610    |   143077   |
      |      8       |    90537    |   180085   |
      +--------------+-------------+------------+
    
    * Benchmark fio_snapshot_randwrite_latency_N, from the device mapper
      test suite [1] (direct IO, random 4K writes to snapshot device, IO
      engine psync):
    
      +--------------+-----------------------+----------------------+
      | # of workers | Latency (usec) Before | Latency (usec) After |
      +--------------+-----------------------+----------------------+
      |      1       |         12.53         |         10.6         |
      |      2       |         19.78         |        14.89         |
      |      4       |         40.37         |        23.47         |
      |      8       |         89.32         |        48.48         |
      +--------------+-----------------------+----------------------+
    
    [1] https://github.com/jthornber/device-mapper-test-suiteCo-developed-by: default avatarIlias Tsitsimpis <iliastsi@arrikto.com>
    Signed-off-by: default avatarNikos Tsironis <ntsironis@arrikto.com>
    Acked-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    3f1637f2
dm-snap.c 61.9 KB