From 2d8f72d76c8b928c51d38d50a3f4f75144db3f85 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Thu, 21 Jan 2021 13:55:54 -0700 Subject: [PATCH] zpool: speed up importing large pools (#11469) The ZFS_IOC_POOL_TRYIMPORT ioctl returns an nvlist from the kernel to a preallocated buffer in userland. Userland must guess how large the buffer should be. If it undersizes it, it must reallocate and try again. That can cost a lot of time for large pools. OpenZFS commit 28b40c8a6e3 set the guess at "zc.zc_nvlist_conf_size * 4" without explanation. On my system, that is too small. From experiment, x 32 is a better multiplier. But I don't know how to calculate it theoretically. Sponsored by: Axcient Reviewed-by: Brian Behlendorf Reviewed-by: Alek Pinchuk Signed-off-by: Alan Somers Closes #11469 --- lib/libzfs/libzfs_import.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libzfs/libzfs_import.c b/lib/libzfs/libzfs_import.c index 44d3ade496..64fa31c67d 100644 --- a/lib/libzfs/libzfs_import.c +++ b/lib/libzfs/libzfs_import.c @@ -77,7 +77,7 @@ refresh_config(libzfs_handle_t *hdl, nvlist_t *config) if (zcmd_write_conf_nvlist(hdl, &zc, config) != 0) return (NULL); - dstbuf_size = MAX(CONFIG_BUF_MINSIZE, zc.zc_nvlist_conf_size * 4); + dstbuf_size = MAX(CONFIG_BUF_MINSIZE, zc.zc_nvlist_conf_size * 32); if (zcmd_alloc_dst_nvlist(hdl, &zc, dstbuf_size) != 0) { zcmd_free_nvlists(&zc);