Skip to main content
RunBook Academy

Proxmox VEXXII · Operating as a Business ServiceBusiness of the platform

Defining and measuring an SLA

Advanced⏱ ~28 min

What you'll learn

  • Convert an availability target into an allowed-downtime budget and test whether it is achievable
  • Distinguish SLI, SLO and SLA, and explain why the internal target must be tighter than the contract
  • Measure availability from the service rather than from the hypervisor, and justify why
  • Write exclusions precisely enough that they cannot be argued about during an incident

Prerequisites

Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12

Not yet marked complete on this device.

“We offer 99.9% availability” is a sentence that gets written into service catalogues by people who have not done the arithmetic. It commits the platform to no more than 43 minutes and 12 seconds of downtime per month, and it is worth working out immediately whether a single rolling upgrade of the cluster fits inside that.

Usually it does not. Which does not mean the target is wrong — it means the number is only half the commitment, and the other half is the definitions around it.

The arithmetic

TargetPer monthPer quarterPer year
99%7 h 18 m21 h 54 m3 d 15 h
99.5%3 h 39 m10 h 57 m1 d 19 h
99.9%43 m 12 s2 h 10 m8 h 46 m
99.95%21 m 36 s1 h 5 m4 h 23 m
99.99%4 m 19 s12 m 58 s52 m 36 s
99.999%26 s1 m 18 s5 m 16 s

Two rows deserve comment.

99.99% is 4 minutes and 19 seconds per month. That is less time than it takes to reboot a guest. A single unplanned VM restart, anywhere in the month, exhausts the budget. Achieving it requires that no individual failure is user-visible, which means clustering inside the application, not underneath it.

99.999% is 26 seconds per month. No hypervisor platform delivers this, because the failure detection alone takes longer than the budget. If somebody asks for five nines, they are asking for an application architecture, and the conversation to have is about that rather than about the platform.

What Proxmox HA physically gives you

This is the ceiling, and it is worth deriving rather than asserting, because it settles the question of what you can promise.

When a node fails with HA-managed guests on it:

StageElapsed
Node loses quorum; the LRM stops renewing the watchdog0 s
Watchdog expires and the node self-fences~60–70 s
The CRM marks the node offline (60 s since its last status update) and begins trying to acquire its lockfrom ~60 s
Lock acquisition completes — worst case the lock takes a further 60 s to time outup to ~120 s
The CRM selects a recovery node and starts the guest+seconds
The guest boots and the application becomes ready+30 s to several minutes

SLI, SLO, SLA — three different things

They get used interchangeably and they are not.

TermWhat it isWho it is forExample
SLIService Level Indicator — the thing you actually measureEngineeringFraction of HTTP probes to the service endpoint returning 200 within 2 s
SLOService Level Objective — your internal target for that indicatorEngineering and managementThe SLI is at least 99.95% over a rolling 30 days
SLAService Level Agreement — the commitment with a consequence attachedCustomers, contracts, finance99.9% monthly, with service credits below it

Measure from the service, not from the hypervisor

This is the single most common measurement error, and it produces reports that are technically accurate and completely useless.

Node uptime is not service availability. A node can be up for 400 days while the guest on it has been unreachable for six hours. A guest can show running in qm list while its application has been returning 502 since lunchtime. Every layer beneath the service is a necessary condition and none of them is sufficient.

Measurement pointMeasuresBlind to
Node uptimeThe hypervisor booted and stayed upEverything above it
qm status shows runningQEMU has a processGuest kernel panic, application failure, network isolation
Guest agent respondsThe guest OS is aliveThe application
Port is openSomething is listeningThe application returning errors
Synthetic probe against the service endpoint, from where a user isWhat the user experiencesOnly genuinely user-specific problems
Read-only / Safewhat a service-level probe looks like, and where it must run from
set -euo pipefail
ENDPOINT=https://app.example.com/healthz
TIMEOUT=2

# A probe that fails is a probe that measures something. Check the status
# code AND the latency, because a service that answers correctly in nine
# seconds is not available in any sense the user recognises.
start=$(date +%s%3N)
code=$(curl -sS -o /dev/null -w '%{http_code}' --max-time "$TIMEOUT" "$ENDPOINT" || echo 000)
end=$(date +%s%3N)
latency=$(( end - start ))

if [ "$code" = "200" ] && [ "$latency" -lt 2000 ]; then
echo "ok code=$code latency_ms=$latency"
else
echo "FAIL code=$code latency_ms=$latency"
fi

