Skip to content

nasbackup.sh: add bandwidth throttle via -b flag#12846

Closed
jmsperu wants to merge 1 commit intoapache:4.20from
jmsperu:fix/nasbackup-bandwidth-throttle
Closed

nasbackup.sh: add bandwidth throttle via -b flag#12846
jmsperu wants to merge 1 commit intoapache:4.20from
jmsperu:fix/nasbackup-bandwidth-throttle

Conversation

@jmsperu
Copy link

@jmsperu jmsperu commented Mar 17, 2026

Summary

  • Add -b/--bandwidth flag (MiB/s) to limit backup I/O impact on production workloads
  • Running VMs: throttles QEMU push backup via virsh blockjob --bandwidth per disk
  • Stopped VMs: uses qemu-img convert -r rate limit + ionice -c 3 (idle I/O class)
  • No bandwidth limit by default — existing behavior preserved

Motivation

Backup jobs on shared storage can saturate I/O bandwidth and degrade performance for production VMs on the same host or NAS. This is especially problematic during business hours or when multiple VMs are being backed up concurrently.

The bandwidth limit can be passed by the CloudStack agent based on a global or per-repository setting, giving admins control over backup impact.

Test plan

  • Backup without -b — verify no throttling, identical to current behavior
  • Backup running VM with -b 50 — verify blockjob --bandwidth applied, check domjobinfo shows throttled rate
  • Backup stopped VM with -b 50 — verify ionice -c 3 and -r 50M in process list
  • Verify backup completes successfully with throttling enabled

Add -b/--bandwidth flag (MiB/s) to limit backup I/O impact on
production workloads.

For running VMs: uses virsh blockjob --bandwidth to throttle the
QEMU push backup job per disk.
For stopped VMs: uses qemu-img convert -r rate limit and ionice -c 3
(idle I/O class) to minimize impact on other VMs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@codecov
Copy link

codecov bot commented Mar 18, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 16.24%. Comparing base (61afb4c) to head (6c8526e).
⚠️ Report is 4 commits behind head on 4.20.

Additional details and impacted files
@@            Coverage Diff            @@
##               4.20   #12846   +/-   ##
=========================================
  Coverage     16.24%   16.24%           
  Complexity    13411    13411           
=========================================
  Files          5664     5664           
  Lines        500463   500463           
  Branches      60779    60779           
=========================================
+ Hits          81308    81312    +4     
+ Misses       410059   410058    -1     
+ Partials       9096     9093    -3     
Flag Coverage Δ
uitests 4.15% <ø> (ø)
unittests 17.10% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds optional bandwidth throttling to the KVM NAS backup script to reduce backup I/O impact during running-VM and stopped-VM backups.

Changes:

  • Introduces a -b|--bandwidth CLI option and updates usage text accordingly.
  • Applies bandwidth limiting to running-VM backups via virsh blockjob --bandwidth.
  • Applies bandwidth limiting to stopped-VM backups via qemu-img convert rate limiting and ionice.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Comment on lines +108 to +111
for disk in $(virsh -c qemu:///system domblklist $VM --details 2>/dev/null | awk '/disk/{print$3}'); do
virsh -c qemu:///system blockjob $VM $disk --bandwidth "${BANDWIDTH}" 2>/dev/null || true
done
log -ne "Backup bandwidth limited to ${BANDWIDTH} MiB/s per disk for $VM"
Comment on lines +106 to +110
# Throttle backup bandwidth if requested (MiB/s per disk)
if [[ -n "$BANDWIDTH" ]]; then
for disk in $(virsh -c qemu:///system domblklist $VM --details 2>/dev/null | awk '/disk/{print$3}'); do
virsh -c qemu:///system blockjob $VM $disk --bandwidth "${BANDWIDTH}" 2>/dev/null || true
done
for disk in $DISK_PATHS; do
volUuid="${disk##*/}"
qemu-img convert -O qcow2 $disk $dest/$name.$volUuid.qcow2 | tee -a "$logFile"
ionice -c 3 qemu-img convert $([[ -n "$BANDWIDTH" ]] && echo "-r" "${BANDWIDTH}M") -O qcow2 $disk $dest/$name.$volUuid.qcow2 | tee -a "$logFile"
for disk in $DISK_PATHS; do
volUuid="${disk##*/}"
qemu-img convert -O qcow2 $disk $dest/$name.$volUuid.qcow2 | tee -a "$logFile"
ionice -c 3 qemu-img convert $([[ -n "$BANDWIDTH" ]] && echo "-r" "${BANDWIDTH}M") -O qcow2 $disk $dest/$name.$volUuid.qcow2 | tee -a "$logFile"
@DaanHoogland DaanHoogland added this to the 4.20.4 milestone Mar 19, 2026
@abh1sar
Copy link
Contributor

abh1sar commented Mar 24, 2026

@jmsperu Please see #12848 (comment)
That applies here also

jmsperu added a commit to jmsperu/cloudstack that referenced this pull request Mar 26, 2026
… integrity check

Adds four optional features to NAS backup operations, configurable at
zone scope via CloudStack global settings:

- Compression (-c): qcow2 internal compression of backup files
  Config: nas.backup.compression.enabled (default: false)

- LUKS Encryption (-e): encrypt backup files at rest using qemu-img
  Config: nas.backup.encryption.enabled (default: false)
  Config: nas.backup.encryption.passphrase (Secure category)

- Bandwidth Throttle (-b): limit backup I/O bandwidth via virsh
  blockjob for running VMs or qemu-img -r for stopped VMs
  Config: nas.backup.bandwidth.limit.mbps (default: 0/unlimited)

- Integrity Check (--verify): qemu-img check after backup creation
  Config: nas.backup.integrity.check (default: false)

All features are disabled by default and fully backward compatible.
Settings are read from zone-scoped ConfigKeys in NASBackupProvider,
passed to the KVM agent via TakeBackupCommand details map, and
translated to nasbackup.sh CLI flags in LibvirtTakeBackupCommandWrapper.

Changes:
- nasbackup.sh: add -c, -b, -e, --verify flags with encrypt_backup()
  and verify_backup() helper functions
- TakeBackupCommand.java: add details map for passing config to agent
- NASBackupProvider.java: add 5 ConfigKeys, populate command details
- LibvirtTakeBackupCommandWrapper.java: extract details, build CLI args,
  handle passphrase temp file lifecycle

Combines and supersedes PRs apache#12844, apache#12846, apache#12848, apache#12845
@jmsperu
Copy link
Author

jmsperu commented Mar 26, 2026

Superseded by #12898 which combines this with the other nasbackup enhancement PRs and adds the Java management server changes requested by @abh1sar in #12848.

@jmsperu jmsperu closed this Mar 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants