mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 10:54:35 +03:00
DDT: Reduce global DDT lock scope during writes
Before this change DDT lock was taken 4 times per written block, and as effectively a pool-wide lock it can be highly congested. This change introduces a new per-entry dde_io_lock, protecting some fields during I/O ready and done stages, so that we don't need the global lock there. According to my write tests on 64-thread system with 4KB blocks this significantly reduce the global lock contention, reducing CPU usage from 100% to expected ~80%, and increasing write throughput by 10%. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Rob Norris <robn@despairlabs.com> Signed-off-by: Alexander Motin <alexander.motin@TrueNAS.com> Closes #17960
This commit is contained in:
@@ -1010,6 +1010,7 @@ ddt_alloc_entry_io(ddt_entry_t *dde)
|
||||
return;
|
||||
|
||||
dde->dde_io = kmem_zalloc(sizeof (ddt_entry_io_t), KM_SLEEP);
|
||||
mutex_init(&dde->dde_io->dde_io_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1022,6 +1023,7 @@ ddt_free(const ddt_t *ddt, ddt_entry_t *dde)
|
||||
if (dde->dde_io->dde_repair_abd != NULL)
|
||||
abd_free(dde->dde_io->dde_repair_abd);
|
||||
|
||||
mutex_destroy(&dde->dde_io->dde_io_lock);
|
||||
kmem_free(dde->dde_io, sizeof (ddt_entry_io_t));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user