Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разбиране на важността на настройката на паметта в SQL Server

Паметта е един от ресурсите, формиращи триъгълника на производителността - процесорът и паметта са другите два. Ако единият бъде ударен, другите два поемат натоварването, за да се опитат да доведат производителността до приемливи нива, но винаги има компромис. Каквито и транзакции да не могат да бъдат ангажирани в паметта, те ще бъдат препратени към дисковата подсистема от SQL Server. Това причинява затруднение в производителността. Следователно статистиката за чакане може да помогне за идентифициране на проблеми с производителността на SQL Server.

В тази статия се обсъждат следните теми:

  1. Разбиране на вътрешните елементи на настройката и конфигурацията на паметта на SQL Server
  2. Паметта на SQL Server и нейното въздействие върху производителността на базата данни и приложението
  3. Обсъдете различни компоненти на SQL Server, които допринасят за използването на паметта
  4. Най-добри практики и препоръки за оразмеряване на паметта
  5. Отчет за паметта на множество сървъри
  6. И още...

Вътрешни елементи за управление на паметта

SQL Server има модул за управление на паметта, който извършва автоматизирано динамично управление на паметта въз основа на натоварването на системата. Тази памет е променливото пространство, което е от решаващо значение за днешните бизнес и технически нужди, чието правилно оразмеряване е жизненоважно за оптималната производителност на приложенията.

Всички обаче знаем, че при настройката на сървъра оразмеряването съдържа някои стойности по подразбиране. в някои случаи скоро откриваме, че SQL Server използва почти цялата памет на сървъра, въпреки че няма видима активност в базите данни, което води до въпроси:Неправилни ли са стойностите по подразбиране? Ако е така, какъв трябва да е правилният размер?

Управлението на паметта на SQL Server работи по алгоритъма за запълване и измиване. Стойностите по подразбиране не ограничават потреблението на памет от нарастване, освен ако няма заявка от операционната система.

Оразмеряването зависи от различни компоненти на системата – в много случаи настройването му между 70% и 80% е добра отправна точка. След това трябва също да го наблюдавате, за да видите какво още може да ви липсва и дали трябва да промените настройката. Ако имате други услуги на SQL сървъра (наистина не трябва), може да се наложи да оставите след себе си повече, особено ако тези услуги са прасета на паметта. Помислете за преразглеждане на настройката на паметта на SQL екземпляр в някой от следните сценарии:

  • Неотзивчивост на операционната система
  • Изчерпване на приложението
  • Операции за архивиране, които изискват големи буфери на паметта
  • Оптимизирани в паметта обекти
  • Съхранявайте индекси в колони, тъй като те изискват големи обеми памет за извършване на поддръжка на индекси.

Настройката на паметта на SQL Server е доста проста. Можете да промените стойността с помощта на sp_configure или SSMS GUI. Това е онлайн опция, но не забравяйте, че настройката или нулирането на тези стойности може да доведе до разместване на някои от вътрешните кеш обекти, което ще остави системата да работи малко по-бавно.

sp_configure ‘макс. памет на сървъра (MB)’,<Памет в MB>

В този случай числото „2147483647“ означава, че SQL Server няма горна граница и ще използва цялата памет на сървъра.

Минимална сървърна памет:минимална сървърна памет като долна стойност; SQL Server ще ангажира памет за собствена употреба, докато достигне настройката за минимална памет на сървъра. След това той ще поддържа поне това количество използваема памет.

Максимална сървърна памет:По същия начин, по който минималната сървърна памет осигурява под, максималната сървърна памет осигурява таван.

Минималните и максималните нива на паметта са долната и горната граница на количеството памет, разрешено за използване от буферния пул. Буферният пул е най-голямата част от паметта, консумирана от SQL Server. По-долу са компонентите на SQL Server в рамките на SQL екземпляр, които използват памет от буферния пул

  • Кеш на страницата на базата данни
  • Вътрешни регистрационни кешове
  • Кеш на процедурите или кеш на плана на заявки
  • Заявка за работно натоварване
  • Заключване (предоставяне на памет)
  • Контекст на връзката
  • Оптимизиране на заявки
  • структури от данни на системно ниво

Стойностите на важните показатели като налични мегабайти, страници/сек, коефициент на попадане в буферния кеш, PLE и др. определят производителността на SQL Server.

Съотношението на попадане в буферния кеш е специфично за всяко приложение. 90% обикновено се счита за желателно. Това означава, че над 90% от заявките са били обслужвани от кеша, което е добре. Ако стойността е по-ниска, добавете още памет, докато постоянно стане по-висока от 90%.

Наличните байтове не са нищо друго освен индикация за това колко памет е налична за използване. Броячът страници/сек показва колко страници са били извлечени от диска или записани на диска, и двете поради грешки в твърдите страници.

