Optimising MSSQL 2008 server inside VMWare ESXi
I normally run my MSSQL servers on dedicated servers, but we've taken on a client who is running their SQL Server inside a VMWare ESXi 4 host, and quite frankly it's running like crap.
We have identified that it is not the database itself that is the issue. We deployed the same database onto a dedicated server with lower specs than the VMWare guest and it ran at least 5x faster.
The server is:
Dual Quad Core Xeon 2Ghz (I don't know the exact model)
24Gb RAM
4x 300Gb SAS (RAID 10)
ESXi 4
The host is:
4x vCPUs
3Gb RAM
80Gb disk space
Server 2008 Standard
SQL Server 2008 Workgroup
The other VM's on the host are very low traffic. A 2nd DC (almost unused), a low-traffic web server and a low-volume terminal server (~5 users at any given time) and a few other misc guests.
I read an article a long time ago about setting a whole bunch of Paging settings in Windows and the SQL server to optimise it, but I can't find it any more :(
Are there any tips or tricks anyone can offer to increase the SQL performance?
Ok, here's some tips, in no particular performance-benefitting order;
- Make sure the VMs is running on model 7 virtual hardware (it says in the VM summary)
- Make sure all VM disks are fat not thin
- Upgrade to version 4 update 1
- Make sure all VMs have the latest vmtools installed
- For W2K8 VMs use the 'LSI SAS' disk controller and vmxnet3 NICs
- Make sure you have swapping switched on in the OS
- Disable screen-savers
- Set the video frame buffer to 4MB or less
- Remove any unnecessary virtual hardware from all VMs such as floppies, serial, parallel etc.
- As Zypher says ESX won't give a VM any vCPU time until all of it's allocated vCPUs are available - try reducing the number from 4 to 3 or 2 (don't be afraid to give a VM 3, 5 or 7 vCPUs, it feels odd but works just fine), also look at your other VMs, reduce their vCPUs if they don't need them - this machine doesn't have that many cores really
- Ensure hardware virtualisation is enabled in the BIOS and all power management options are tuned for performance
- Look at your VM's 'shares', consider increasing and/or lowering your various share values/priorities based on their importance and current behaviour - also seriously consider your reservation options - these options can make a huge difference in a contended box.
- Then obviously look at the SQL VM's performance data, particularly available memory, %RDY and disk queue lengths/wait
- Consider adding disks to the array and/or providing dedicated vmdk's/datastores/disks to this VM
I'll add more if I think of any ok, best of luck.
Go get the vSphere remote CLI (go to drivers and tools -> automation tools and SDKs)
After you have that setup log into the box and use esx top to see where your bottleneck is (informative linky)
Since you are running 4 vCPU's pay attention to the %RDY column of the processor screen in esxtop. this is how long the machine is waiting to gain access to 4 cpu's at once. Depending on which VMWare SE you talk to anything above 2-5 is BAD.
Also you can look at the graphs under "performance" tab of the VIC to see what is going on, look especially closely at the memory graphs, watch for a high memory balloon.