]>
Commit | Line | Data |
---|---|---|
7c82c597 CIK |
1 | Increase default zcmd allocation to 256K (LP: #567557) |
2 | ||
3 | When creating hundreds of clones (for example using containers with | |
4 | LXD) cloning slows down as the number of clones increases over time. | |
5 | The reason for this is that the fetching of the clone information | |
6 | using a small zcmd buffer requires two ioctl calls, one to determine | |
7 | the size and a second to return the data. However, this requires | |
8 | gathering the data twice, once to determine the size and again to | |
9 | populate the zcmd buffer to return it to userspace. | |
10 | ||
11 | These are expensive ioctl() calls, so instead, make the default buffer | |
12 | size much larger: 256K. This may sound large, but on 64 bit systems | |
13 | running ZFS this is not a huge chunk of memory for the speed | |
14 | improvement we gains for large sets of clones: | |
15 | ||
16 | 16K zcmd 256K zcmd | |
17 | Clones Time Clones Time Clone % improvement | |
18 | (secs) per sec (secs) per sec | |
19 | 100 7 14.29 5 20.00 28.57 | |
20 | 200 10 20.00 9 22.22 10.00 | |
21 | 300 19 15.79 18 16.67 5.26 | |
22 | 400 22 18.18 22 18.18 0.00 | |
23 | 500 29 17.24 29 17.24 0.00 | |
24 | 600 39 15.38 39 15.38 0.00 | |
25 | 700 46 15.22 45 15.56 2.17 | |
26 | 800 58 13.79 51 15.69 12.07 | |
27 | 900 74 12.16 61 14.75 17.57 | |
28 | 1000 90 11.11 74 13.51 17.78 | |
29 | 1100 98 11.22 87 12.64 11.22 | |
30 | 1200 102 11.76 95 12.63 6.86 | |
31 | 1300 113 11.50 104 12.50 7.96 | |
32 | 1400 143 9.79 109 12.84 23.78 | |
33 | 1500 145 10.34 132 11.36 8.97 | |
34 | 1600 165 9.70 145 11.03 12.12 | |
35 | 1700 187 9.09 156 10.90 16.58 | |
36 | 1800 210 8.57 166 10.84 20.95 | |
37 | 1900 226 8.41 183 10.38 19.03 | |
38 | 2000 256 7.81 198 10.10 22.66 | |
39 | 2200 311 7.07 238 9.24 23.47 | |
40 | 2400 373 6.43 271 8.86 27.35 | |
41 | 2600 487 5.34 316 8.23 35.11 | |
42 | 3000 619 4.85 426 7.04 31.18 | |
43 | 3400 915 3.72 549 6.19 40.00 | |
44 | 4000 1332 3.00 923 4.33 30.71 | |
45 | ||
46 | As one can see, with > 2000 clones we get 25-40% speed | |
47 | improvement. | |
48 | ||
49 | This patch was originally suggested by Brian Behlendorf | |
50 | (see https://github.com/zfsonlinux/zfs/issues/6372), however | |
51 | this fix is a more generic fix to cover all zcmd cases. | |
52 | ||
53 | Signed-off-by: Colin Ian King <colin.king@canonical.com> | |
54 | ||
55 | Index: zfs/lib/libzfs/libzfs_util.c | |
56 | =================================================================== | |
57 | --- zfs.orig/lib/libzfs/libzfs_util.c | |
58 | +++ zfs/lib/libzfs/libzfs_util.c | |
59 | @@ -1354,7 +1354,7 @@ int | |
60 | zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len) | |
61 | { | |
62 | if (len == 0) | |
63 | - len = 16 * 1024; | |
64 | + len = 256 * 1024; | |
65 | zc->zc_nvlist_dst_size = len; | |
66 | zc->zc_nvlist_dst = | |
67 | (uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size); |