PLE означава продължителност на живота на страницата, което е индикация за това колко секунди страницата ще остане в пула.

Например,

$server = 'hqdbt01'

$counters = @("\Memory\Available MBytes",
 "\Memory\Pages/sec",
 "\SQLServer:Buffer Manager\Buffer cache hit ratio",
 "\SQLServer:Buffer Manager\Lazy writes/sec",
 "\SQLServer:Buffer Manager\Page life expectancy" 

 ) 
 $collections = Get-Counter -ComputerName $server -Counter $counters -SampleInterval 10 -MaxSamples 1
 Write-Output $collections 
 foreach ($collection in $collections) 
 {$sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue 
  $sampling | Format-Table -AutoSize
   }

Препоръки и най-добри практики

Нека сега накратко разгледаме техниките за оразмеряване на паметта.

  1. 1 GB памет, запазена за операционна система
  2. 1 GB всеки за всеки 4 GB RAM след първоначалните 4 GB, до 16 GB RAM
  3. 1 GB всеки за всеки 8 GB в повече от 16 GB RAM

Например, ако имате 32 GB RAM сървър за база данни, тогава паметта, която ще бъде предоставена на операционната система, ще бъде

  1. 1 GB, минималното разпределение
  2. + 3 GB, тъй като 16 GB – 4 GB =12 GB; 12 GB, разделени на 4 GB (всеки 4 GB получават 1 GB), са 3 GB.
  3. + 2 GB, като 32 GB – 16 GB =16 GB; 16 разделено на 8 (всеки 8 GB след 16 GB получава 1 GB) е 2 GB

Така общо за сървър с 32 GB RAM, 7 GB ще бъдат запазени за операционната система. Това е максималната памет, разпределена на SQL Server, трябва да бъде 25 GB. По същия начин, за 64 GB сървър, 10 GB трябва да бъдат запазени за операционната система и 54 GB трябва да бъдат разпределени за SQL Server.

Всички в даден момент сме чували или използвали Windows Management Instrumentation (WMI). Има няколко класа в WMI, които ни позволяват да извличаме информация за хардуера, инсталирания софтуер, операционната система или дори регистъра. Можем дори да променяме настройките и да извършваме действия върху тези аспекти.

Класът win32_OperatingSystem е WMI клас, който има цялата необходима информация за активния операционна система (в случай, че сте, да речем, двойно зареждане). Този клас може да се използва и за получаване на количеството памет, разпределено на операционната система. Ето някои от обектите, които класът може да върне, които биха могли да ни бъдат полезни (паметта се измерва в килобайти от този клас):

  • TotalVisibleMemorySize :Това поле показва общата физическа памет, която е достъпна за операционната система. Недостъпните парчета памет може да доведат до показване тук на по-малък от инсталирания номер.
  • FreePhysicalMemory :Това ни казва какво количество физическа памет е свободна.
  • TotalVirtualMemorySize :Това е общата виртуална памет, налична за използване от ОС. Това включва физическата памет, инсталирана на компютъра, заедно с размера на файла на страницата.
  • Безплатна виртуална памет :Подобно на FreePhysicalMemory, но включва и свободното място в паметта за пейджинг.
$server='hqdbt01'
Get-WmiObject -Class Win32_OperatingSystem  -ComputerName $server | select  CSName,
@{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}},
@{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}},
@{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}},
@{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}},
@{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}},
NumberofProcesses,
NumberOfUsers 

Можем да извлечем информацията за файла на страницата с помощта на WMI класа Win32_PageFileSetting.

$server='hqdbt01'
Get-WMIObject Win32_PageFileSetting -Computer $server|  select @{name="ServerName";expression={$_.__Server}}, Name, InitialSize, MaximumSize 

Следната заявка дава подробности за използване на паметта от високо ниво на SQL екземпляр.

SELECT 
	physical_memory_in_use_kb/1024 Physical_memory_in_use_MB, 
    large_page_allocations_kb/1024 Large_page_allocations_MB, 
    locked_page_allocations_kb/1024 Locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 VAS_reserved_MB, 
    virtual_address_space_committed_kb/1024 VAS_committed_MB, 
    virtual_address_space_available_kb/1024 VAS_available_MB,
    page_fault_count Page_fault_count,
    memory_utilization_percentage Memory_utilization_percentage, 
    process_physical_memory_low Process_physical_memory_low, 
    process_virtual_memory_low Process_virtual_memory_low
FROM sys.dm_os_process_memory;

Подгответе скрипта

Нека интегрираме гореспоменатите три изхода в един изход на паметта:

  1. Структури на вътрешната памет на SQL с помощта на Counter
  2. Налична виртуална и физическа памет с помощта на WMI обект
  3. Настройка на файл на страницата с помощта на WMI

