Category: Virtualisation

Over the past few evenings, I’ve been playing with SQLIO, to get an idea of how SSD compares to a couple of servers (one quite old, one a bit newer) that I have access too.

SQLIO can be used to do performance testing of an IO subsystem, prior to deploying SQL Server onto it. It doesn’t actually do anything specifically with SQL, it’s just IO.

If you haven’t looked at SQLIO, I would highly recommend looking at these websites:

The SQLIO Analyser, created by David Klee, is amazing. It allows you to run the SQLIO package (a preconfigured one is available on the site) and submit the results. It then generates an Excel file that contains various metrics. It’s nice!

Running on my Laptop…

Having run the pre-built package on my laptop, I got the following metrics out of it. As you can see, it’s an SSD  (Crucial M4 SSD), and pretty nippy.



Interesting metrics here, and one of the key benefits of an SSD, is that regardless of what you are doing, the average latency is so low. For these tests, I was getting:

Avg. Metrics Sequential Read Random Read Sequential Write Random Write
Latency (ms) 19.28ms 18.38ms 23.21ms 51.51ms
Avg IOPs 3777 3493 2930 1340
MB/s 236.07 218.3 183 83.7

Running on an older server

So, running this on an older server, connected to a much older (6-8+ years old) SAN gave me these results. You can see that the metrics are all much lower, and there is a much wider spread of for all the metrics, and that is down to the spinning disks.



As you can see from the metrics below, there is a significant drop in the performance of the server, a lot more variance across the load types.

Avg. Metrics Sequential Read Random Read Sequential Write Random Write
Latency (ms) 24.81ms 66.79 373 260
Avg IOPs 1928 710 186 210
MB/s 120 44.3 11.6 13.14

Slightly newer Server

So, next I had the SQLIO package running on a slightly newer server (with a higher spec I/O system, I was told), which gave the following results.



As expected, this did give generally better results, it is interesting that Sequential read had better throughput on the older server.

Avg. Metrics Sequential Read Random Read Sequential Write Random Write
Latency (ms) 35.13 44.17 41.81 77.44
Avg IOPs 1474 1021 1314 794
MB/s 92.7 63.8 82.8 49.6

Cracking open VMware

Since I use VMware Workstation for compartmentalising projects on my laptop, I thought I’d run this against a VM. The VM was running on the SSD (at the top of the post), so I could see how much of an impact the VMware drivers had on the process. This gave some interesting results, which you can see below. Obviously there is something screwy going on here, it’s not likely that the VM can perform that much faster than the drive it’s sitting on. Would be nice if it could though…



Avg. Metrics Sequential Read Random Read Sequential Write Random Write
Latency (ms) 7.8 7.5 7.63 7.71
Avg IOPs 12435 13119 15481 14965
MB/s 777 819 967 935

While the whole process was running, Task manager on the host machine was sitting at around 0-2% for disk utilisation, but the CPU was sitting at 50-60%. So, it was hardly touching the disk.



Just to summarise this, in case you didn’t already know, SSD’s are really quick. For the testing I was doing, the SSD was giving me approx. double the performance from some pretty expensive hardware (or at least it was 5-10 years ago…)

Also, take your test results with a grain of salt.

Having spent some time creating posts and doing some work on Virtual Clusters, I saw that Jonathan Kehayias from SQL Skills had also done a set. They are linked below:

Building a Completely Free Playground for SQL Server – (1 of 3) – Downloading the Software and Setting up a Windows Server 2008R2 VM Template
Building a Completely Free Playground for SQL Server – 2 – Setting up Active Directory and the iSCSI Virtual SAN

Building a Completely Free Playground for SQL Server – 3 – Creating the Failover Cluster Nodes and Configuring the iSCSI Environment
Building a Completely Free Playground for SQL Server – 4 – Creating the Cluster

I also suggest looking at his posts, as they cover alot of the functionality that I have, but in some greater detail. Additionally, he covers using the iSCSI Target for Windows Server, which I didn’t know about (Every day’s a school day!). Mine are here (for completeness).

Creating a Virtual Cluster – Part 1 – The Storage
Creating a Virtual Cluster – Part 2 – The Windows Cluster

Creating a Virtual Cluster – Part 3 – SQL Server


This is part 3 of a set of posts around creating a Virtual cluster on SQL Server, which I’m creating to raise my awareness of clustering.

Part 1 of this series created the Shared Storage used by the cluster, using FreeNAS.MyCluster

