Planning and Migrating a Small Organization from Exchange 2003 to Exchange 2013 (Part 8)

If you would like to read the other parts in this article series please go to:

Testing Disk Performance

Modern versions of Exchange Server have substantially lower disk performance requirements than previous versions of Exchange, especially in Exchange 2013. This does not mean that we can avoid thoroughly testing the storage that supports our implementation though. The results of the Exchange sizing calculators provided information about the number of disks required to support our Exchange 2010 staging server and subsequent Exchange 2013 server and aims to ensure we have the lowest number of disks required to support the solution, within the parameters we specified. That means that a sub-standard batch of disks, RAID controller firmware version or any number of factors could result in a situation where even though we have built the supporting infrastructure to these standards, Exchange still suffers from performance issues. Likewise within a virtual infrastructure, other supporting components may not be able to handle the total throughput we need, especially when combined with other virtual machines.

By properly testing the infrastructure using Microsoft’s recommended tools we can ensure that before we move the servers into production we know that the Exchange 2010 and 2013 virtual machines were able to support the planned workloads.

About JetStress

There are many ways to test the read/write storage performance, and virtual infrastructure administrators may have their own preferred toolset. While the results of those tools may be useful, they do not replace testing with Microsoft’s specialised Exchange stress testing tool, JetStress.

JetStress is designed to use the same ESE (Extensible Storage Engine) file versions as the installed version of Exchange will use. It interfaces with ESE to communicate with the underlying storage and retrieves relevant performance counters to provide accurate statistics on how the environment will perform with Exchange. It is an essential tool for Exchange deployments and should always be used.

For Exchange 2010 and Exchange 2013, Microsoft provide two different versions of JetStress, one for Exchange 2010 and below, and one for Exchange 2013. To complement each version, Microsoft also make available two editions of the JetStress Field Guide which is essential background reading to understand how and why JetStress should be used.

You can download the JetStress field guide for JetStress 2010 and 2013 from the following URLs:

Due to its importance we will run through the setup and run process for JetStress for both environments, with particular emphasis on features that are most suitable to the shared virtual environment we will use and the environment design.

Installing JetStress 2010

We’ll start by installing and configuring JetStress 2010. We can download the current version of JetStress 2010 here.

After download we will install JetStress 2010 into the default location:

Figure 1:
Installing JetStress 2010

If you change the location from the default, make a note of where you install it as we’ll need to access the installation folder before using JetStress.

Locating JetStress 2010 ESE Files

The reason we’ve already extracted the Exchange 2010 SP3 installation files is to ensure we have the right version of the ESE files available to use with JetStress, as it will test using the same versions of the files we will be using in our production environment.

The files we’ll need to locate are as follows, available in the following sub-folders within the Exchange 2010 setup:

File Location
Ese.dll Setup\serverroles\common
Eseperf.dll Setup\serverroles\common\perf\amd64
Eseperf.hxx Setup\serverroles\common\perf\amd64
Eseperf.ini Setup\serverroles\common\perf\amd64
Eseperf.xml Setup\serverroles\common\perf\amd64

Table 1

After locating each file, copy it to the installation folder we noted down earlier for JetStress. On our Exchange 2010 staging server, the default location is C:\Program Files\Exchange JetStress:

Figure 2: Locating additional required files

After copying the files, launch JetStress. We’ll need to launch it twice in succession before use. After the first launch you’ll see in Checking Test System that the performance counters are registered and you’ll be informed that the tool needs to be restarted:

Figure 3: Loading performance counters

Configuring JetStress 2010 for first run

After launching JetStress for the second time, we’re ready to go. In the Checking Test System this time we’ll see both the Exchange storage engine and performance counters load successfully, and we’ll press Next to continue:

Figure 4: Starting the JetStress configuration

We’ll now have the opportunity to load an existing configuration (which, if you are testing a number of hosts will be useful) or create a new config. You can, if you prefer, choose a location to store the configuration of your choosing, or as we’ll do here, use the default:

Figure 5: Creating a new configuration file

On the Define Test Scenario page that follows, we’ll have the option to Test disk system throughput or test an Exchange Mailbox Profile. The aim of this test is to verify that the underlying storage can support the overall performance required to support Exchange 2010, so we’ll choose the first option:

Figure 6: Choosing test disk subsystem throughput

Next we’ll need to define how big a test database to create, and also specify how hard we’ll push it. The capacity percentage field allows us to define how much of each disk we’ll use. It is recommended to use 100% for a real test.

