9 min read

Committed Bandwidth vs Port Speed: Sizing and Auditing Circuit Capacity

Where to read committed bandwidth and port speed, how to measure the 95th percentile properly, a worked sizing example, and the API queries that flag capacity mismatches across a circuit inventory.

ByAndré Ribeiro· Founder, Obelinf
Committed Bandwidth vs Port Speed: Sizing and Auditing Circuit Capacity
Committed Bandwidth vs Port Speed: Sizing and Auditing Circuit Capacity · October 18, 2026
On this page

Every circuit is described by two rates that sound interchangeable and are not. One is the rate you bought, written into the contract and enforced by the carrier’s policer. The other is the rate the physical interface can pass, set by the optic and the port you plugged into. When they match, nothing needs explaining. When they diverge, as they usually do, the gap becomes a documentation problem long before it becomes a performance problem, because a team reading the wrong number will either accept a ceiling that should not exist or expect throughput nobody sold them.

The fix is mechanical rather than clever. Read each number from the source that owns it, measure what the link actually carries, and compare the three on a schedule. This guide is the procedure for doing that: the commands that read port speed, the queries that read committed bandwidth, a percentile method that will survive a capacity review, a worked sizing example, and the mismatch queries worth running every quarter.

At a Glance: Four Capacity Numbers on One Circuit

Committed bandwidth Port speed Measured throughput Burst or excess rate
What it measures Rate you purchased Maximum the interface can pass What the link actually carries Rate allowed above the committed level
Unit Mbps, then Gbps in conversation Gbps, set by the optic Mbps or Gbps over time Often a percentage
Where you read it Contract, or the circuit record show interfaces, ethtool Counters, sFlow, or NetFlow Contract terms
Who sets it Carrier contract Hardware and optic Traffic and demand Contract, if offered
Typical relationship The floor you are entitled to Ceiling above the floor Below the floor most of the day Temporary or discretionary
Failure when ignored Under buying or overpaying Blaming the circuit for a port limit Upgrading on averages Bill shock or unexpected drops

Read the port speed off the device

Port speed is a hardware fact, so the device is the only trustworthy source. On Cisco and NX-OS the interface line prints the bandwidth and the negotiated rate, and the summary view is enough to find the ones that do not match what you expected.

rtr-nyc-01# show interfaces GigabitEthernet0/0/0
GigabitEthernet0/0/0 is up, line protocol is up
  Hardware is ..., address is ...
  MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec
  ...
  Full-duplex, 1000Mb/s, media type is RJ45

The BW value is the bandwidth the routing protocols will use for path cost, and the trailing 1000Mb/s is the real negotiated speed. On a 10 Gbps handoff the same line reads BW 10000000 Kbit/sec and 10000Mb/s. If the line reports a speed lower than the optic supports, the problem is the fiber, the optic, or the negotiation, not the contract.

On a Linux host the equivalent is a single command, and the module data tells you whether the optic is running at the speed you paid for.

ethtool eth0 | grep -E "Speed|Duplex|Link detected"
cat /sys/class/net/eth0/speed

If you monitor with SNMP, the two useful objects are the classic interface speed and the high capacity version added for links above 4 Gbps. The first is ifSpeed at 1.3.6.1.2.1.2.2.1.5 and the second is ifHighSpeed at 1.3.6.1.2.1.31.1.1.1.15, measured in Mbps.

snmpget -v2c -c "$COMMUNITY" "$ROUTER" 1.3.6.1.2.1.31.1.1.1.15.5

Whichever source you use, the result belongs beside the circuit, because the contract will never tell you the port speed and the port will never tell you what you bought.

Read committed bandwidth from the record

Committed bandwidth is commercial, so it comes from the contract or from the circuit record you maintain for it. If you keep circuits in a structured inventory, one query gives you the committed side for the whole fleet, with the terminating interface attached.

export OBELINF_API_KEY="your_read_only_key"
export OBELINF_ORG="acme-netops"

curl --fail --silent --show-error -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "https://api.obelinf.com/${OBELINF_ORG}/circuits?limit=500" > circuits.json

