Friday, January 17, 2014

Windows PowerShell Script to Restart Memory Leaking Services

Background:

You have a service or two that has a modest memory leak and you would want to restart right when it has consumed a certain amount of memory.

This approach has an advantage over scheduled restarts because it will restart the service right when it is needed, or otherwise it leaves "it" alone.

This requires the use of Microsoft PowerShell which is available for XP (as download) and built-in on Windows Vista/7 and Server 2003 or later.

First time you try to run it, it is very likely that it won't run the script locally because out of the box, the script file is disabled. You will need to manually type in after manually opening PowerShell

Set-ExecutionPolicy RemoteSigned

From that point on it should permit running.

#
# This script detects the memory usage threshold and then restarts a service named in this script. You can
# run this script periodically in Scheduled Task to restart memory leaking service.
#
# Remember to do 
# Set-ExecutionPolicy RemoteSigned 
# so that this script can run
# To run this script from a BAT, 
# powershell -File RestartService.ps1
#
# First comment out the following two lines so that you can get the basic idea of the content of this stuff by
# looking at the proc.txt output file in your editor to hunt for the process name etc.
# Then it's easier to figure out the filtering for the name and the threshold.
#
#$Processes = Get-WmiObject -ComputerName "localhost" -Class Win32_PerfFormattedData_PerfProc_Process
#echo $Processes > C:\temp\proc.txt
#
# First do the Task Manager then find the EXE that is hosting the process or its subprocess then take the .exe out of that name
# If the task manager is showing *32, do not include that either.
#
$ServiceExe="MyServer"
#
# This is the name of the service to restart, this is the 'short' service name you can find in the Service's property
#
$Service="MyServerService"
#
# This is the working set threshold. For example, 3,500,000,000 would be 3.5 GB
#
#$Threshold = 3500000000
$Threshold = 500000000
#
# Real Meat of this program
#
$Process = Get-WmiObject -ComputerName "localhost" -Class Win32_PerfFormattedData_PerfProc_Process -Filter "Name='$ServiceExe'"
$wsm = $Process.WorkingSet /1024/1024/1024;
$thgb = $Threshold/1024/1024/1024
#
# Format the numbers so they are easier to read in GB units and round up to a
# decimal places.
#
$Fwsm = $("{0:0.000}" -f $wsm);
$Fthgb =$("{0:0.000}" -f $thg
b










);
e











cho $("Worksing Set is "+ $Fwsm + " gb and threshold is " + $Fthgb  + " gb");
if($Process.workingset -gt $Threshold)
{
    Restart-Service $Service; 
    echo "Restarted
"







;
}
e








lse
{
    $delta = $("{0:0.000}" -f ($thgb - $wsm));
    echo $("Still " + $delta + " gb left. Did not restart"
);

}
sl

eep 10

No comments: