A nightly dump reading the entire database saturates the disk queue, and every application query behind it waits — so the backup window is also a latency incident nobody attributes to the backup.
ionice -c2 -n7 nice -n19 mysqldump --single-transaction shop
| gzip -1 > /backup/shop.sql.gz
# -c2 -n7 best-effort class, lowest priority
# nice -19 the same for CPU
# gzip -1 because -9 is CPU-bound and the disk is the constraint
The two together are what make it invisible: I/O priority alone still leaves gzip competing for CPU with php-fpm. gzip -1 rather than -9 is the counterintuitive part — the compression ratio difference on a SQL dump is a few percent and the CPU difference is several times, so the low setting finishes sooner and interferes less. On a machine with cgroup v2, a systemd slice with an IO weight is the more thorough version of the same idea.