Volume overrides

Volume disk set overrides (in short: volume overrides) refer to changing the target disk sets for particular object IDs of a volume with different disks than the ones inherited from a parent snapshot or created by the allocator.


This feature is useful when many volumes are created from the same parent snapshot, which is the usual case when a virtual machine template is used to create many virtual machines ending up with the same OS root disk type. These are usually the same OS and filesystem type, as well as behaviour. In the common case the filesystem journal will be overwritten on the same block device offset for all such volumes. For example, a cron job running on all such virtual machines at the same time (for example, unattended upgrade) will lead to writes to this same exact object or set of objects with the same couple of disks in the cluster, ending up processing all these writes. This ends up causing an excessive load on this set of disks in the cluster, which will lead to degraded performance when these drives start to aggregate all the overwritten data, or just from the extra load.

How to use it

A set of tools could now be used to collect metadata for all objects from each of the disks from the API, and analyze which objects are with the most excessive number of writes in the cluster. These tools will calculate proper overrides for such objects, so that even in case of an excessive load on these particular offsets on all volumes created out of the same parent, they will end up on different sets of disks instead of the ones inherited from the parent snapshot in the original virtual machine template.

The way the tooling is designed to work is by looking for a template called overrides which placeTail parameter is used as a target placement group for the disks used as replacement for the most overwritten objects. For example, if a cluster has one template with hybrid placement (one or more replicas on HDDs and tail on SSD or NVMe drives), an override would have to be the SSD or NVME placement group. An example:

| template  | size  | rdnd. | placeHead | placeAll | placeTail | iops  |  bw   | parent | flags |
| hybrid    |     - |     3 | hdd       | hdd      | ssd       |     - |     - |        |       |
| overrides |     - |     - | default   | default  | ssd       |     - |     - |        |       |

Multiple templates will use the same overrides template placeTail specification. An example would be an SSD only and HDD-only template, in which case the drives for the top most overwritten objects will be overridden with SSD disks.

The tool to collect and compute overrides is /usr/lib/storpool/collect_override_data, and the resulting overrides.json file could be loaded in the following ways:

  • To load the overrides:

    # storpool balancer override add-from-file ./overrides.json
  • To see how the data will be re-distributed:

    # storpool balancer disks
  • To actually load them for redistribution:

    # storpool balancer commit

Note that once overrides are loaded, on future re-balancing operations the overrides will be re-calculated. For more information about balancing, see 18.  Rebalancing the cluster.


As of 19.3 revision 19.01.2268.656ce3b10 loaded overrides are visible with storpool balancer disks and require a storpool balancer commit to be applied.

The default number of top objects to be overridden is 9600, or 300GiB of virtual space. This could be specified as the MAX_OBJ_COUNT environment variable to collect_override_data tool.


This feature is available starting with release 19.1 revision 19.01.1511.0b533fb.