A comprehensive platform for testing and analyzing network performance between Azure Availability Zones across different regions worldwide.
Current deployment: https://latency.azure.cloud63.fr/
β οΈ Disclaimer: This is an unofficial community tool, not affiliated with Microsoft Azure. The results are provided on a best-effort basis for informational purposes only. Use at your own risk and always conduct your own performance testing for production workloads.
This project automatically measures network latency and bandwidth between Azure Availability Zones across 25+ global regions. It provides valuable insights into Azure's internal network performance to optimize multi-zone application deployments.
Azure uses a two-level zone system that is crucial to understand for accurate network performance testing:
- Logical Zones: These are the zones you see in Azure (Zone 1, Zone 2, Zone 3) which provide a consistent interface per Azure subscriptions
- Physical Zones: These are the actual physical datacenters where your resources are deployed
Important: The mapping between logical zones and physical datacenters is unique per subscription. This means:
- Zone 1 in your subscription may map to Physical Datacenter A
- Zone 1 in another subscription may map to Physical Datacenter B or C
- This randomization ensures load balancing across Azure's physical infrastructure
This project uses a pre-established mapping stored in availabilityZoneMappings.json:
- Uses the physical availability zone mapping from the JSON configuration file
- References which physical datacenters correspond to each logical zone per region
- Manages the mapping manually using the
get-locations.shscript when needed
Manual Mapping Management: To update or discover zone mappings for new regions, use the
get-locations.shscript which queries Azure APIs to determine the physical zone assignments for your subscription.
The network performance tests in this project measure latency and bandwidth between physical datacenters, not logical zones. This approach provides:
- Real-world performance data reflecting actual geographic distances
- Consistent measurements regardless of Azure's logical zone assignments
- Meaningful comparisons across different subscriptions and regions
Note: When interpreting results, remember that "inter-zone" latency refers to communication between different physical datacenters within the same Azure region.
- Deployment Topology :
Virtual Machines (VMs) are deployed in each Azure region, with the following configuration:
- One server VM per physical Datacenter (Availability Zone).
- One client VM per physical Datacenter.
-
Test Execution Workflow : Each client VM is responsible for initiating network tests targeting the server VMs across all zones. After each test, the results are collected and sent to a centralized Azure Storage Account, specifically to a Table Storage for structured logging and analysis.
-
Test Orchestration and Timing : To prevent concurrent test execution across zones, a staggered provisioning strategy is implemented:
- Each client VM is provisioned with a delay of 60 seconds relative to the previous one.
- This ensures that tests are distributed over time, reducing the risk of contention and improving result reliability.
-
Secure Data Storage and Access : The Azure Storage Account used for storing test results is secured with the following mechanisms:
- Access is granted via a Managed Identity, eliminating the need for credentials and enhancing security.
- Communication with the storage account is routed through a Private Endpoint, ensuring that data traffic remains within the Azure backbone and is not exposed to the public internet.
- Test VMs: Automatic deployment of Linux virtual machines across 3 availability zones
- Network Testing: Uses
qperfto measure TCP latency and bandwidth (iperf3is deployed but not used for the moment) - Data Storage: Azure Table Storage for results persistence
- Automation: GitHub Actions for test execution every 6 hours
- Frontend: Static web application with interactive visualizations
- Backend: Azure Functions for data access API
- Hosting: Azure Static Web Apps
- Intra-zone: Latency between VMs in the same availability zone
- Inter-zone: Latency between VMs in different availability zones
- Alert Thresholds:
- Intra-zone > 500 ΞΌs (considered abnormal)
- Inter-zone > 2000 ΞΌs (considered abnormal)
- TCP tests with
qperfover 10 seconds - Measurements in Gb/sec between all zone pairs
- Note: Bandwidth depends on VM types and is not the primary focus as the VM sizes can vary significantly between regions.
The project covers 25+ Azure regions:
- East US 2, Central US, South Central US
- West US 2, West US 3, Canada Central
- Brazil South, Chile Central, Mexico Central
- North Europe, West Europe, France Central
- Germany West Central, Sweden Central, Switzerland North
- UK South, Italy North, Spain Central, Norway East, Poland Central
- East Asia, Southeast Asia, Japan East, Japan West
- Korea Central, Australia East, New Zealand North
- Central India, Indonesia Central, Malaysia West
- UAE North, Israel Central, South Africa North
- Azure account with Contributor permissions
- GitHub repository (for workflows)
- Azure CLI
- Terraform >= 1.0
You can use the script setup_github_secrets.sh to configure the required GitHub secrets.
AZURE_SUBSCRIPTION_ID # Your Azure subscription ID
AZURE_CLIENT_ID # Service principal ID
AZURE_CLIENT_SECRET # Service principal secret
AZURE_TENANT_ID # Azure tenant IDTERRAFORM_STATE_RG # Resource group for Terraform state
TERRAFORM_STATE_SA # Storage account for Terraform state
TERRAFORM_STATE_CONTAINER # Container for Terraform state
TERRAFORM_STATE_SUBSCRIPTION_ID # Storage account subscription# Create the service principal
az ad sp create-for-rbac --name "azure-netbench-sp" \
--role "Contributor" \
--scopes "/subscriptions/YOUR_SUBSCRIPTION_ID"
# The command returns the values for your GitHub secretsGitHub Actions main workflow run automatically every two hours. This workflow starts the testing process for all regions.
# Via GitHub CLI
gh workflow run "France Central Network Benchmark"
# Or via GitHub Actions interface# Deploy a specific region
terraform init
terraform plan -var-file="tfvars/francecentral.tfvars"
terraform apply -var-file="tfvars/francecentral.tfvars"
# Wait 5 minutes for tests, then cleanup
terraform destroy -var-file="tfvars/francecentral.tfvars"π Live Demo: https://latency.azure.cloud63.fr/
cd dashboard
azd auth login
azd init
azd up- Real-time Visualizations: Latency and bandwidth charts
- Advanced Filters: By region, availability zone, time period
- Time Series Analysis: Performance evolution over time
- Data Export: CSV export of filtered results
- Visual Alerts: Highlighting of abnormal results
azure-netbench/
βββ modules/netperf/ # Terraform module for testing
β βββ main.tf # Main infrastructure
β βββ cloud-init-server.txt # Test server configuration
β βββ cloud-init-client.txt # Test client configuration
β βββ variables.tf # Module variables
βββ tfvars/ # Region-specific configuration
β βββ francecentral.tfvars # France Central config
β βββ eastus.tfvars # East US config
β βββ ... # Other regions
βββ dashboard/ # Visualization application
β βββ api/ # Azure Functions
β βββ web/ # Static frontend
β βββ infra/ # Terraform infrastructure
βββ .github/workflows/ # GitHub Actions
β βββ europe-region.yml # Europe regions workflow
β βββ ... # Other workflows
βββ main.tf # Root Terraform configuration
βββ availabilityZoneMappings.json # Physical/logical zone mapping
# In tfvars/[region].tfvars
benchmark = {
"francecentral" = "Standard_D8as_v5"
}# In .github/workflows/all-regions.yml
schedule:
- cron: '0 */6 * * *' # Every 6 hours- Check the "Actions" tab of your repository
- Each job displays detailed Terraform logs
- Deployment failures don't prevent resource destruction
Tests run automatically via cloud-init and send their results to Azure Table Storage.
- Verify that all Azure secrets are correctly configured
- Ensure the service principal has
Contributorpermissions
- Verify that the storage account and container exist
- Check the names in the
TERRAFORM_STATE_*secrets
- Check job logs to see Terraform errors
- Verify Azure quotas in target regions
- Ensure VM sizes are available in the regions
- Check managed identity permissions on the storage account
- Verify Azure Functions environment variables configuration
- Intra-zone latency: < 500 ΞΌs
- Inter-zone latency: < 2000 ΞΌs
- Bandwidth: Variable depending on VM types and regions
Results exceeding normal thresholds are:
- Highlighted in the dashboard
- Fork the repository
- Create a feature branch (
git checkout -b feature/new-feature) - Commit your changes (
git commit -am 'Add new feature') - Push to the branch (
git push origin feature/new-feature) - Create a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.


