One of the typical things of a webapp deployed on IIS is that everyday the first visitor has a very slow loading page. This is due to the application pool recycling. Every night, somewhere between 2 and 4 (for default installs) the application pools are recycled. After this when the first visitor arrives certain code is loaded again which takes some time. Consequent visitors don’t suffer this phenomena.
In the IIS world there’s a known solution for this: "IIS Warm Up scripts”. There even was a built-in module for this in IIS 7.5, however it was in beta state and currently has been removed from the web. With some PowerShell and Scheduled Task magic we can warm up IIS just as good. In my example the first user was experiencing a 15-20 seconds delay before the FIM Portal showed up. After applying the following solution that was more like 2 seconds.
Our script which will warm up the site will do this every time the application pool is recycled. The trigger for the scheduled task will be an event in the Application event log. Therefor we have to modify the default settings of the application pool so that it logs these events.
Open the IIS management console and locate the application pool responsible for the SharePoint site hosting your FIM portal
Righ-click and choose advanced settings, make sure to set “Specific Time” to True.
Every time the application pool is recycled by the schedule defined in the “Specific Times” array the following even will be logged:
A worker process with process id of '4420' serving application pool 'SharePoint - 80' has requested a recycle because it reached its scheduled recycle time.
Now the following script can be executed to warm up IIS. It will do this by visiting the page and performing a get. It’s very basic and probably can be improved or rewritten.
write-host -foregroundcolor green "Warming up $url";
$wc = new-object net.webclient;
$wc.credentials = $cred;
$html = $wc.DownloadString($url);
$website = http://FIM.setspn.blogspot.com/IdentityManagement
$credentials = [System.Net.CredentialCache]::DefaultCredentials;
get-webpageWithAuthN -url $website -cred $credentials
Now we can create the Scheduled Task. I choose to run it as “local system”. This seems enough to warm up the portal. I think because this way the FIM Service is queried to see if “Local System” (my FIM server itself) is known in the portal. Obviously this is not the case and I will probably see a “Service not available” error. But the point is that the Portal is warmed up!
We will add some triggers:
- Type: On an event
- Log: System
- Source: WAS
- Resource ID: 5076
Then we will specify an action:
- Action: Start a program
- Program/Script: PowerShell.exe
- Add arguments: c:\yourfolder\script.ps1
- Start in: c:\yourfolder
If we also want to trigger the script when we an administrator recycles an Application Pool we have to add a trigger for event 5079 (System –> WAS: 5079)
If we also want to trigger the script when we perform an IISreset we can add a trigger for the following event 3201 (System > IIS-IISREeset: 3201)
Obviously this way of working could be applied for other websites too.