Menu

Infrastructure Transparency

Open disclosure of PERTI's operational costs and scaling strategy

Last updated: February 2026

Current Monthly Costs

PERTI operates on Microsoft Azure infrastructure across the Central US and East US regions. Below is a transparent breakdown of our actual operational costs, sourced directly from Azure Cost Management.

Compute Resources

Resource Tier/SKU Purpose Cost/Month
vatcscc
App Service
P1v2
3.5 GB RAM, 1 vCPU
Main PERTI website, PHP-FPM workers, 14 background daemons ~$80
vatcscc-atfm-engine
App Service
P1v2
Shared plan
ATFM processing engine Included

Azure SQL Databases

Hosted on

Databases Tier/SKU Purpose Cost/Month
VATSIM_ADL Hyperscale
Serverless Gen5, 16 vCores, min 3
Active flight data, real-time positions, parsed routes, trajectory, ETAs, boundary crossings, statistics ~$3,200*
VATSIM_TMI Basic
5 DTU, 2 GB
Traffic management initiatives, NTML, advisories, GDT slots, reroutes ~$5
SWIM_API Basic
5 DTU, 2 GB
SWIM API keys, flight snapshots, audit log ~$5
VATSIM_REF Basic
5 DTU, 2 GB
Reference data (airports, airways, fixes, procedures) ~$5
VATSIM_STATS GP Serverless
Gen5, 1 vCore (paused)
Statistics & analytics (currently paused) ~$0
* Hyperscale Serverless: Compute billed at ~$0.51/vCore-hour. VATSIM_ADL runs continuously with auto-pause disabled and 1 HA replica. Scales based on VATSIM traffic (peak: 1800-0200 UTC). Cost includes compute (~$2,900) + storage (~$300).

MySQL & PostgreSQL Databases

Databases Tier/SKU Purpose Cost/Month
vatcscc-perti
MySQL 8.0
General Purpose
D2ds_v4, 20 GB
Main web app (plans, users, configs, staffing, reviews) ~$125
vatcscc-gis
PostgreSQL 16 + PostGIS
Burstable
B2s, 32 GB
Spatial queries (boundary intersection, route geometry, fix lookups) ~$55

Cost Summary

VATSIM_ADL Hyperscale Compute (~16 vCores avg) ~$2,900
VATSIM_ADL Hyperscale Storage + HA Replica ~$300
MySQL (General Purpose D2ds_v4) ~$125
App Service (P1v2) ~$80
PostgreSQL GIS (Burstable B2s) ~$55
Basic SQL Databases (3x) ~$15
Storage Accounts (4x) ~$10
Other (Data Factory, Logic Apps) ~$5
Monthly Total ~$3,500 /month
Hyperscale Compute: VATSIM_ADL is the primary cost driver at ~92% of total spend. It runs Hyperscale Serverless Gen5 with 16 vCores max, 3 vCores min, auto-pause disabled, and 1 HA replica. Compute scales based on query load from 14 background daemons processing flight data every 15 seconds.

Storage & Other Services

Resource Type Purpose Cost/Month
vatsimdatastorage Storage (LRS) General data storage, ADL archives ~$3
pertiadlarchive Storage (LRS) Trajectory archival, compressed flight history ~$1
vatsimadlarchive Storage (RA-GRS) Geo-redundant long-term archival <$1
vatsim-adl-history Azure Data Factory Historical data pipeline orchestration <$1
Deployment Slots App Service Staging & backup slots for zero-downtime deploys Included

Cost Trend (4-Month History)

Month SQL Database App Service MySQL Other Total
Oct 2025 $536 $82 $15 $51 $684
Nov 2025 $524 $80 $15 $52 $670
Dec 2025 $2,020 $83 $15 $54 $2,172
Jan 2026 $3,479 $85 $26 $50 $3,640
Dec 2025: VATSIM_ADL migrated from General Purpose to Hyperscale Serverless. Geo-replicas temporarily provisioned for migration.
Jan 2026: Geo-replicas and VATSIM_Data database decommissioned. PostgreSQL GIS database added. MySQL upgraded to General Purpose tier.

