This timeout behavior typically occurs when SQL Server's connection pooling mechanism interacts with Hyper-V's power management features. The virtual machine's "soft sleep" state can cause TCP/IP connections to become unresponsive, despite the SQL Server service still running.
1. SQL Server TCP/IP Settings:
Verify the keep-alive settings in SQL Server configuration:
-- Check current TCP/IP settings
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'remote query timeout', 0; -- 0 means no timeout
EXEC sp_configure 'remote login timeout', 30; -- 30 seconds
EXEC sp_configure 'network packet size', 4096;
2. Hyper-V VM Configuration:
Disable power-saving features for the VM:
# PowerShell command to disable power saving
Set-VM -Name "YourVMMame" -AutomaticStopAction TurnOff -AutomaticStartAction Start
Modify your application's connection string to include timeout parameters:
Server=your_server;Database=your_db;Integrated Security=SSPI;
Connection Timeout=60;Pooling=true;Min Pool Size=5;Max Pool Size=100;
Adjust the Hyper-V virtual switch settings:
- Disable VMQ (Virtual Machine Queue) if enabled
- Enable SR-IOV if your hardware supports it
- Set the virtual NIC to use static MAC address
Create a scheduled task that periodically executes a simple query:
-- Create a maintenance procedure
CREATE PROCEDURE dbo.KeepAlive
AS
BEGIN
SELECT 1 AS KeepAlive;
END
GO
-- Schedule this to run every 5 minutes
Set up performance counters to monitor:
LogicalDisk(*)\Avg. Disk sec/Read
SQLServer:Wait Statistics(*)\*
Hyper-V Hypervisor Virtual Processor(*)\*
This timeout behavior typically occurs when SQL Server's resource governor or the Hyper-V dynamic memory management puts the VM into a low-activity state. The database engine maintains TCP connections but may throttle background processes during idle periods.
# PowerShell command to check current Hyper-V memory settings
Get-VM -Name "YourVMName" | Get-VMMemory
For production SQL Server VMs, consider these Hyper-V tweaks:
- Set Minimum RAM equal to Startup RAM (disable dynamic memory)
- Enable NUMA spanning for multi-processor environments
- Configure processor compatibility for older generation hosts
-- SQL query to modify connection timeout (in seconds)
EXEC sp_configure 'remote query timeout', 600;
RECONFIGURE;
-- Disable auto-close for databases
ALTER DATABASE YourDatabase SET AUTO_CLOSE OFF;
Add these parameters to your connection strings:
Server=myServerAddress;Database=myDataBase;Connect Timeout=300;
Pooling=true;Min Pool Size=5;Max Pool Size=100;
When the issue persists:
- Check SQL Server error logs for
17148
(server paused) or17147
(server resumed) - Monitor
sys.dm_os_wait_stats
for unusual wait types - Verify storage latency with
SELECT * FROM sys.dm_io_virtual_file_stats
For SQL Server 2012 specifically, create a scheduled job that maintains minimal activity:
USE msdb;
GO
EXEC dbo.sp_add_job @job_name = 'KeepAlive';
EXEC sp_add_jobstep @job_name = 'KeepAlive',
@step_name = 'Ping',
@subsystem = 'TSQL',
@command = 'SELECT 1',
@database_name = 'master';
EXEC sp_add_jobschedule @job_name = 'KeepAlive',
@name = 'Every5Minutes',
@freq_type = 4,
@freq_interval = 5;
Even with SSDs, improper VHDX configuration can cause timeouts:
- Use fixed-size VHDX instead of dynamically expanding
- Enable write-through caching in Hyper-V settings
- Separate tempdb onto a different virtual disk