TL/DR: -Parallelism parameter may be reduced by available task slots on the repository. e.g -Parallelism=8 may be reduced to 6 or 2 or 1 depending on other tasks.
Additional thoughts regarding the feature request for guaranteeing parallelism:
The two motivating factors for guaranteeing a specific number of backup streams are:
1. Ensure backups complete within a designated backup window. This avoids negative production impacts.
2. Ensure restores can complete within a specific amount of time. This allows us to hit our RTO.
For a multi-TB database, both these points become crucial as we've seen backup times go from ~2 hours to ~12 with analogous potential restore time increases as well. Having a 10+ hr variance in RTO in unacceptable.
- Sometimes we are ok with less streams, even 1.
- Sometimes we want to wait for slots to become available.
- Sometimes we would be ok with less than requested as long as we get a set minimum.
- Sometimes we want to fail if a backup can't be taken with the requested number of streams.
Making the -Parallelism parameter behave as documented would be a breaking change.
2 additional parameters are needed to accomplish this without changing existing behavior:
-MinParallelism -- required minimum number of streams to run job. (defaults to 1)
-ResourceWaitTimeout -- Minutes to wait for resources to become available, (defaults to infinite) after that, error out.
Adding these two parameters would give customers the ability to ensure they stay within their backup window and hit specific RTO objectives. Existing behavior could remain unchanged as it is equivalent to -MinParallelism=1 and -ResourceWaitTimeout=infinite
Alternatively, you could modify the existing Parallelism parameter to actually do what it is documented to do, but we would still need the new timeout parameter.
Some special cases, like specifying -MinParallelism=48 when the repo only has 10 slots should fast fail instead of waiting forever.
final thoughts:
As an enterprise DBA, I need consistency and predictability for backup jobs (and hence control over parallelism). it's much easier for me to troubleshoot backup job failures versus random variations in backup time caused by the complex interplay of whatever else happens to be using task slots at the time I kick off a SQL Backup. a simple error message "insufficient repository tasks slots are available" would have probably eliminated the need for this support case.