Подготовката на HTML съдържанието е свързана с попълване на стойността, подадена от различния раздел на скрипта, между правилните тагове.

Скриптът може да създава валидни HTML тагове. Следват функциите, използвани в скрипта.

  1. writeHTMLHeader:тази функция се използва за генериране на заглавката и дефиниране на стила за HTML файла.
  2. writetableFooter:това дефинира затварящите HTML тагове.
  3. writeTableHeader:това дефинира изходното заглавие с тринадесет колони за HTML файла
  4. writeMemoryInfo:това е функцията, която извършва сливането на двата изхода на клас WMI. Резултатът от Win32_PageFileSetting, Win32_OperatingSystem и SMO ​​SQL се предава като аргументи за тази функция. Стойностите могат да бъдат допълнително трансформирани или манипулирани в този раздел.
  5. Раздел за имейли

[expand title=”Код”]

# First, let’s create a text file, where we will later save memory details


$MailServer='mail01.example.com'

$MemoryFileName = "f:\PowerSQL\Memory.htm"
New-Item -ItemType file $MemoryFileName -Force
# Function to write the HTML Header to the file
Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('yyyy/MM/dd')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<title>SQLShack Memory Usage Report </title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 11px;"
add-content $fileName  "border-top: 1px solid #999999;"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-left: 1px solid #999999;"
add-content $fileName  "padding-top: 0px;"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-left: 0px;"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-left: 5px;"
add-content $fileName  "margin-top: 5px;"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"

add-content $fileName  "<table width='100%'>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='13' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='4'><strong>SQLShack Memory Usage Report - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
add-content $fileName  "</table>"

}

# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)

Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td width='10%' align='center'>ServerName</td>"
Add-Content $fileName "<td width='10%' align='center'>TotalVirtualMemorySize</td>"
Add-Content $fileName "<td width='10%' align='center'>TotalVisibleMemorySize</td>"
Add-Content $fileName "<td width='10%' align='center'>FreePhysicalMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>FreeVirtualMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>FreeSpaceInPagingFiles</td>"
Add-Content $fileName "<td width='10%' align='center'>NumberofProcesses</td>"
Add-Content $fileName "<td width='10%' align='center'>NumberOfUsers</td>"
Add-Content $fileName "<td width='10%' align='center'>PageFile</td>"
Add-Content $fileName "<td width='10%' align='center'>Page-InitialSize</td>"
Add-Content $fileName "<td width='10%' align='center'>Page-MaxSize</td>"
Add-Content $fileName "<td width='10%' align='center'>SQLMaxMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>SQLMinMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>Memory Available MBytes</td>"
Add-Content $fileName "<td width='10%' align='center'>Buffer Cache Hit Ratio</td>"
Add-Content $fileName "<td width='10%' align='center'>PLE</td>"
Add-Content $fileName "</tr>"
}

Function writeHtmlFooter
{
param($fileName)

Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}

Function writeMemoryInfo
{
param($filename,$csname,$TotalVirtualMemorySize,$TotalVisibleMemorySize,$FreePhysicalMemory,$FreeVirtualMemory,$FreeSpaceInPagingFiles,$NumberofProcesses,$NumberOfUsers,$PageFile,$initialSize,$MaxSize,$SQLMaxMemory, $SQLMinMemory ,$mAvailableMBytes, $Buffercachehitratio, $PLE )
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$csname </td>"
 Add-Content $fileName "<td>$TotalVirtualMemorySize </td>"
 Add-Content $fileName "<td>$TotalVisibleMemorySize</td>"
 Add-Content $fileName "<td>$FreePhysicalMemory </td>"
 Add-Content $fileName "<td>$FreeVirtualMemory </td>"
 Add-Content $fileName "<td>$FreeSpaceInPagingFiles </td>"
 Add-Content $fileName "<td>$NumberofProcesses </td>"
 Add-Content $fileName "<td>$NumberOfUsers</td>"
 Add-Content $fileName "<td>$PageFile</td>"
 Add-Content $fileName "<td>$initialSize</td>"
 Add-Content $fileName "<td>$MaxSize</td>"
 Add-Content $fileName "<td>$SQLMaxMemory</td>"
 Add-Content $fileName "<td>$SQLMinMemory</td>"
 Add-Content $fileName "<td>$mAvailableMBytes</td>"
 Add-Content $fileName "<td>$Buffercachehitratio</td>"
 Add-Content $fileName "<td>$PLE</td>"
 
 Add-Content $fileName "</tr>"
}

Function sendEmail  

 { 
param($from,$to,$subject,$smtphost,$htmlFileName)  

$body = Get-Content $htmlFileName 
$body = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body 
$body.isBodyhtml = $true
$smtpServer = $MailServer
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($body)

    

 }  


