UPDATE – March 14, 2016: Microsoft has published official guidance for implementing the changes outlined in this article using PowerShell. Details here.
Introduction
RADIUS and Inbox accounting are the two supported logging options for DirectAccess in Windows Server 2012 R2. When Inbox accounting is selected, a Windows Internal Database (WID) is provisioned. Part of the base operating system, WID is functionally similar to SQL Server Express.
SQL Server Utilization Issues
Over the last few months I’ve had a few customers reach out to me with a peculiar performance issue. For customers with very busy DirectAccess servers, where those servers have also been configured to use Inbox accounting, they’ve reported observing unusually high CPU utilization on the sqlservr.exe process.
Image courtesy Thomas Vuylsteke. Used with permission. – setspn.blogspot.com
As luck would have it, Thomas Vuylsteke, a Microsoft Platforms Premiere Field Engineer (PFE), had already identified the issue and a workaround. Thomas traced the source of high CPU utilization on the sqlservr.exe process to a missing index on a session state table in the DirectAccess accounting database. If you are interested in learning how he performed the troubleshooting to identify and resolve this problem, you can read his entire blog post here.
Resolution
To resolve this issue, create an index on the Session Table in the DirectAccess database. Changes to WID must be made locally, as it is not remotely manageable. WID does not include a management interface, which means the SQL Server management tools would normally have to be installed. However, I’m not a fan of installing any extraneous software on the DirectAccess server, so thankfully one of the readers of Thomas’ excellent article on this subject, Fredrik Elmqvist, provided a very helpful alternative. Fredrik suggesting using the HeidiSQL tool, for which a fully portable version exists. This allows for changes to be made to the WID database without having to install any additional software.
Changes to WID
Begin by downloading the portable version of HeidiSQL here. Next, log on to the DirectAccess server as the local administrator. It is crucial that you must be the local administrator, not just a local or domain user with local administrator privileges. Extract the files from the download and copy them to the DirectAccess server, then follow these steps:
- Double-click heideisql.exe to launch the management tool.
- Click on New and then for the Network Type select Microsoft SQL Server (named pipe).
- For the Hostname / IP: enter \\.\pipe\MICROSOFT##WID\tsql\query.
- Select the option to Use Windows Authentication.
- Click Open to continue.
- Click the Query tab in the center console window and enter the following commands:
Use RaAcctDb
Create NonClustered Index IdxSessionTblSessionState on SessionTable (SessionState,ConnectionID) - Click the Run icon in the tool bar or press F9. This will execute the code and create the missing index on the Session Table in the DirectAccess database.
- Confirm the index was created by clearing the previous query or creating a new query and then entering the following commands:
select * from sys.indexes
where name like ‘idx%’
order by name asc
Summary
Once the change has been made, sqlservr.exe CPU utilization should return to normal. If you have multiple DirectAccess servers configured in a load-balanced array or in a multisite configuration, be sure to repeat these steps on each DirectAccess server in the organization.
Devendra
/ April 9, 2018Thanks for the post….I performed exactly the same steps in this article, however the sqlservr.exe process still above 70%, I rebooted the servers couple of time but no luck.
Richard M. Hicks
/ April 14, 2018If you’ve run the update as described in the Microsoft article and the index has been successfully added to the table, you likely have another issue that is unrelated. I can only suggest giving Microsoft support a call to troubleshoot.
oderbang
/ August 4, 2022Another Option to run HeidiSQL as local administrator from your normal Admin account is to hold down CTRL + ALT then right click the .exe and click “Run As Another User” in the context menu.
Then enter the username as “.\Administrator” and enter the password
Note the full stop backslash “.\” before the username this tell the login prompt to use the local machine as the identity provider.