Onlangs blogde Erin Stellato (@erinstellato) over de prestatie-impact die Instant File Initialization (IFI) kan hebben bij het maken of herstellen van databases. Ze legt uit dat de installatie van SQL Server 2016 u nu de mogelijkheid biedt om tijdens de installatie de juiste rechten aan de SQL Server-service te verlenen (we hebben hier ook over gesproken in de sectie CTP 3.0 van Latest Builds of SQL Server 2016):
U kunt nu directe bestandsinitialisatie inschakelen tijdens de installatie van SQL Server
De sleutel is een nieuwe optie (die je ook kunt specificeren in een configuratiebestand):
SQLSVCINSTANTFILEINIT="True|False"Het is fijn dat je de hoeveelheid tijd die nodig is om later databases te maken of te herstellen echt kunt verminderen, zonder dat je eraan hoeft te denken om gpedit in te gaan, de rechten correct toe te wijzen en de service opnieuw te starten. Maar een veel groter voordeel voor mij is de mogelijkheid om grotere tempdb-bestanden te configureren tijdens de installatie, waarbij ik vroeg gebruik maak van IFI.
Nu zijn er enkele limieten tijdens het instellen; het aantal tempdb-bestanden is bijvoorbeeld beperkt tot 8 (of het aantal kernen, wat het minste is), en de grootte van elk bestand kan maximaal 1024 MB bedragen. Deze limieten worden afgedwongen in de gebruikersinterface, en ik dacht dat ik ze misschien zou kunnen omzeilen door grotere afmetingen op te geven in een configuratiebestand voor een installatie zonder toezicht, maar dat werkte ook niet. (In de logs stond:"De waarde 8192 voor de TempDB-bestandsgrootte is groter dan 1024 MB en kan van invloed zijn op de installatietijd. Je kunt het kleiner instellen en na de installatie wijzigen.") Persoonlijk denk ik dat in deze tijd en leeftijd, met de snelheid en grootte van de opslag die we kunnen verkrijgen, is een limiet van 1 GB op de gegevensbestandsgrootte kunstmatig laag. Dus heb ik een Connect-suggestie ingediend:
- Connect #2457759:tempdb-gegevensbestanden mogen niet worden beperkt tot 1024 MB
En toen werd erop gewezen dat Brent Ozar (@BrentO) eerder in de CTP-cyclus een soortgelijk item had ingediend, toen de limiet feitelijk werd afgedwongen als 256 MB in plaats van 1 GB:
- Connect #1841076:TempDB setup initiële grootte te laag
Ik heb geen monstermachines die 64 x 1 GB-bestanden kunnen ondersteunen, en dat zou ook geen realistische test zijn, dus besloot ik de impact van IFI te testen op 8 tempdb-gegevensbestanden van elk 1 GB. Ik ben een beetje ouderwets, dus ik heb vier verschillende .ini-bestanden gebouwd en ik heb de regels gemarkeerd die ik voor elke test zou veranderen (ik wilde een minimale installatie uitvoeren met de gegevensbestanden van 4 x 8 MB, met behulp van IFI en niet, en vergelijk het dan met 8 x 1.024 MB bestanden). Aangezien ik deze lussen meerdere keren zou uitvoeren, was het belangrijk om verschillende instantienamen te gebruiken, afhankelijk van of IFI was ingeschakeld of niet, want zodra u het recht op een serviceaccount verleent, wordt dit niet weggenomen door simpelweg de instantie te verwijderen (en ik had die accounts onafhankelijk kunnen instellen, maar ik wilde deze tests gemakkelijk reproduceerbaar maken).
;SQL Server 2016 RC0-configuratiebestand[OPTIES]
ACTION="Installeren"
ENU="True"
QUIET="True"
QUIETSIMPLE="False"
UpdateEnabled="False"
ERRORREPORTING="False"
USEMICROSOFTUPDATE="False"
FEATURES=SQLENGINE
HELP="False"
INDICATEPROGRESS=" False"
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"
INSTANCENAME="ABTESTIFI_ON"
INSTANCEID="ABTESTIFI_ON"
SQLTELSVCSTARTUPTYPE="Uitgeschakeld"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
AGTSVCACCOUNT="NT Authority\System"
AGTSVCSTARTUPTYPE ="Manual"
SQLSVCSTARTUPTYPE="Manual"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="NT Service\MSSQL$ABTESTIFI_ON"
;True for IFI =ON, False voor OFF :
SQLSVCINSTANTFILEINIT="False"
SQLSYSADMINACCOUNTS="NT Authority\System"
SQLTEMPDBFILECOUNT="8"
;1024 voor 8 GB in totaal, 8 voor 64 MB in totaal:
SQLTEMPD BFILESIZE="1024"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
BROWSERSVCSTARTUPTYPE="Handmatig"
En hier is het batchbestand dat ik heb gebruikt (geplaatst in dezelfde map als de configuratiebestanden), die de instantie drie keer installeerde en vervolgens de-installeerde met elke combinatie, en de instellingstijden vastlegde in een tekstbestand - het verwijderen en opschonen negeren.
echo Begin test...@echo off 2>nul
setlocal enabledelayedexpansion
set outputfile=time.txt
echo.> %outputfile%
rem Verwijder Acht en/of Zestien als je maar 4 cores hebt!
VOOR %%e IN (Basislijn Vier Acht Zestien) DOEN (
VOOR %%x IN (IFI_ON IFI_OFF) DO (
FOR /L %%A IN (1,1,3) DO (
echo INSERT #x VALUES('%%e', '%%x', '!TIME! ',>> %outputfile%
D:\setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ConfigurationFile=%%e_%%x.ini
echo '!TIME!' ^)>> %outputfile%
D:\setup.exe /Q /ACTION=UNINSTALL /INSTANCENAME=ABTEST%%x /FEATURES=SQL
rem del /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST %%x\*.*"
rem rd /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST%%x\"
)
)
)
@echo aan
echo …test voltooid.
Een paar opmerkingen:
- Mogelijk moet u de twee regels van
D:\setup.exe
. wijzigen naar het pad naar de installatiemap. - Mogelijk moet u uw systeem opnieuw opstarten voordat u dit uitvoert.
- U wilt het batchbestand uitvoeren vanaf een opdrachtprompt met verhoogde bevoegdheid, zodat UAC u niet bij elke iteratie onderbreekt.
Ik heb tests uitgevoerd op drie verschillende systemen:
- Een Windows 10-VM met 4 cores en SSD-opslag
Basistest van 4 x 8 MB en vervolgens 4 x 1024 MB - Een Windows 10-VM met 8 cores en PCIe-opslag
Basistest van 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB - Een Windows 2012 R2 VM met 16 cores en een dual-channel RAID 10-array van 8 10K SAS-schijven
Basistest van 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB en 16 x 1.024 MB
De uitvoerbestanden genereerden een aantal invoeginstructies die ik hier kon plakken:
CREATE TABLE #x ( [server] varchar(32), [test] varchar(32), [start] time(2), [end] time(2) ); -- inserts pasted here SELECT [server],[test],AVG(DATEDIFF(SECOND,[start],[end])*1.0) FROM #x GROUP BY [server],[test];
Dit waren de timings van elk tien tests, gemiddeld en afgerond (klik om te vergroten):
Voorspelbaar wordt IFI belangrijk met grotere bestanden op langzamere schijven
De installatie duurt over de hele linie iets meer dan een minuut (hoe fijn is het om de installatie uit te voeren zonder Management Tools). De enige afwijking was eigenlijk toen de bestandsgroottes groter begonnen te worden op de mechanische schijven en met onmiddellijke bestandsinitialisatie uitgeschakeld. Ik kan niet doen alsof ik hierdoor geschokt ben.
Conclusie
Als u een SSD of PCIe gebruikt, kan onmiddellijke bestandsinitialisatie de zaken niet erger maken, maar er is geen duidelijk voordeel tijdens de installatie, zolang de archaïsche bestandsgroottebeperkingen voor tempdb-gegevensbestanden intact blijven. Met de huidige regels lijkt het niet mogelijk om deze impact verder te testen dan (1 GB x het aantal beschikbare cores). Als je echter op langzame mechanische schijven werkt, is er een merkbaar verschil, zelfs als je alleen 8 GB of 16 GB aan gegevens initialiseert - dat het op nul zetten vrij duur is als de schijfkoppen moeten bewegen. Dat gezegd hebbende, of de installatie 75 seconden of 2 minuten duurt, is vrij onbelangrijk in het grote geheel van dingen (tenzij je honderden servers installeert, maar dat om de een of andere reden niet automatiseert), dus ik denk dat het grotere voordeel hier gemak is - niet moet onthouden om de serviceaccount de benodigde volumerechten te verlenen enige tijd nadat de installatie is geslaagd. Als je erover nadenkt, kan deze nieuwe configuratie-optie veel beter renderen bij geautomatiseerde installaties van grote aantallen servers, buiten de tijd die tijdens de eigenlijke installatie wordt bespaard.
- Download de configuratiebestanden en het batchbestand
(Mijn volgende test zal kijken naar de tijd die nodig is om de bestaande tempdb-bestanden uit te breiden tot een veel grotere grootte dan 1024 MB na installatie .)