Part 2 of this series created a Windows Cluster using this storage.

This section will cover creating a SQL Server cluster using this environment.

The architecture diagram to the right shows the cluster we are creating. This post will cover the clustering of SQL1 and SQL2.

Step 1 – Starting the Process

The first step is to get the SQL Server media available to the server. I’ve taken a copy of the DVD and placed it on the C Drive on the first node of the cluster.

Run Setup.exe, which’ll install some pre-requisites (you should do this on both nodes, to make for an easier life). When the server’s have restarted, run setup.exe on the active node (SQL1 in my case).

Within SQL Server Installation Center, click the Installation option on the Left, and choose New SQL Server Failover cluster Installation.


The Wizard will start, and as normal, will take you through installing the setup support files. Once this has completed, the Setup support rules will run, and any issues will be flagged. This includes a set of checks around Clustering.


The one that has a warning here, checking to see if MSDTC is clustered, effectively means that there may be issues with linked server queries, and SSIS. It’s not required for the Cluster to build however, so lets press on. Clicking Next gives us the Feature Selection screen.


I’m only going to install the Database engine, Integration Services and Management tools. Click Next.

In the Instance Configuration screen, enter the name for the SQL Cluster.(SQLCluster in my case).


Click next to confirm the disk usage requirements, Confirm the name of the Cluster Resource group (selecting the default).


Click next, and we are prompted to select the disks for the SQL Cluster. I’m selecting all the unused disks.


Click Next, and confirm the Network settings for the Cluster.


Click next and confirm the Cluster Security Policy (the default being to use the Service SIDs).


Click Next to continue,  for the Services, provide a Domain account, and click next.

Next you are prompted for Database engine configuration as normal, click Next, Click Next on the Error Reporting screen. The next screen is the Cluster Installation rules. These should all be passed, so click Next.


Click next and next to start the Installation. The installation will take a little while to run.

Upon completion, you’ll get this:


If you now look in the Failover Cluster Manager, you’ll see the SQL Cluster in Services and Applications.


Next, you can fire up SQL Server Management Studio and connect to the Cluster.

If you go to Server Properties, you can see that the Server is Clustered.


The Default System databases (Master, MSDB, Model and Tempdb) are all now stored in one of the cluster drives, and the default drive for databases will also be that drive.

Step 2 – Adding the Second Node

Next we need to add the second node to the Cluster, so switch to your other Member server, and run setup.exe, from the Installation section choose ‘Add node to a SQL Server failover cluster’.

Run through the installation screens, and note that it should pickup the SQL Server Cluster name when you get to the Cluster Node configuration screen.


Click Next, enter the passwords for the Domain accounts on the on the Service accounts page, and click next on the Error Reporting page.

The Add Node Rules page should complete successfully, so click Next.


Then Click Install to continue.

When this has been successful, you’ll see:


Step 3 – Test it out

I’ve taken a backup of the AdventureWorks DW 2008 R2 database from my laptop and copied the backup to SQL1. Note that to restore a database, it must be on one of the Cluster drives, so having copied the Backup file to the shared drives, I can now restore it.


Having restored this database, I can now run queries against it, and see what activity is taking place, through the performance graphs on FreeNAS. You can see from the graphs below that are spikes when the Cluster nodes were connecting, and the then later when the database was copied over and restored.




The next post will be around optimising and getting some performance metrics off this cluster.

As part of this ongoing series in creating a Virtual Cluster, this post will cover the creation of the Windows Cluster, using the Shared Storage created in Part 1.

MyClusterAs can be seen in the proposed architecture diagram to the left, we have a Shared Storage device, and next we’ll be setting up the Windows Servers, then adding the two SQL Server boxes together to create a cluster.

Part 3 of this series will be to create a SQL Server Cluster.

Step 1 – Creating the Windows Servers

I’m going to assume that you can install Windows Server 2008 R2.

We’ll be needing three instances of Windows Server 2008 R2. One running as a Domain controller, and two member servers.

So, go ahead and create those three VM’s, set one up as a domain controller, and add the two member servers to the domain.

Note that each of the Network cards in each server should have static IP Addresses.

For the specification of the servers, I’ve gone with this for the domain controller, since it doesn’t require a huge amount of resources.


The two member server’s need an additional network card for the heartbeat connection. To achieve this, both these server’s have an additional network adapter, configured on a private network.


Once the two member servers are up and running, go to Server Manager, right click on Features and Tick the Failover Clustering option. Click through the Wizard to install it. Do this on both Member servers.