We’ll also initially need to suppress auto-tuning when using JetStress 2010 and specify a starter value. A value of 2 per database is a good number to begin with, but we will adjust this over the course of a few runs to find the highest value that the test passes with.

Figure 7: Selecting a thread count of 2 and capacity percentage of 100%

On the Select Test Type page we’ll choose the relevant type of test, Performance, then, for our virtual environment, we will ensure that Multi-host test has been chosen in addition to run background database maintenance. This is because later on we’ll want to ensure that we can run JetStress concurrently against Exchange 2010 and 2013 environments whilst they coexist in the virtual environment:

Figure 8: Selecting a test type of performance

Before we move on to configure the location for each Mailbox Database used for the test, we’ll need to specify a path for the output files, which include the performance counters and HTML report generated, along with a test duration.

The default location is typically OK, however feel free to select a location of your choice. The test duration will vary though. For an initial run, you may wish to choose 2 hours, followed by a re-test after the right thread tuning has been determined of 24 hours to ensure that the test successfully passes.

Figure 9: Selecting a test duration initially of 2 hours

On the Define Database Configuration page our next task is to specify the location used for each database. This should mirror the locations we’re planning on using for the production databases, therefore ensure you specify the correct locations here.

Figure 10: Setup of the database and log configuration

The subsequent Select Database Source page will provide us with an option to use or create new databases. On subsequent runs we will choose to Attach existing databases, but for the initial run we will choose to Create new databases. This should ensure that it creates a single full-sized database with random data then duplicates it across each disk:

Figure 11: Creating new databases for the test

Our final task when preparing JetStress is on the Review & Execute Test page. We’ll choose to Prepare Test which will create the test databases as per the above specifications.

Figure 12: Initiating the preparation

The preparation for the test can take significant time to complete, so be prepared to wait. If, for example, you need to wait for a 1TB database to be created expect to wait several hours – then a while longer to copy the test database.

Executing JetStress 2010

After preparation successfully completes, we’ll execute the first run of the JetStress test. To begin, we’ll choose Run Test:

Figure 13: Starting the JetStress test

The test process should then begin. Although we may specify 2 hours, expect it to take a little more than that as after the 2 hour run it will then need to analyse the data collected. After the run is successful, you’ll see a link to the HTML Performance report listed. Open this in a browser:

Figure 14: Locating the results file after test execution

Interpreting Test Results

The JetStress 2010 performance report provides the information we need to understand whether or not the underlying hardware is able to support usage for Exchange 2010, as even if it’s staging server during the migration it still needs to be able to support day-to-day activity by users.

The first relevant section is the Test Summary. We’ll look to see if the Overall Test Result is Pass.

If we have a successful test then we will ideally re-run the test, after increasing the thread count mentioned above, until a point at which the test fails. This is to find the highest thread count we can use for a successful test and thus provide evidence of the maximum performance the environment can provide.

Figure 15: Viewing the Test Summary

We’ll also look at the headline figure in the Database Sizing and Throughput section and record the value in the Achieved Transactional I/O per second field:

Figure 16: Viewing Database Sizing and Throughput

Finally we’ll examine columns in the Transactional I/O Performance section, in particular the sum of the I/O Database Read/sec + I/O Database Writes/sec columns, and the sum of the corresponding I/O Log Reads/sec and I/O Log Writes/sec columns:

Figure 17: Viewing Transactional I/O Performance

We’ll compare the results to the Exchange Server 2010 Mailbox Role Requirements Calculator results used earlier in this series for sizing. In the Role Requirements tab we’ll look in the Host I/O and Throughput Requirements section and look for the Server column:

Figure 18: Comparing results from the sizing calculator

From the results above we needed 40 IOPS for the Database, and 8 for the Logs. We can see that the JetStress result proves that the underlying storage can sustain this performance.

After setup of JetStress 2013 we’ll revisit the JetStress 2010 testing to ensure that both systems can operate side-by-side, and in the meantime feel free to run a 24-hour test on the storage to further validate its performance.


In this part of the series we have performed the basic validation of the storage architecture that will support our Exchange 2010 server environment. In part nine of this series we’ll conclude JetStress testing with JetStress 2013 setup and dual-testing of both systems.

If you would like to read the other parts in this article series please go to:

Leave a Comment

Your email address will not be published.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Scroll to Top