What This Infrastructure Provides

40
PHP-FPM Workers
15s
Data Refresh Rate
14
Background Daemons
24/7
Availability
7
Databases
3
DB Engines

Background Services (14 Daemons)

  • VATSIM data ingestion (every 15s)
  • Route parsing with PostGIS spatial queries
  • ARTCC/TRACON/Sector boundary detection
  • Boundary crossing ETA prediction
  • Waypoint ETA calculations
  • SWIM WebSocket server (real-time events)
  • SWIM data sync & reverse sync
  • SimTraffic data polling
  • Scheduled task automation (splits/routes)
  • Data archival & trajectory tiering
  • System health monitoring
  • Discord TMI message queue processing
  • VATSIM/VATUSA event sync
  • ADL blob storage archival

Performance Optimizations

  • APCu in-memory caching
  • Tiered cache TTLs by API tier
  • ETag support for 304 responses
  • Gzip compression for API responses
  • CDN-ready Cache-Control headers
  • Lazy-loaded database connections
  • PERTI_MYSQL_ONLY flag (~98 endpoints skip Azure SQL)
  • Parallel API loading on frontend (Promise.all)
  • Optimized SQL indexes
  • Tiered daemon processing (15s-5min by flight priority)

Scaling Strategy

Our infrastructure uses Azure Hyperscale Serverless databases that automatically scale with demand. The App Service layer can be scaled independently.

Database Auto-Scaling (Already Active)

VATSIM_ADL uses Hyperscale Serverless with automatic scaling:

  • VATSIM_ADL: 3 - 16 vCores (auto-scales based on query load from 14 daemons)
  • Auto-pause: Disabled - VATSIM_ADL runs continuously to maintain real-time 15-second data freshness
  • HA Replica: 1 high-availability replica for read offloading and failover
  • VATSIM_STATS: General Purpose Serverless with auto-pause enabled (pauses when idle)

No action needed - databases automatically handle traffic spikes during CTP, FNO, and other events.

Current Baseline Traffic

P1v2 App Service with 40 PHP-FPM workers handles normal VATSIM traffic. Estimated capacity: 40-80 requests/second at origin.

10x Traffic Basic SWIM Adoption

Solution: Add Azure CDN for API caching (~$5-10/month)

Benefit: 80-90% of requests served from edge, reducing origin load

100x Traffic Full SWIM Adoption

Solution: CDN + App Service autoscaling (1-3 instances)

Benefit: Reserved Instance discount (30-50% savings on compute)

1000x Traffic Heavy External Integrations

Solution: CDN + Upgrade to P2v2 (7GB, 2 vCPU) + Autoscaling (1-5 instances)

Note: Database layer already handles this scale via Hyperscale auto-scaling

Cost Optimization Measures

Implemented

  • APCu caching (80-90% cache hit rate)
  • Gzip compression for large responses
  • ETag support to reduce bandwidth
  • CDN-friendly response headers
  • Tiered cache TTLs by API access level
  • Optimized PHP-FPM worker count (40)
  • PERTI_MYSQL_ONLY: ~98 endpoints skip Azure SQL connections (~500-1000ms saved)
  • Lazy-loaded database connections (on-demand getters)
  • Parallel frontend API loading (Promise.all)
  • Tiered daemon processing (15s-5min by flight priority)
  • Trajectory archival tiering (live → archive → compressed)

Available When Needed

  • Azure Reserved Instances (30-50% savings)
  • Azure CDN edge caching
  • Autoscaling during peak hours
  • Database query optimization indexes
Note: We deliberately avoid over-provisioning. Our philosophy is to scale reactively based on actual demand rather than paying for unused capacity.

Estimated Capacity

Configuration Est. Requests/Second Notes
Origin only (current) ~40-80 Direct hits to App Service
With CDN (85% hit rate) ~300-500 Most requests served from edge
With CDN (95% hit rate) ~800-1600 Optimized caching rules
Estimates based on 40 PHP-FPM workers with 15-second data refresh cycle.