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
7b353d2c8c
commit
edd23dba81
|
@ -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
|
* We do not need to decrypt to read the dnode so it doesn't matter
|
||||||
* if we get the encrypted or decrypted version.
|
* 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) {
|
if (err) {
|
||||||
DNODE_STAT_BUMP(dnode_hold_dbuf_read);
|
DNODE_STAT_BUMP(dnode_hold_dbuf_read);
|
||||||
dbuf_rele(db, FTAG);
|
dbuf_rele(db, FTAG);
|
||||||
|
@ -2396,7 +2397,8 @@ dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
|
||||||
return (SET_ERROR(ESRCH));
|
return (SET_ERROR(ESRCH));
|
||||||
}
|
}
|
||||||
error = dbuf_read(db, NULL,
|
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) {
|
if (error) {
|
||||||
dbuf_rele(db, FTAG);
|
dbuf_rele(db, FTAG);
|
||||||
return (error);
|
return (error);
|
||||||
|
|
Loading…
Reference in New Issue