Add DB_RF_NOPREFETCH to dbuf_read()s in dnode.c
Prefetching of dnodes in dbuf_read() can cause significant mutex contention for some workloads and isn't very helpful. This is because we already get 32 dnodes for each block read, and when iterating over a directory we prefetch the dnodes in the directory. Disable this prefetching to prevent the lock contention. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Submitted-by: Adam Moss <c@yotes.com> Submitted-by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: Adam Moss <c@yotes.com> Closes #10877 Closes #10953
This commit is contained in:
parent
2e407941a2
commit
acfd2d4641
@ -1355,7 +1355,8 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag, int slots,
|
||||
* We do not need to decrypt to read the dnode so it doesn't matter
|
||||
* if we get the encrypted or decrypted version.
|
||||
*/
|
||||
err = dbuf_read(db, NULL, DB_RF_CANFAIL | DB_RF_NO_DECRYPT);
|
||||
err = dbuf_read(db, NULL, DB_RF_CANFAIL |
|
||||
DB_RF_NO_DECRYPT | DB_RF_NOPREFETCH);
|
||||
if (err) {
|
||||
DNODE_STAT_BUMP(dnode_hold_dbuf_read);
|
||||
dbuf_rele(db, FTAG);
|
||||
@ -2396,7 +2397,8 @@ dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
|
||||
return (SET_ERROR(ESRCH));
|
||||
}
|
||||
error = dbuf_read(db, NULL,
|
||||
DB_RF_CANFAIL | DB_RF_HAVESTRUCT | DB_RF_NO_DECRYPT);
|
||||
DB_RF_CANFAIL | DB_RF_HAVESTRUCT |
|
||||
DB_RF_NO_DECRYPT | DB_RF_NOPREFETCH);
|
||||
if (error) {
|
||||
dbuf_rele(db, FTAG);
|
||||
return (error);
|
||||
|
Loading…
Reference in New Issue
Block a user