aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Motin <[email protected]>2019-11-11 20:27:59 +0300
committerBrian Behlendorf <[email protected]>2019-11-11 09:27:59 -0800
commitf15d6a54575567c6d69b6f1ffc000d2df5a8f206 (patch)
treeecd75206966787c0eb941590fa0216123b42b0a7
parent2f1ca8a32af1c405fc5735673cc3f24f35465b68 (diff)
Improve logging of 128KB writes
Before my ZIL space optimization few years ago 128KB writes were logged as two 64KB+ records in two 128KB log blocks. After that change it became ~127KB+/1KB+ in two 128KB log blocks to free space in the second block for another record. Unfortunately in case of 128KB only writes, when space in the second block remained unused, that change increased write latency by unbalancing checksum computation and write times between parallel threads. It also didn't help with SLOG space efficiency in that case. This change introduces new 68KB log block size, used for both writes below 67KB and 128KB-sharp writes. Writes of 68-127KB are still using one 128KB block to not increase processing overhead. Writes above 131KB are still using full 128KB blocks, since possible saving there is small. Mixed loads will likely also fall back to previous 128KB, since code uses maximum of the last 16 requested block sizes. Reviewed-by: Matt Ahrens <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Closes #9409
-rw-r--r--module/zfs/zil.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/module/zfs/zil.c b/module/zfs/zil.c
index 6ca0bc73e..1c122f35a 100644
--- a/module/zfs/zil.c
+++ b/module/zfs/zil.c
@@ -1414,11 +1414,17 @@ zil_lwb_write_open(zilog_t *zilog, lwb_t *lwb)
* aligned to 4KB) actually gets written. However, we can't always just
* allocate SPA_OLD_MAXBLOCKSIZE as the slog space could be exhausted.
*/
-uint64_t zil_block_buckets[] = {
- 4096, /* non TX_WRITE */
- 8192+4096, /* data base */
- 32*1024 + 4096, /* NFS writes */
- UINT64_MAX
+struct {
+ uint64_t limit;
+ uint64_t blksz;
+} zil_block_buckets[] = {
+ { 4096, 4096 }, /* non TX_WRITE */
+ { 8192 + 4096, 8192 + 4096 }, /* database */
+ { 32768 + 4096, 32768 + 4096 }, /* NFS writes */
+ { 65536 + 4096, 65536 + 4096 }, /* 64KB writes */
+ { 131072, 131072 }, /* < 128KB writes */
+ { 131072 +4096, 65536 + 4096 }, /* 128KB writes */
+ { UINT64_MAX, SPA_OLD_MAXBLOCKSIZE}, /* > 128KB writes */
};
/*
@@ -1502,9 +1508,9 @@ zil_lwb_write_issue(zilog_t *zilog, lwb_t *lwb)
* pool log space.
*/
zil_blksz = zilog->zl_cur_used + sizeof (zil_chain_t);
- for (i = 0; zil_blksz > zil_block_buckets[i]; i++)
+ for (i = 0; zil_blksz > zil_block_buckets[i].limit; i++)
continue;
- zil_blksz = MIN(zil_block_buckets[i], zilog->zl_max_block_size);
+ zil_blksz = MIN(zil_block_buckets[i].blksz, zilog->zl_max_block_size);
zilog->zl_prev_blks[zilog->zl_prev_rotor] = zil_blksz;
for (i = 0; i < ZIL_PREV_BLKS; i++)
zil_blksz = MAX(zil_blksz, zilog->zl_prev_blks[i]);