functions/Test-DbaMaxMemory.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Function Test-DbaMaxMemory
{
<#
.SYNOPSIS
Calculates the recommended value for SQL Server 'Max Server Memory' configuration setting. Works on SQL Server 2000-2014.
 
.DESCRIPTION
Inspired by Jonathan Kehayias's post about SQL Server Max memory (http://bit.ly/sqlmemcalc), this script displays a SQL Server's:
total memory, currently configured SQL max memory, and the calculated recommendation.
 
Jonathan notes that the formula used provides a *general recommendation* that doesn't account for everything that may be going on in your specific environment.
 
.PARAMETER SqlServer
Allows you to specify a comma separated list of servers to query.
 
.PARAMETER SqlCredential
Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. To use:
 
$cred = Get-Credential, then pass $cred variable to this parameter.
 
Windows Authentication will be used when SqlCredential is not specified. To connect as a different Windows user, run PowerShell as that user.
 
.NOTES
Tags: Memory
dbatools PowerShell module (https://dbatools.io, clemaire@gmail.com)
Copyright (C) 2016 Chrissy LeMaire
 
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
 
.LINK
https://dbatools.io/Test-DbaMaxMemory
 
.EXAMPLE
Test-DbaMaxMemory -SqlServer sqlcluster,sqlserver2012
 
Calculate the 'Max Server Memory' settings for all servers within the SQL Server Central Management Server "sqlcluster"
 
.EXAMPLE
Test-DbaMaxMemory -SqlServer sqlcluster | Where-Object { $_.SqlMaxMB -gt $_.TotalMB } | Set-DbaMaxMemory
 
Find all servers in CMS that have Max SQL memory set to higher than the total memory of the server (think 2147483647) and set it to recommended value.
 
#>


[CmdletBinding()]
Param (
[parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $True)]
[Alias("ServerInstance", "SqlInstance", "SqlServers")]
[object]$SqlServer,
[System.Management.Automation.PSCredential]$SqlCredential
)

PROCESS
{
foreach ($servername in $sqlserver)
{
Write-Verbose "Counting the running SQL Server instances on $servername"

try
{
# Get number of instances running
$ipaddr = Resolve-SqlIpAddress -SqlServer $servername
$sqls = Get-Service -ComputerName $ipaddr | Where-Object { $_.DisplayName -like 'SQL Server (*' -and $_.Status -eq 'Running' }
$sqlcount = $sqls.count
}
catch
{
Write-Warning "Couldn't get accurate SQL Server instance count on $servername. Defaulting to 1."
$sqlcount = 1
}


            $server = Get-DbaMaxMemory -SqlServer $servername -SqlCredential $SqlCredential

if($null -eq $server)
            {
                continue;
            }


$reserve = 1

            $maxmemory = $server.SqlMaxMB
            $totalmemory = $server.TotalMB

if ($totalmemory -ge 4096)
{
$currentCount = $totalmemory
while ($currentCount/4096 -gt 0)
{
if ($currentCount -gt 16384)
{
$reserve += 1
$currentCount += -8192
}
else
{
$reserve += 1
$currentCount += -4096
}
}
$recommendedMax = [int]($totalmemory - ($reserve * 1024))
}
else
{
$recommendedMax = $totalmemory * .5
}

$recommendedMax = $recommendedMax/$sqlcount

[pscustomobject]@{
Server = $server.Server
InstanceCount = $sqlcount
TotalMB = $totalmemory
SqlMaxMB = $maxmemory
RecommendedMB = $recommendedMax
}
}
}
}