]> git.proxmox.com Git - mirror_zfs.git/commit - module/zfs/dmu_objset.c
OpenZFS 6988 spa_sync() spends half its time in dmu_objset_do_userquota_updates
authorJinshan Xiong <jinshan.xiong@intel.com>
Wed, 21 Sep 2016 20:49:47 +0000 (13:49 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Oct 2016 16:45:13 +0000 (09:45 -0700)
commit9b7a83cbb6cae54c127fde4c83e73505ad9c9e73
tree1b6d67d481b0bd4a9e2b36af04ad95d96485516b
parent1de321e6260f5b83eb943b6ce2166a3879f42df4
OpenZFS 6988 spa_sync() spends half its time in dmu_objset_do_userquota_updates

Using a benchmark which creates 2 million files in one TXG, I observe
that the thread running spa_sync() is on CPU almost the entire time we
are syncing, and therefore can be a performance bottleneck. About 50% of
the time in spa_sync() is in dmu_objset_do_userquota_updates().

The problem is that dmu_objset_do_userquota_updates() calls
zap_increment_int(DMU_USERUSED_OBJECT) once for every file that was
modified (or created). In this benchmark, all the files are owned by the
same user/group, so all 2 million calls to zap_increment_int() are
modifying the same entry in the zap. The same issue exists for the
DMU_GROUPUSED_OBJECT.

We should keep an in-memory map from user to space delta while we are
syncing, and when we finish, iterate over the in-memory map and modify
the ZAP once per entry. This reduces the number of calls to
zap_increment_int() from "number of objects modified" to "number of
owners/groups of modified files".

This reduced the time spent in spa_sync() in the file create benchmark
by ~33%, from 11 seconds to 7 seconds.

Upstream bugs: DLPX-44799
Ported by: Ned Bass <bass6@llnl.gov>

OpenZFS-issue: https://www.illumos.org/issues/6988
ZFSonLinux-issue: https://github.com/zfsonlinux/zfs/issues/4642
OpenZFS-commit: unmerged

Porting notes:
- Added curly braces around declaration of userquota_cache_t cache to
  quiet compiler warning;
- Handled the userobj accounting the same way it proposed in this path.

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
module/zfs/dmu_objset.c
module/zfs/dnode.c