Step 2 – Adding the iSCSI Targets on Member Server 1

Next, we need to add the iSCSI Target created previously, to the Windows Server. Do this by going to Start -> Administrative Tools and iSCSI Initiator. In here, go to the Discovery Tab, and click Add Portal


Then, you’ll be able to click on the Targets tab, and you should see the drives hosted on the FreeNAS VM.


Highlight each disk (starting with the Quorum disk) and click the Log on Button. Tick the ‘Automatically restore this connection when the computer starts’ tickbox, and click Ok. Repeat this step for each disk.


Next, you’ll be able to go to Disk Management, and you’ll see the disks you’ve just created. For each disk, you need to Bring them online, Initialise them, Create a Simple Volume on them using NTFS, and then take them offline again.


Step 3 – Setting up Member Server 2

Next, we need to add the iSCSI drives to the 2nd Member Server. So go to Start -> Administrative Tools and launch iSCSI Initiator. If you are prompted to Start the Service, say yes. As before, go to the Discovery tab, click Add Portal, enter the IP Address of the FreeNAS VM, and click OK.

Go to the Targets tab, and Log on to each of the drives, and ensure you tick the Automatically log on tickbox.

Next, go to Disk Management in Server Manager, and you should see the drives, Offline, and with Blue lines, indicating the drives are configured.

Step 4 – Validating the Cluster

One of the really helpful features of Windows Server 2008 R2 is the ability to validate your cluster configuration, prior to creating it. It runs a whole long list of tests, and tells you how it got on. Tests include the Disk Subsystem (can both members connect to the drives), Networking (is there a Heartbeat card in both, that communicates, IP Address checks, etc) and checking all the services are configured appropriately.

To validate your Cluster, go to Start -> Administrative Tools and Failover Cluster Management. Then click Validate a Configuration…


The Wizard will start, and page 2 will prompt you for your server names. Enter these, or browse for them


Click Next, Click Next to choose to Run all the tests, and click Next to run them. It takes a little while to run them all. All being well, you’ll get a list of Green, followed by a screen similar to this:


“If the light is green, the trap is clean” – Link

Note: If your validation fails due to an IP Address conflict, and you can’t see a network card that is causing it (since all your servers have Static IP Addresses), there may be an issue with the ‘Teredo Tunneling Pseudo interface’. This can be resolved by going to Device Manager, go to View and click Show Hidden Devices. Right Click on the Teredo Tunneling Pseudo-Interface and choose Disable. Then revalidate your Cluster configuration.


Step 5 – Creating the Cluster

Once we’ve successfully Validated the cluster, we can create the cluster. This can be done by Clicking ‘Create a Cluster…’.


You’ll be presented with a Wizard. Click Next, and enter the names of the two member servers and click next. Enter the name of the Cluster, and if you have DHCP, the IP address will be configured. If you aren’t using DHCP, it’ll need to be specified. Click next, and the information will be confirmed. Click Next and your Cluster will be created.


If everything is successful, you’ll get a confirmation screen, and confirmation of the Quorum type configured.


You’ll then be able to see the details in Failover Cluster Management, showing the various disks, and the drives will appear in Windows Explorer, showing the Clustered Disks.


So that’s Part 2 completed, we now have a Shared Storage device, and a Windows Cluster running off it, using 4 VM’s. Next we need to install SQL Server on the Cluster to get it doing something.

As part of my ongoing work towards the MCM Certification in SQL Server, something I wanted to look into was the creation of a cluster to play with. It turns out this isn’t a straightforward as you might think (!).

DISCLAIMER – This isn’t a plan for a live production environment. It is a plan for a set of Virtual Machines, that you can use to play with.

DISCLAIMER 2 – This is most certainly not a guide on how to use FreeNAS. This method works, but I make no claims that this is the best way to do it, as I’m certainly not a FreeNAS Expert.

MyClusterTo get the process around creating a cluster together, I’m going to write a few blog posts:

Part 1 – Creating the storage (This post)
Part 2 – Creating the Windows Cluster (Pending)
Part 3 – Creating the SQL Server Cluster (Pending)

There may be additional parts…

I’m anticipating creating a network as shown in the diagram to the right.

It’ll be a Windows Domain, so there’ll be a Domain controller (VMLAN-DC), two SQL Server’s which’ll eventually be running in a Cluster.