# Run this from a host that does not depend on the cluster being healthy.
# A probe running inside a VM on the cluster it measures reports 100%
# availability during every outage, because it was down too.

The measurement interval decides what you can even detect

Two clusters both claiming 99.9% can be measuring completely different things.

Polling interval. A probe every 5 minutes cannot see a 90-second outage. It also cannot place an outage more precisely than ±5 minutes, so a genuine 4-minute failure is recorded as anything from 0 to 10. For a 99.9% target where the whole monthly budget is 43 minutes, a 5-minute resolution is too coarse to measure the thing you are committing to. Probe at 30 seconds or faster, and be explicit that the SLI is computed from those samples.

Aggregation window. 99.9% over a rolling 30 days and 99.9% over a calendar year are different commitments. The annual figure permits a single 8-hour-46-minute outage; the monthly figure caps any single incident at 43 minutes before the month is lost regardless of what else happens. Monthly is stricter in practice and is what customers usually assume.

Consecutive-failure rules. Most SLAs require n consecutive failed probes before an outage is counted, which suppresses noise from a single dropped packet. It also means the outage clock starts late. State the rule.

Exclusions, written so they cannot be argued about

Every SLA has exclusions. The failure mode is not having them — it is having them written vaguely enough that they become a negotiation while the incident is still running.

ExclusionWritten badlyWritten so it holds
Planned maintenance“Scheduled maintenance is excluded”“Excluded when announced at least 5 business days in advance, within the window Sunday 02:00–06:00 local, and limited to 4 hours per calendar month”
Customer-caused“Issues caused by the customer”“Downtime arising from customer configuration changes, customer software, or exhaustion of a resource the customer was notified was approaching its limit”
Dependencies“Third-party failures”“Named upstream services: internet transit from Provider X, authoritative DNS, the corporate identity provider. Failure of a named dependency is excluded; failure of our integration with it is not”
Force majeure“Acts of God”Standard contractual language, defined once, referenced
Emergency security patchingUsually absent entirely“Downtime taken to remediate a vendor advisory rated High or Critical, with notice as soon as practicable”

Reporting without flattering yourself

A monthly availability report that is one number is not a report. Four elements make it useful:

  1. The SLI, to two decimal places, unrounded. 99.87% is not “about 99.9%”. Rounding towards your target is the fastest way to lose the audience the one time it matters.
  2. Budget consumed, in minutes and as a percentage. “We used 34 of 43 minutes” is understood by everyone; “99.92%” is understood by almost nobody.
  3. Every incident, with its duration, cause and whether it counted against the budget or was excluded — and under which exclusion.
  4. The trend. One month is noise. Six months is a signal, and it is the only thing in the report that supports a decision.

Common mistakes

  • Publishing a target without doing the downtime arithmetic.
  • SLO equal to SLA, so the first warning is the breach.
  • Measuring node uptime and calling it service availability.
  • Running the probe inside the cluster it measures.
  • A 5-minute polling interval against a 43-minute monthly budget.
  • Unbounded maintenance exclusions, or none at all.
  • No emergency-patching exclusion, creating an incentive to delay security fixes.
  • Rounding the SLI towards the target.
  • Treating unspent error budget as an achievement rather than as capacity that was not used.

Key takeaways

  • 99.9% is 43 minutes a month; 99.99% is 4 minutes and 19 seconds.
  • Proxmox HA recovery is two to five minutes per incident, which makes 99.9% the honest ceiling for a platform-level resilience story.
  • SLI is measured, SLO is internal and tighter, SLA is contractual.
  • Measure at the service endpoint, from outside the cluster, at 30-second resolution or better.
  • Exclusions must be bounded and specific — notice period, fixed window, and a monthly cap.
  • Treat the budget as something to spend deliberately, with a pre-agreed posture at each consumption level.
  • Report the unrounded SLI, the budget consumed, every incident, and the trend.

Knowledge check

Knowledge check · 5 questions

  1. Q1. A service is committed to 99.99% monthly availability. A node fails, HA recovers the guest, and the application is serving again eight minutes later. What is the effect on the monthly budget?

  2. Q2. Which of these are valid reasons to measure availability with an external synthetic probe rather than from node uptime? Select all that apply.

  3. Q3. Setting the internal SLO to the same value as the contractual SLA keeps the team focused on exactly the commitment that matters.

  4. Q4. Which form of planned-maintenance exclusion is both achievable for the platform and defensible to a customer?

  5. Q5. What is the practical value of expressing an availability target as an error budget with a pre-agreed posture at each consumption level?

Passing score: 75%. Answers are checked in this browser.