writeHtmlHeader $MemoryFileName
 Add-Content $MemoryFileName "<table width='100%'><tbody>"
 Add-Content $MemoryFileName "<tr bgcolor='#CCCCCC'>"
 Add-Content $MemoryFileName "<td width='100%' align='center' colSpan=16><font face='tahoma' color='#003399' size='2'><strong> Memory Usage Details</strong></font></td>"
 Add-Content $MemoryFileName "</tr>"

 writeTableHeader $MemoryFileName

foreach ($svr in get-content "\\hqdbsp18\f$\PowerSQL\Server.txt"){

$page=Get-WMIObject Win32_PageFileSetting -Computer $svr|  select __Server, Name, InitialSize, MaximumSize
$dp = Get-WmiObject -Class Win32_OperatingSystem  -ComputerName $svr | select  CSName,
@{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}},
@{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}},
@{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}},
@{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}},
@{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}},
NumberofProcesses,
NumberOfUsers

$srv = new-object ('Microsoft.SqlServer.Management.Smo.Server') ($svr)
write-host $srv.Configuration.MaxServerMemory.RunValue 
write-host $srv.Configuration.MinServerMemory.RunValue 


$counters = @("\Memory\Available MBytes",
 "\Memory\Pages/sec",
 "\SQLServer:Buffer Manager\Buffer cache hit ratio",
 "\SQLServer:Buffer Manager\Lazy writes/sec",
 "\SQLServer:Buffer Manager\Page life expectancy"
  ) 
 $collections = Get-Counter -ComputerName $svr -Counter $counters -SampleInterval 5 -MaxSamples 1
 Write-Output $collections 
 foreach ($collection in $collections) 
    {
     $sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue 
     foreach($sam in $sampling)
        {
            if ($sam.Path -like "*\Memory\Available MBytes*") {
                $mAvailableMBytes=$sam.CookedValue
                }
            elseif ($sam.Path -like "*Buffer Manager\Buffer cache hit ratio*") {
                $Buffercachehitratio=$sam.CookedValue
            }
            elseif ($sam.Path -like "*Page life expectancy*") {
                $PLE=$sam.CookedValue}
        }
    }
write-host $mAvailableMBytes $Buffercachehitratio $PLE


Write-Host  $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers  $page.InitialSize $page.Name $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue  $mAvailableMBytes $Buffercachehitratio $PLE
writeMemoryInfo $MemoryFileName $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers  $page.Name $page.InitialSize $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue $mAvailableMBytes $Buffercachehitratio $PLE

 }


  Add-Content $MemoryFileName "</table>" 

writeHtmlFooter $MemoryFileName 
$date = ( get-date ).ToString('yyyy/MM/dd')
sendEmail [email protected] [email protected] "Memory Usage Report - $Date" $MailServer $MemoryFileName
 

[/expand]

Изход

Приключване

След като научихте някои нови неща за управлението на паметта на SQL Server, ще разберете по-добре ресурсите на SQL Server.

Ако има достатъчно RAM на сървъра, страниците с данни могат да имат по-дълъг живот в буферния пул, което следователно води до драстично намаляване на I/O нуждите.

Докато в повечето случаи администраторите на база данни разчитат на настройките на паметта по подразбиране, трябва да разберем, че вътрешните изисквания на паметта зависят от работното натоварване на потребителския модел.

Тази статия е подробно описание на паметта на SQL Server и нейните вътрешни елементи. Освен това, той обхваща различните причини зад тесните места в производителността, причинени от ненастройването на максималната памет.

Включих инструкции стъпка по стъпка за настройка и конфигуриране на отчет за паметта. Включени са и стъпките за това как да настроите SQL паметта. Освен това обсъдихме различни SQL компоненти, които допринасят за използването на наличната памет в средата на SQL Server.

Един момент, който трябва да запомните, е, че разпределението и освобождаването на памет забавя стартирането. Следователно, ако няколко приложения спират и стартират на един и същ сървър, това може да повлияе на производителността. По същия начин, ако има няколко други приложения, работещи на същия сървър, задаването на минимална сървърна памет и максимална памет на сървъра става по-важно, за да се гарантира оптимална производителност.

Това е всичко за сега...

Препратки

  1. Наблюдение на използването на паметта
  2. Значение на настройката на максимална памет на сървъра в SQL Server и как да го настроите
  3. Опции за конфигуриране на сървъра на паметта на сървъра

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въведение в защитата на ниво ред в SQL Server

  2. Вътрешни елементи на SQL Server:Проблемни оператори Pt. III – Сортове

  3. Как да вмъкнете низ в друг низ в SQL Server с помощта на STUFF()

  4. Сортиране на куршуми в базата данни

  5. Ефективност на условно агрегиране