IN BRIEF

SQL Server Availability Groups can be built in Windows VMs on Proxmox VE. Each replica holds its own data copy; SQL Server handles replication. Shared guest storage is therefore not required for the AG databases. For production, align architecture, edition, licensing and vendor support. This article covers conventional Availability Groups on Windows Server with WSFC, not Linux or read-scale configurations.

AT A GLANCESCHEMATIC OVERVIEW
01

Separate replicas

Independent data copies on separate hosts

02

Aligned networking

Check VirtIO, multiqueue and RSS together

03

Verified failover

Reconnect the application through the listener

Availability Group or Failover Cluster Instance?

Always On is an umbrella term. An Availability Group (AG) replicates selected databases between SQL instances. A Failover Cluster Instance (FCI) protects a SQL instance and requires suitable shared or jointly provided storage. The approaches have different requirements. This example uses an AG with two Windows VMs.

TWO REPLICAS, SEPARATE DATA COPIESSimplified example
APPLICATION · AG LISTENER

One access point to the current primary replica

PROXMOX HOST A
Windows VM 1

Primary SQL instance

Own data copy
PROXMOX HOST B
Windows VM 2

Secondary SQL instance

Own data copy
SQL log replication

Synchronous or asynchronous to suit the protection objective

WSFC QUORUM + WITNESS DESIGN

Independent failure domain. Not a third database copy.

For the write access shown, the listener points to the primary instance. The AG replicates data between instances, not through the listener. Proxmox quorum, redundant network paths and backup are not fully shown here.
  • SQL edition and version determine available features. Standard Edition Basic Availability Groups are not equivalent to full Enterprise AGs.
  • Separate virtual disks may still sit on the same SAN. Check which shared failure points are actually removed.

Plan hosts, quorum and listener together

Place replicas on separate physical hosts and check placement after maintenance and recovery too. The remaining host must carry the required load. Windows and Proxmox clusters each have their own quorum; Proxmox quorum does not replace WSFC planning.

  • Validate WSFC and design an appropriate witness outside the shared failure domain being protected. A witness is not an additional database copy.
  • Configure the listener, DNS, IP addresses, firewall and SQL endpoints together. The application should not depend on a fixed VM name.
  • Assess synchronous commit for the required local availability. Automatic failover requires, among other things, the appropriate mode, a synchronised target replica and WSFC quorum. Asynchronous replication can lose data during forced failover.

Align Proxmox multiqueue and Windows RSS

If packet processing saturates individual vCPUs, VirtIO multiqueue may help. VM configuration and guest drivers must align. More queues are not a universal accelerator and increase CPU overhead. Test changes during a maintenance window because driver and adapter changes can interrupt connectivity.

MULTIQUEUE AND RSS: ALIGN BOTH SIDESSimplified example
  1. 01

    Proxmox VM

    VirtIO NIC · Example: 4 vCPUs

    Q1Q2Q3Q4
    Multiqueue = 4 as a test configuration
  2. 02

    Windows guest

    VirtIO driver · RSS enabled

    RSS 1RSS 2RSS 3RSS 4
    Check queue count and effective CPU assignment
  3. 03

    Compare under load

    Measure CPU distribution, latency and SQL backlogs.

    More queues do not guarantee better performance.
READ-ONLY CHECK · POWERSHELL IN THE GUEST
Get-NetAdapterRss | Format-List *

Identify the relevant adapter. Check Enabled, NumberOfReceiveQueues and RssProcessorArray. Available properties depend on driver and Windows version.

Four queues are an example, not a universal target. Actual distribution also depends on traffic flows, the driver and CPU assignment. Document changes beforehand and test during a maintenance window.
  • In Proxmox, edit the VirtIO network adapter, open advanced settings and set Multiqueue. The documentation gives the vCPU count as a starting value.
  • In Windows Device Manager, open the Red Hat VirtIO Ethernet Adapter's Advanced settings, enable Receive Side Scaling and set Maximum number of RSS Queues appropriately. Check the driver version and available values.
  • Example test: four vCPUs, four Proxmox queues and up to four RSS queues supported by the guest driver. Then check the effective state, not just the configured value.

