Azure Architecture
An Azure Cost and Performance Review Checklist for .NET Applications
A workload-first review method for finding Azure savings without trading away reliability, response time, or operational clarity.
Azure cost and application performance are often reviewed separately. In practice they are coupled. An oversized App Service plan can hide inefficient queries, while an aggressive scale-down policy can save money and create cold starts at the exact moment users arrive.
A useful review connects business demand, service-level objectives, resource utilization, request behavior, and unit cost. The goal is not the smallest bill. It is the lowest sustainable cost for the reliability and performance the workload actually requires.
1. Establish the workload baseline
Start with at least one representative business cycle. Separate steady traffic, scheduled processing, month-end peaks, releases, and incidents. Map Azure spend to environments and capabilities rather than reading only the subscription total.
Pair cost with p50 and p95 response time, throughput, error rate, saturation, dependency latency, deployment frequency, and availability targets. Add a unit-cost measure such as cost per active user, processed loan, order, API call, or background job.
- Tag resources consistently by workload, environment, owner, and cost center
- Identify idle resources, unattached storage, duplicate environments, and excessive retention
- Separate fixed baseline cost from demand-driven cost
- Record peak and off-peak utilization before changing tiers
- Create budgets and alerts for unusual spend
3. Match Azure Functions hosting to execution behavior
Functions are cost-effective when work is event-driven and the hosting plan matches latency and networking requirements. Review invocation frequency, execution duration, memory, concurrency, retries, downstream throttling, and cold-start tolerance.
A function that repeatedly retries a non-idempotent operation can increase cost and corrupt business state. Queue-triggered workloads need poison-message handling, bounded retries, observability, and a concurrency setting that downstream systems can sustain.
4. Treat Azure SQL spend as an application concern
Before increasing database capacity, use Query Store and resource metrics to identify the queries, waits, plans, and workload periods consuming CPU, I/O, memory, log throughput, or worker threads. Application round trips and over-fetching can be as expensive as a poor query plan.
Choose provisioned, serverless, elastic pool, or hyperscale options around workload shape and recovery requirements. A lower compute tier can cost more operationally if it causes timeouts, retries, or manual intervention. Conversely, optimizing a handful of high-impact queries may create enough headroom to avoid a scale-up.
6. Prioritize changes through controlled experiments
Rank findings by expected impact, implementation effort, risk, and confidence. Begin with reversible changes: unused resources, retention, obvious query regressions, schedules, caching, and scale limits. Test each change against the same workload baseline.
Cost optimization is continuous. Add unit cost and performance indicators to operational reviews, and re-evaluate after traffic changes, new features, model usage, data growth, or architectural migrations.
Key takeaways
What to carry into your next decision
- Measure cost beside business demand, latency, reliability, and saturation.
- Right-size only after understanding workload shape and shared-resource behavior.
- Optimize application and SQL behavior before using capacity as the default fix.
- Validate savings through controlled changes against a stable baseline.
Sources and further reading
Version-specific and platform guidance was checked against these primary sources.