An Azure service that is used to provision Windows and Linux virtual machines.
Hi Alex,
Before troubleshooting, one thing worth checking: 6–12 MB/s may well be normal for an insert workload, and MB/s is probably the wrong metric to be watching.
SQL Server writes in 8 KB pages, and log writes during inserts are small and synchronous. Azure enforces two independent ceilings — IOPS and throughput — and small-block workloads hit the IOPS ceiling long before the MB/s number on the datasheet. At 8 KB per I/O, 1,000 IOPS is 8 MB/s. You could be 100% throttled and still see exactly the figure you're reporting. So track IOPS, disk latency, and WRITELOG wait time, not transfer rate.
Start here — it's built for this exact question
Open the SQL virtual machines resource for AlexVM in the portal → Storage → I/O Analysis. It analyzes the last 24 hours and returns one of three verdicts: no throttling, VM level I/O throttling, or disk level I/O throttling. That single screen tells you which branch below applies.
Thresholds, so you don't chase spikes
| Metric | Problematic condition |
|---|---|
| Disk latency | > 500 ms over a consecutive 5-min period |
| -------- | -------- |
| Disk latency | > 500 ms over a consecutive 5-min period |
| VM Cached IOPS / Bandwidth Consumed % | ≥ 95% over a consecutive 5-min period |
| VM Uncached IOPS / Bandwidth Consumed % | ≥ 95% over a consecutive 5-min period |
| Data Disk IOPS / Bandwidth Consumed % | ≥ 95% over a consecutive 5-min period |
Metrics are sampled every 30 seconds and aggregated to the minute. Important caveat: "Some throttling is expected, and is ignored unless there's also disk latency." A brief 100% spike is not a problem — sustained saturation with latency is.
If it says disk-level throttling: disk IOPS scale with provisioned size, so a small disk caps you regardless of type. Options are a larger disk, a faster type (Premium SSD v2 lets you provision IOPS and throughput independently of size), or striping across multiple data disks. Enable read caching on the data disk if available. Note that changing IOPS/throughput on Premium SSD v1 requires building a new storage pool — worth planning rather than iterating.
If it says VM-level throttling: the VM caps aggregate I/O regardless of how fast your disks are. Resizing within a series is the easy lever. Memory-optimized series — Ebdsv5, M, Mv2 — are the ones recommended for SQL Server. One constraint: you can't downsize to a VM whose max data disk count is lower than the number you have attached.
If it says no throttling — this is the branch most people skip. High latency without throttling means the bottleneck is on the VM, not the disks. Documented causes:
- High CPU utilization
- Insufficient VM memory
- Background processes — antivirus, backups, maintenance jobs, Windows Update
- Missing antivirus exclusions for SQL Server files — very common, and often the whole answer
Also check SQL Server's error log for long I/O warnings; those point at the storage subsystem rather than SQL itself, and are aggravated by sequential operations like backup/restore, scans, sorts, index builds, and bulk loads.
Config worth confirming while you're in there
- Data, log, and tempdb on separate disks — never on the OS disk
- Read-only host caching on data disks, None on log disks
- If this is a Marketplace SQL image, the Storage pane also flags best-practice deviations directly
To narrow this down, could you share:
- VM size for AlexVM
- Disk type, size, and count for data and log (and current caching setting on each)
- What I/O Analysis reports — throttling or no throttling
- Whether the inserts are row-by-row or batched/bulk
A single-row insert loop is latency-bound and will look "slow" in MB/s on any storage tier, including local NVMe — so that last one matters a lot.
References
- Analyze I/O performance for SQL Server on Azure VMs
- Storage: Performance best practices for SQL Server on Azure VMs
- Virtual machine and disk performance
- How to use PerfInsights
Kind Regards,
Microsoft Support Team.