Measure the bottleneck before further tuning

More queues do not automatically accelerate a single TCP stream. Compare CPU distribution, latency and replication backlog before and after the change under the same load.

SPECIFIC CHECKS

Distinguish sending from processing

  1. Log Send Queue grows

    Unsent log, in KB. Investigate log generation, transport and the receiving side.

  2. Redo Queue grows

    Received log not yet applied, in KB. Check CPU, I/O and blocked redo work on the secondary replica.

  3. HADR_SYNC_COMMIT stands out

    With synchronous replication, also investigate network latency and log-write times on the other side. This does not prove insufficient NIC queues.

DECISION POINTMeasure repeatedly with timestamps. A brief spike differs from sustained growth. There is no universal KB threshold for every application.

Open the SQL query for the DBA

Read-only; run on the primary replica. SQL Server up to 2019 requires VIEW SERVER STATE; from 2022, VIEW SERVER PERFORMANCE STATE. Visibility of AG metadata must also be permitted. Values may be delayed or NULL; an empty result is not an all-clear.

SELECT
  SYSDATETIMEOFFSET() AS sampled_at,
  adc.database_name,
  ar.replica_server_name,
  drs.synchronization_state_desc,
  drs.is_suspended,
  drs.log_send_queue_size AS log_send_kb,
  drs.redo_queue_size AS redo_kb
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_replicas AS ar
  ON ar.replica_id = drs.replica_id
JOIN sys.availability_databases_cluster AS adc
  ON adc.group_database_id = drs.group_database_id
WHERE drs.is_local = 0
ORDER BY adc.database_name, ar.replica_server_name;

Provide reliable memory and storage

The SQL VM needs reliably available resources, not as many vCPUs as possible. Size it against measured load and avoid host memory pressure. When setting SQL Server max server memory, leave sufficient memory inside the VM for Windows and other services.

  • Assess data, transaction logs and tempdb by their I/O behaviour. Separate virtual disks alone do not provide separate physical performance.
  • Align the CPU model and NUMA design with host hardware and planned migration targets. Change settings only with a reproducible before-and-after test.
  • Do not change offloads, jumbo frames and cache modes together on speculation. In particular, write acknowledgements and flush behaviour must remain reliable across the complete storage path.

Validate failover from the application's perspective

Test planned role changes, host failure and replica return separately. What matters is when users can work again and whether their transactions are processed correctly. Define approvals and stop criteria before triggering failures.

  • Connect through the listener, check active transactions and measure application reconnection time.
  • For conventional, non-contained AGs, provision and synchronise logins, SQL Agent jobs and other instance-level objects separately on the replicas.
  • After maintenance, check synchronisation and backlogs. Do not work on the next node until the agreed redundancy is restored.
  • Test SQL-aware backups and recovery independently of the AG. Replication does not replace backup.

Complete production approval

Technical feasibility and vendor support are separate questions. Microsoft's standard virtualisation support depends, among other things, on validated configurations. Check the exact platform combination in the SVVP context and the guest-clustering requirements. Support for unvalidated environments may be limited or require reproducing a fault outside virtualisation.

  • Document Windows, SQL and VirtIO versions and the support route before production use. This article does not claim SVVP certification for Proxmox.
  • Check SQL and Windows licensing, including secondary replicas, test operation and movement between hosts, against the applicable contracts. Passive replicas are not universally licence-free.
FOR YOUR PLANNING

Questions to resolve

  1. Is it clear whether an AG or FCI is needed?
  2. Are replicas, quorum and witness designed for the relevant failures?
  3. Do VirtIO queues and effective guest RSS settings align?
  4. Do load tests show a measurable benefit from the changes?
  5. Are application failover, restore, licensing and support resolved?