On 11/11/2020 06:17, Damien Le Moal wrote: > With memory backing disabled, using a single spinlock for protecting > zone information and zone resource management prevent the parallel > execution on multiple queue of IO requests to different zones. > Furthermore, regardless of the use of memory backing, if a null_blk > device is created without limits on the number of opn and active zone open ~^ zones ~^ > accounting for zone resource management is not necessary. > > From these observations, zone locking is changed as follow to improve follows? ~^ > performance: > 1) the zone_lock spinlock is renamed zone_res_lock and used only if zone > resource management is necessary, that is, if either zone_max_open or > zone_max_active are not 0. This is indicated using the new boolean > need_zone_res_mgmt in the nullb_device structure. null_zone_write() > is modified to reduce the amount of code executed with the > zone_res_lock spinlock held. null_zone_valid_read_len() is also > modified to avoid taking the zone lock before calling > null_process_cmd() for read operations in null_process_zoned_cmd(). > 2) With memory backing disabled, per zone locking is changed to a > spinlock per zone. > > With these changes, fio performance with zonemode=zbd for 4K random > read and random write on a dual socket (24 cores per socket) machine > using the none schedulder is as follows: scheduler ~^ > > before patch: > write (psync x 96 jobs) = 465 KIOPS > read (libaio@qd=8 x 96 jobs) = 1361 KIOPS > after patch: > write (psync x 96 jobs) = 468 KIOPS > read (libaio@qd=8 x 96 jobs) = 3340 KIOPS > > Write performance remains mostly unchanged but read performance more > than double. Performance when using the mq-deadline scheduler is not doubles ~^