hammer2 - Increase bulkfree buffer size request and cap
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 1 Apr 2018 05:02:22 +0000 (22:02 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 1 Apr 2018 05:02:22 +0000 (22:02 -0700)
* Increase the kernel buffer size cap for hammer2 cleanups
  (aka bulkfree's) from 64MB to 1/16 physical memory.  Systems
  with more memory can accomodate larger in-memory bulkfree bitmap
  buffers.  Systems with less memory simply do multiple scan
  passes as per usual.

* Increase the buffer size requested by the hammer2 utility
  from 8MB to 1/16 physical memory.  The actual amount of memory
  allocated by the kernel will be 32MB per 1TB of filesystem, up to
  the cap.

* This will generally reduce the number of scans required for
  a 4TB filesystem from 16 to 1, meaning that bulkfree will take
  1/16 the time as it did before for a filesystem of that size.

  For example, a system with 128GB of ram would be able to
  request up to 8GB of buffer which can accomodate a bulkfree
  operation on a 256TB filesystem in a single pass.

sbin/hammer2/cmd_bulkfree.c
sys/vfs/hammer2/hammer2_bulkfree.c

index cdd3614..7029627 100644 (file)
@@ -41,9 +41,17 @@ cmd_bulkfree(const char *sel_path)
        int ecode;
        int fd;
        int res;
+       size_t usermem;
+       size_t usermem_size = sizeof(usermem);
 
        bzero(&bfi, sizeof(bfi));
-       bfi.size = 8192 * 1024;
+       usermem = 0;
+       if (sysctlbyname("hw.usermem", &usermem, &usermem_size, NULL, 0) == 0)
+               bfi.size = usermem / 16;
+       else
+               bfi.size = 0;
+       if (bfi.size < 8192 * 1024)
+               bfi.size = 8192 * 1024;
 
        if ((fd = hammer2_ioctl_handle(sel_path)) < 0)
                return 1;
index 07f5ce6..e6bbb95 100644 (file)
@@ -390,8 +390,8 @@ hammer2_bulkfree_pass(hammer2_dev_t *hmp, hammer2_chain_t *vchain,
               ~(size_t)(HAMMER2_FREEMAP_LEVELN_PSIZE - 1);
        if (size < 1024 * 1024)
                size = 1024 * 1024;
-       if (size > 64 * 1024 * 1024)
-               size = 64 * 1024 * 1024;
+       if (size > kmem_lim_size() * 1024 * 1024 / 16)
+               size = kmem_lim_size() * 1024 * 1024 / 16;
 
        cbinfo.hmp = hmp;
        cbinfo.bmap = kmem_alloc_swapbacked(&cbinfo.kp, size, VM_SUBSYS_HAMMER);