One thing that a Cluster needs is a shared storage area. To achieve this, I’m going to use FreeNAS, which is an Open Source Storage Platform. It’ll allow me to create ISCSI-3 drives and since Requirements for Windows clustering specify Serial attached SCSI, Fibre Channel or ISCSI for storage, that’ll work.

Step 1 – Download FreeNAS

I’m going to use FreeNAS 8 since that is the current (at this date) version. It’s a free download, so go here, and set it downloading (approx. 130mb).

Step 2 – Start your Virtualisation

Next up, start your virtualisation engine of choice. I’m going to use VMWare Workstation 8, as it’s always served me well in the past, and it gives me flexibility that I need. I imagine this process should work with other Virtualisation platforms. Create yourself a VM, and I’m giving it the following specification:


2 Gb RAM, which I may reduce after testing, and just the one core.

Hard Disk 1 will be used by FreeNAS.

Hard Disk 2 will be the Quorum disk (used for Clustering).

Hard Disks 3-6 will be available for shared storage (Data, Log, Tempdb, Backup).

Virtually insert the ISO Image, and start the VM.


Choose Option 1 to Install to a Hard Drive


Choose da0 to install to the appropriate Disk.


Click Yes, to continue with the installation.


Upon completion, Press OK, Choose 4 to Shutdown the machine, and when it’s done, ‘eject’ the ISO Image.

Then restart the VM. When it has completed starting up, you’ll be presented with a screen similar to this:


The important bit here is the web address at the bottom. Open that up in a browser.


Step 3 – Configuring FreeNAS

The first thing to do is assign a password, as this’ll get rid of the annoying red light in the top right corner. Click the Account Icon, choose the Change Password option and enter a new password.

The next thing we need to do is to add the storage devices into FreeNAS. Do this by clicking on the Storage icon at the top, then click on Create Volume


Then enter the volume name, pick the Member disks and choose ZFS as the filesystem, then click Add Volume. I’m going to create them as follows:

quorum – da1
disk1 – da2
disk2 – da3
disk3 – da4
backup – da5

This should give you the following results:


Step 4 – Configuring iSCSI

Next click on the Services icon, and click the spanner next to the iSCSI service.


In here, you’ll have a number of tabs. First, we’ll need to create a Portal:


So, click the Portals tab, and click Add Portal. The IP Address of the server should appear in the box, if you have, replace it with the IP Address of the server, so it should be <ipaddress>:3260. Then click ok.


Next click, Authorized Initiator, to add an Initiator. Leave the defaults here (ALL and ALL) and click Ok.


Next go to the Targets tab, and click Add Target. You need to add a target for each disk, so for each, you’ll need to add a name, choose Disk as Type, Choose 1 for Portal Group and 1 for Initiator Group, and click OK. Repeat this for each disk. This should result in this screen:


Next we need to add extents to the NAS, so click on the Extents tab, and click Add Extent. Again, we need to create one for each disk, so enter a name, choose the path, and add /<diskname> to the end, and specify the extent size, which’ll be 10240MB for the 10gb disks. Repeat this for each disk.


So, you’ll have these extents:


Next we need to associate the Targets we created earlier, with the Extents. Click on the Associated Targets tab, click Add Extent to Target, and for each disk, pick the Target and Extent to match.

Next, click the System Icon, click Reboot, and let the system reboot. When it comes back up, log in to the Web UI again, click the Services icon, and click the On/Off Toggle next to iSCSI and it should start.


Step 5 – Testing iSCSI

The easiest way to test that the iSCSI connection works is to run the iSCSI Initiator, which’ll be on a server, or your Windows 7 Desktop. Go to Start -> Administrative tools and click iSCSI Initiator. It’ll ask to start the service. Say yes.

Then, in the Target box at the top, enter the IP Address of your FreeNAS VM, and click Quick Connect. If all is working, you’ll be presented with the list of disks from the FreeNAS VM.


Congratulations, you’ve created a FreeNAS Environment for your Cluster!

Next up, creating the Windows Cluster

I’ve recently had my work laptop upgraded to a Sony VAIO VBCEB1Z0E, which is pretty nice (nice = lighter, faster, higher res screen, and runs cooler too!).

And the WEI for it it this:


However, from running a virtual machine on it, in VMware Workstation (my virtualisation tool of choice), I get a WEI of this:


So, the Virtual machine has faster Desktop graphics, and faster primary hard disk. Given that, if VMware can beef up their 3d Graphics and  Memory access drivers, then a VM on this laptop could be faster than the actual laptop. How cool would that be ?