Back in 2018, I watched a single CDN PoP in Frankfurt push our monthly transit bill up by $42,000 after a large eyeball network de-peered us over a peering dispute. We'd been paying for 80 Gbps of transit that should have been exchanged for pennies at DE-CIX. That incident forced us to rebuild our entire IX peering approach from scratch, and it cut our global transit spend by 61% in the next two quarters. If you're still treating internet exchanges as just another place to get routes, you're leaving serious money on the table.
Why Route Servers Won't Save You From Bad Peering Hygiene
When I joined my first major CDN in 2014, the prevailing wisdom was simple: connect to the IX, peer with the route server, and call it a day. You'll get hundreds of peers instantly and your transit graph drops overnight. That works for about a week, until you realize half those routes are sending you traffic you can't efficiently return, or you're leaking cold-potato routes that trombone across your backbone and inflate your MPLS in CDN Backbone Networks: Label Switching for Predictable Performance costs.
Route servers are fantastic for discovery, but they're terrible for economics. They give you breadth, not selectivity. On AMS-IX or LINX, you'll see 800+ peers via the route server, yet maybe 40 of them carry 85% of the exchangeable traffic. The rest add BGP churn, RIB bloat, and risk without meaningful offload. I've seen routers with 1.2M paths from route servers struggling with convergence while the actual bits-per-second benefit was under 2%. We learned to treat the route server as a bootstrap mechanism, not a strategy. You use it to identify who you're actually exchanging traffic with, then you migrate the heavy hitters to direct bilateral sessions where you can control communities, MEDs, and BFD timers.
The other mistake is assuming all IX ports are equal. A 100G port at an exchange where your top 5 eyeballs aren't present is just expensive dark fiber. Before we order any port, we pull PeeringDB, sFlow from existing transit, and our DNS logs to map where the users really are. That analysis often pushes us toward a smaller regional IX instead of the big vanity exchanges. Our PoP in Warsaw doesn't need a massive presence at DE-CIX Frankfurt if 70% of its traffic is destined for Orange Polska and Netia, both reachable at PLIX for a third of the port cost.
! Arista EOS - IX Peering Template for Bilateral + Route Server
router bgp 64512
bgp bestpath as-path multipath-relax
neighbor IX-RS1 peer group
neighbor IX-RS1 remote-as 42
neighbor IX-RS1 description DE-CIX Route Server
neighbor IX-RS1 ebgp-multihop 2
neighbor IX-RS1 send-community extended
neighbor 80.249.208.1 peer group IX-RS1
neighbor 80.249.208.2 peer group IX-RS1
!
neighbor 80.249.209.45 remote-as 29562
neighbor 80.249.209.45 description KDDI-EU bilateral - priority 1
neighbor 80.249.209.45 send-community
neighbor 80.249.209.45 maximum-routes 20000 95 restart-time 300
neighbor 80.249.209.45 bfd interval 300 min-rx 300 multiplier 3
!
address-family ipv4
neighbor IX-RS1 soft-reconfiguration inbound
neighbor 80.249.209.45 route-map IX-INBOUND-FILTER in
neighbor 80.249.209.45 route-map IX-OUTBOUND-PREPEND out
!
route-map IX-INBOUND-FILTER permit 10
match ip address prefix-list IX-ALLOWED-PREFIXES
set local-preference 150
set community 64512:1001 additive
route-map IX-OUTBOUND-PREPEND permit 10
match ip address prefix-list OUR-CDN-ANYCAST
set as-path prepend 64512 64512
Designing a Selective Peering Policy That Cuts Transit Costs
Our current peering strategy isn't "peer with everyone," it's "peer where the math works." Every potential peer gets scored on three factors: traffic ratio, geographic overlap, and return path quality. If an eyeball network sends us 30 Gbps at peak but we only send 2 Gbps back, that's perfect for peering - we offload inbound transit without congesting our backbone. But if the ratio is close to 1:1 and the peer is in a region where we have limited backbone capacity, that peering session could cost us more in transport than it saves in transit. We've walked away from peering requests that looked attractive on paper because the backhaul to reach that IX would have erased the savings.
That scoring happens continuously. We run a nightly job that correlates NetFlow with BGP RIBs and PeeringDB data to calculate an effective $/Mbps for each adjacency. It factors in port amortization, cross-connect fees, and even power for the peering router. If a bilateral peer consistently delivers less than 500 Mbps for three weeks, we demote it back to the route server or drop it entirely. Sounds harsh, but port capacity is finite and every underutilized session is an opportunity cost. This discipline is what lets us keep our ECMP Routing in CDN Networks: Equal-Cost Multi-Path Traffic Distribution hash balanced - we don't want to spray traffic across 200 thin peers when 30 fat ones give us better entropy and lower retransmits.
Automation is what makes this sustainable. We don't manually configure 300 sessions anymore. Our peering controller pulls from PeeringDB's API, validates IRR and RPKI, generates prefix-lists, and pushes via Netmiko. If a peer's IRR objects don't match what they advertise, the session gets quarantined with a low local-pref until they fix it. I can't tell you how many route leaks we've avoided that way. And for traffic engineering, we don't rely on AS_PATH prepend alone. We use BGP communities to signal to peers whether we want them to prefer the IX path or our transit, which ties directly into our Segment Routing for CDN Traffic Engineering: Source-Routed Path Selection policies for steering cache-fill traffic off the peering fabric.
#!/usr/bin/env python3
# peering_profitability.py - daily IX peer scoring
import peeringdb
import pandas as pd
TRANSIT_COST_PER_MBPS = 0.45 # blended $/Mbps
IX_PORT_COST_MONTHLY = 3500 # 100G at major EU IX
def score_peer(peer_asn, traffic_mbps, port_utilization):
# Pull PeeringDB info
peer = peeringdb.get_asn(peer_asn)
# Effective cost if this traffic stayed on transit
transit_cost_avoided = traffic_mbps * TRANSIT_COST_PER_MBPS
# Pro-rated port cost based on utilization share
port_cost_share = IX_PORT_COST_MONTHLY * port_utilization
# Profitability ratio > 1.0 means peering saves money
ratio = transit_cost_avoided / max(port_cost_share, 1)
# Geographic bonus: +20% if peer is local to PoP region
if peer['region'] == 'europe-west':
ratio *= 1.2
return {
'asn': peer_asn,
'name': peer['name'],
'mbps': traffic_mbps,
'ratio': round(ratio, 2),
'decision': 'keep-bilateral' if ratio > 2.0 else 'route-server-only' if ratio > 0.8 else 'de-peer'
}
# Example run for DE-CIX Frankfurt PoP
peers = [(3320, 12400, 0.12), (6830, 8300, 0.08), (32590, 450, 0.004)]
for asn, mbps, util in peers:
print(score_peer(asn, mbps, util))
Modeling True Cost per Mbps: Transit Versus IX Economics
Transit pricing still gets quoted in those neat $/Mbps tiers, but your real cost per delivered Mbps is messier. You have to include 95th percentile overage, commit penalties, and the fact that transit traffic is often cold-potato routed over your own backbone for hundreds of miles before egress. IX traffic, in contrast, is hot-potato by design - you hand it off at the nearest exchange and let the peer haul it. When we modeled our US-East region, the blended transit cost was $0.52/Mbps, but the effective cost after adding our backbone transport from Ashburn to Miami was $0.71. The IX port at Equinix Ashburn, even after cross-connect and router port amortization, came in at $0.08/Mbps at 62% utilization.
That delta is why utilization targets matter more than port price. A cheap 10G port running at 15% is far more expensive per Mbps than a pricey 100G port running at 65%. We aim for 60-70% sustained utilization on IX fabrics; below 40% we either aggregate PoPs with transport or downgrade the port. Above 85% we risk drops during peaks and hurt cache hit ratio because we start shedding peer traffic back to transit. The sweet spot also keeps latency predictable. In our measurements across 12 exchanges, peers reached via IX showed 4-11ms lower RTT than the same prefixes via transit, which directly improves TTFB and origin shielding - details that align with guidance from the HTTP Working Group Specifications (https://httpwg.org/specs/) and performance audits described on web.dev Articles (https://web.dev/articles/).
Here's what that economics looked like across four of our PoPs last quarter. These are real blended numbers including port, cross-connect, and pro-rated router line-card costs. Notice how the smaller regional IX in Eastern Europe delivers the highest savings percentage despite lower absolute volume - that's the selective peering effect in action.
| PoP / Exchange | Blended Transit $/Mbps | Effective IX $/Mbps | Peak Traffic Offloaded | Monthly Transit Savings |
|---|---|---|---|---|
| Frankfurt / DE-CIX (100G) | $0.48 | $0.07 | 68.4 Gbps (71%) | $28,040 |
| Ashburn / Equinix Ashburn (2x100G) | $0.52 | $0.09 | 112.7 Gbps (64%) | $48,450 |
| Singapore / SGIX (100G) | $0.85 | $0.11 | 42.1 Gbps (58%) | $31,150 |
| Warsaw / PLIX (2x10G LAG) | $0.61 | $0.06 | 18.9 Gbps (79%) | $10,395 |
Implementing Selective Peering Automation Without Breaking Your Edge
Once you've got a selective policy on paper, the real failure point is implementation. Manual peering management doesn't scale past about 20-30 bilateral sessions. We've seen CDN edge teams try to manage 80+ sessions via spreadsheets and ticket queues — it always ends with stale IRR filters, forgotten MD5 passwords, and a route leak that should've been caught by automation. If you're serious about cutting transit, you need to treat peering sessions like code: versioned, tested, and deployed via automation.
Our baseline stack for a 100G IX port is pretty opinionated at this point. Every bilateral peer gets BFD at 300ms x 3, max-prefix limits set to PeeringDB's info_prefixes * 1.5 (with automatic shutdown), and strict filtering via IRR + RPKI ROA validation. We don't accept anything without a valid IRR route object and we reject RPKI invalids outright. That alone drops about 12-15% of garbage announcements we used to see on open route servers. For the control plane, we're running virtualized routing functions rather than dedicated hardware routers at smaller PoPs — which is where Network Function Virtualization in CDN Infrastructure: Virtual Appliances at Scale becomes critical to understand your performance envelope. A vBNG/vRouter on commodity x86 can handle 80-120k prefixes per IX fabric without breaking a sweat, but you'll hit PPS limits far sooner than on an ASR9000 if you don't tune DPDK properly.
# Automated BIRD filter generation from PeeringDB + IRR
# Syncs daily via cron, diffs against running config
protocol bgp peer_AS396982 {
local as 64500;
neighbor 206.108.34.42 as 396982;
description "Example Eyeball Network - AMS-IX";
password "encrypted-md5-here";
bfd on; # 300ms detection
hold time 90;
ipv4 {
import filter {
# Dynamic prefix limit from PeeringDB
if net ~ 0.0.0.0/0 then reject; # no default
if bgp_path.len > 32 then reject;
if !roa_check(table roa4, net, bgp_path.last) = ROA_VALID then {
if roa_check(table roa4, net, bgp_path.last) = ROA_INVALID then reject;
}
if !net ~ IRR_AS396982 then reject; # IRR whitelist
accept;
};
export filter { if net ~ CDN_ORIGINATED then accept; else reject; };
import limit 15000 action block; # PeeringDB reports 9.8k
};
}
Advanced Patterns: PNIs, Partial Transit, and Debugging the Peering Black Hole
Public IX peering will only get you so far. Once a single eyeball ASN is pushing 8-12 Gbps sustained through an exchange during peak, you're hitting the point where a Private Network Interconnect (PNI) makes more sense. The math is straightforward: a 100G IX port at AMS-IX or DE-CIX runs you $2,200 - $3,500/month plus cross-connect fees, and you're sharing that fabric with 500 other networks. A 100G PNI to a major eyeball like Deutsche Telekom or Comcast might cost $3,000 - $5,000/month for the cross-connect plus transport, but you get dedicated capacity, lower latency (often 2-4ms better by avoiding the IX fabric), and no contention during DDoS events. Our rule of thumb: if the 95th percentile to a single ASN exceeds 40% of your IX port capacity for more than 3 weeks, move it to a PNI. Don't wait for packet loss to convince you.
The nastiest troubleshooting issue we see isn't lack of peering — it's silent peering failure. You'll establish a session, exchange prefixes, and traffic will flow... in one direction. Asymmetric peering blackholes happen when your CDN announces to a peer, they accept it, but their outbound policy prefers transit for the return path, or they have a more specific route via someone else. Your sFlow shows egress blasting at 15 Gbps over the IX, but ingress is near zero and customers complain about TTFB. Always validate with traceroutes from Looking Glasses inside the peer's network, and correlate with BGP communities. We've built our remediation into a Software-Defined Networking for CDN: Programmable Traffic Control layer that can automatically de-preference or shut down a peering session if the traffic ratio stays worse than 10:1 for over 30 minutes. It's far cheaper to swing that traffic back to transit than to debug a one-way peering session at 2 AM.
Finally, don't treat IX strategy in isolation from your backbone. The cheapest peering in the world won't help if your backbone topology forces tromboning. If you're backhauling traffic from an IX in Madrid all the way to Paris because that's where your only transit breakout lives, you've just added 25ms and congested your core. This is why mapping peering decisions to CDN Backbone Topology Design: Ring, Mesh, and Hierarchical Architectures matters. We use a partial-mesh backbone where large IXes are dual-homed to two core PoPs, and we run selective transit only at 3-4 strategic hubs. That lets us dump traffic at the nearest IX, keep it local, and avoid paying transit twice — once to get to the IX and again to get out. If your peering economics still look bad after that, you're probably not modeling your cost per Mbps correctly. Revisit your allocation of port, power, and transport before you blame the IX.
Frequently Asked Questions
Should we just use the IX route server and skip bilaterals?
No — not if you care about cost reduction. Route servers are great for discovery and for low-volume peers (<500 Mbps). But the top 15-20 peers by volume will always drive 75-80% of your peering traffic. Those need direct bilateral sessions so you can apply traffic engineering, BFD, and community-based prepending. We've measured 18-22% higher packet loss via route servers during peak DDoS scrubbing events because the fabric is shared. Use the route server to find peers, then graduate the heavy hitters to bilaterals.
What's the real break-even point for a 100G IX port versus transit?
At today's pricing, transit in major EU/US hubs is $0.25-$0.45 per Mbps on commit. A 100G IX port with cross-connect and membership amortizes to about $0.08-$0.12 per Mbps if you can fill 30 Gbps sustained. So break-even is typically 7-10 Gbps of offload. If you're consistently moving less than 5 Gbps off transit per IX, you're not saving money — you're just adding operational complexity. Consolidate to fewer, fuller IXes instead of chasing every small exchange.
Why are we seeing traffic sent to a peer but no return traffic?
Classic asymmetric filtering. Check three things in order: 1) Is the peer actually accepting your prefix? Look for your prefix in their Looking Glass. 2) Do they have a more specific (e.g., /24 vs your /22) learned via transit that wins? 3) Are they tagging your route with a low LOCAL_PREF internally? Also verify your RPKI ROA isn't invalid — about 6% of the blackholes we debug are self-inflicted due to expired ROAs. Don't forget to check if your max-prefix limit shut the session down silently.
When should we pay for a PNI instead of using the public IX?
When you hit sustained 8+ Gbps to a single ASN, need SLA-backed latency, or see regular microbursts causing loss on the public fabric. PNIs typically deliver 0.02% loss versus 0.1-0.3% on congested public peering during peak evening hours (19:00-23:00 local). For a CDN serving video, that packet loss directly translates to rebuffers. If that eyeball is in your top 10 traffic destinations, the $4k/month for a PNI pays for itself in reduced retransmits and transit purges.