jq -r '.circuits[]
  | [.name, (.bandwidth // "unset"), .type_name, .provider_name,
     (.interface_a_device_name // ""), (.interface_a_name // "")] | @tsv' circuits.json

The rate is stored in Mbps, so a 10 Gbps service reads 10000 and a 500 Mbps service reads 500. Keeping the unit explicit in the field definition prevents the classic mistake of recording a rate as 10 and later reading it as ten megabits.

A 10 Gbps handoff carrying a 1 Gbps committed service, showing usable and policed capacity One 10 Gbps handoff port port speed 10 Gbps 1 Gbps 9 Gbps present at the port, policed by the carrier committed rate The interface can pass ten times what you bought. Whether the extra capacity is reachable depends entirely on the contract, not on the hardware sitting in your rack. A speed test pinned at 1 Gbps is working as sold, not failing.

If a circuit has no committed rate recorded, that is the first finding, and it is worth fixing before any capacity review. A blank is worse than a wrong number, because a wrong number invites scrutiny and a blank invites assumption.

The third number is the one that changes, and the only honest way to use it is as a peak rather than an average. Sample the interface counters at a fixed interval, then take the 95th percentile of the samples so a single busy minute does not drive the conclusion and a quiet night does not hide the evening peak.

On a Linux host, sar can produce a day of five minute samples in one command. Check the column order for your version before trusting the awk pipeline, because the interface and byte rate columns differ between distributions.

sar -n DEV 300 288 \
  | awk '$3 == "eth0" { print $5 }' \
  | sort -n \
  | awk '{ v[NR] = $1 } END { printf "p95 inbound: %.0f Mbps\n", v[int(NR * 0.95)] * 8 / 1000 }'

On network gear, the same result comes from sFlow or NetFlow against the circuit interface, and either is a better fit than polling counters when the link carries a lot of short flows. Whichever route you take, keep the sample interval and the window consistent between reviews. A percentile taken over five minute samples and a percentile taken over one minute samples will disagree, and the disagreement will be blamed on the network.

Sustained utilization zones against committed bandwidth, from healthy to upgrade now Sustained utilization of committed bandwidth Comfortable Watch closely Plan the upgrade 0% 70% 85% 100% Read these thresholds from a rolling week of peak utilization, not a single average day, and compare against the committed rate rather than the port speed. A link at 60% of the port but 90% of the contract is the one to fix.

A worked sizing example

Sizing starts from demand, not from a product list. Suppose the circuit serves a branch office and the measured numbers are unremarkable. The table below is the calculation, and each row is a decision you should be able to justify.

Step Value Why
95th percentile inbound 240 Mbps Peak demand in the busy direction
95th percentile outbound 90 Mbps Confirm the busy direction
Largest direction 240 Mbps Size for the peak, not the mean
Add protocol overhead, about 15% 276 Mbps Encapsulation and packet headers do not appear in application throughput
Add headroom for growth, 30% 359 Mbps Two to three years of growth at a moderate rate
Round up to a sold tier 500 Mbps committed The next rate the carrier actually sells
Choose the handoff port 1 Gbps Room for a future upgrade without new optics

The order matters. Choosing the port first and then buying the rate that matches it produces a circuit that is either overpriced or permanently at its ceiling, and it hides the one number you will need at the next review. The committed rate is what the link is worth, and the port speed is a delivery detail.

A worked oversubscription example

Oversubscription is the same arithmetic seen from the provider’s side, and it is a number you can compute for your own aggregation links. Take twenty four 1 Gbps access circuits sharing one 10 Gbps uplink.

Oversubscription ratio defined as subscribed access bandwidth divided by aggregation capacity ratio = subscribed access bandwidth / aggregation capacity 24 x 1 Gbps access = 24 Gbps sold 10 Gbps uplink = 2.4 to 1 The ratio is comfortable until simultaneous demand exceeds the uplink. At a measured peak of 40 percent, twenty four circuits demand 9.6 Gbps, which is already 96 percent of the uplink. A second uplink takes the ratio to 1.2 to 1 and the same peak to 48 percent.

The lesson for an operator is that the ratio is a design decision, not an accident, and it deserves to be written down. A 2.4 to 1 link is fine if peak simultaneous demand stays under seventy percent of the uplink. When it does not, the fix is capacity, not shaping, because buffers only move the loss around.

Audit the inventory with two queries

Once both numbers exist, the review is a comparison. Export the committed side and flag the suspicious rows first, since those are the ones that need a device read to finish the check.

# Committed rate missing
jq -r '.circuits[] | select(.bandwidth == null)
  | [.name, .provider_name, .type_name, .status] | @tsv' circuits.json

# Rate far below the port anyway, or a suspiciously round value: list for review
jq -r '.circuits[] | select(.bandwidth != null)
  | [.name, (.bandwidth|tostring), (.interface_a_device_name // ""), (.interface_a_name // "")] | @tsv' circuits.json \
  | sort -k2 -n > committed.tsv

Then read the port side from each device into the same shape and join on device plus interface. Any circuit whose committed rate exceeds the port speed is an error, and any circuit whose committed rate equals the port speed deserves an overhead check.

ssh rtr-nyc-01 'show interfaces description' > speed-rtr-nyc-01.txt

# Flag circuits where the committed rate left no room for overhead at the stated port
awk -F'\t' '$2 == 1000 && $4 != "" { print $1": committed equals a 1G handoff, verify overhead" }' committed.tsv

The last comparison is against measurements, and it is the one that decides whether anything changes. A circuit at a comfortable committed rate but a measured peak near the ceiling needs an upgrade. A circuit with a comfortable measured peak but a committed rate that was never recorded needs a record. Sorting those two outcomes apart is what keeps a capacity review from turning into a purchasing conversation every time.

A quarterly review you can finish in an hour

The procedure is short enough to run on a schedule rather than after an incident.

  1. Pull the circuit list and read every row with a blank bandwidth, then fill those in from the contracts.
  2. Read port speed for each terminating interface and compare it with the committed rate, flagging rates above the port speed and rates equal to it.
  3. Pull the 95th percentile for each circuit over the same window you used last time, and record it against the circuit.
  4. Group the results into comfortable, watch closely, and plan the upgrade using the utilization zones, comparing against committed bandwidth rather than port speed.
  5. Recompute the oversubscription ratio on each aggregation link and confirm the measured peak still leaves room.

Keeping the previous numbers next to the current ones turns the review into a diff, and the diff is where the value is. A circuit that moved from forty percent to eighty two percent of its committed rate between two reviews is the one that deserves attention, and it is invisible if each review is read on its own.

The point of storing committed bandwidth and the terminating interface together is that a record cannot mislead you about which number is which. When the rate, the handoff, and the interface live on one row, a capacity review is a single pass over the inventory rather than a reconciliation of a contract folder, a diagram, and a monitoring system. Obelinf keeps the purchased rate in Mbps on the circuit and links each circuit to the interfaces it lands on, which is what makes those comparisons a query instead of a project.

Frequently Asked Questions

What is the difference between committed bandwidth and port speed?
Committed bandwidth is the rate you purchased and the carrier polices, while port speed is the maximum the physical interface can pass. A 1 Gbps circuit frequently arrives on a 10 Gbps port, because the carrier standardizes on the faster interface. Read the port speed from the device with a command such as `show interfaces`, and read the committed rate from the contract or the circuit record, then store them separately.
Why does my 1 Gbps circuit terminate on a 10 Gbps port?
Carriers deliver many circuits on 10 Gbps handoffs because it simplifies their equipment and makes a future upgrade a licensing change rather than a new install. If the service is policed to 1 Gbps, the extra capacity is real but not usable, so a throughput test that pins at 1 Gbps is behaving correctly. Record both numbers so nobody mistakes the port speed for the service you own.
How do I measure the 95th percentile of a circuit?
Collect interface counters at a fixed interval, five minutes is typical, over a full week or month, then sort the samples and take the value at the 95th percentile position. On a Linux host `sar -n DEV 300 288` produces a day of five minute samples, and a small awk pipeline converts the byte rate to Mbps and prints the percentile. On network gear, use sFlow or NetFlow against the circuit interface for the same result.
How much headroom should a circuit have before you upgrade?
A common starting point is to plan an upgrade when sustained utilization approaches about 70 percent of committed bandwidth, and to treat sustained utilization above 85 percent as urgent. Measure peak utilization over a rolling week rather than a single day, and always compare against the committed rate rather than the port speed, because the port speed is usually higher and will hide the ceiling.
Does committed bandwidth guarantee throughput?
No. Committed bandwidth is the rate the carrier will police or shape your traffic to, and it says nothing about latency, jitter, or packet loss along the path. A circuit can be within its committed rate and still perform poorly during congestion elsewhere in the provider network. Capacity and quality are separate promises, which is why a circuit record should hold the rate and the SLA terms as different facts.
How do I audit circuit capacity across many providers?
Export every circuit with its committed bandwidth and terminating interface, pull the interface speed from each device, and compare the two. Look for a blank rate, a rate higher than the port can pass, and a rate that exactly equals the port speed with no allowance for overhead. Obelinf stores committed bandwidth in Mbps on the circuit record next to the interface it terminates on, so the committed side of that comparison comes from one query.

Free Tools

Put this into practice with the free calculators, reference tables, and checklists in the Obelinf toolkit.

Stop reaching for a spreadsheet

Obelinf keeps every subnet, device, circuit, and rack in one live source of truth, with audit logs and a topology view. Free for personal use.

Related Articles