Database
 sql >> Database >  >> RDS >> Database

Inizializzazione file istantanea:impatto durante l'installazione

Di recente, Erin Stellato (@erinstellato) ha scritto un blog sull'impatto sulle prestazioni che l'Inizializzazione file istantanea (IFI) può avere durante la creazione o il ripristino di database. Spiega che l'installazione di SQL Server 2016 ora offre la possibilità di concedere i diritti appropriati al servizio SQL Server durante l'installazione (ne abbiamo parlato anche nella sezione CTP 3.0 delle ultime build di SQL Server 2016):

Ora puoi abilitare l'inizializzazione file istantanea durante l'installazione di SQL Server

La chiave è una nuova opzione (che puoi anche specificare in un file di configurazione):

SQLSVCINSTANTFILEINIT="Vero|Falso"

È bello che tu possa davvero ridurre la quantità di tempo necessaria per creare o ripristinare i database in un secondo momento, senza doverti ricordare di entrare in gpedit, assegnare i diritti correttamente e riavviare il servizio. Ma un vantaggio molto più grande per me è la possibilità di configurare file tempdb più grandi durante l'installazione, sfruttando presto IFI.

Ora, ci sono alcuni limiti durante l'installazione; ad esempio, il numero di file tempdb è limitato a 8 (o il numero di core, a seconda di quale è inferiore) e la dimensione di ciascun file può raggiungere solo un massimo di 1.024 MB. Questi limiti sono applicati nell'interfaccia utente e ho pensato che avrei potuto aggirarli specificando dimensioni maggiori in un file di configurazione per un'installazione automatica, ma neanche questo ha funzionato. (I registri dicevano:"Il valore 8192 per la dimensione del file TempDB supera 1024 MB e potrebbe avere un impatto sul tempo di installazione. È possibile impostarlo su una dimensione inferiore e modificarlo dopo l'installazione.") Personalmente, penso che in questo giorno e età, con la velocità e la dimensione dello spazio di archiviazione che possiamo ottenere, un limite di 1 GB sulla dimensione del file di dati è artificialmente basso. Quindi ho presentato un suggerimento Connect:

  • Connetti #2457759:i file di dati tempdb non devono essere limitati a 1024 MB

E poi è stato fatto notare che Brent Ozar (@BrentO) ha presentato una richiesta simile all'inizio del ciclo CTP, quando il limite è stato effettivamente imposto come 256 MB anziché 1 GB:

  • Connetti #1841076 :dimensione iniziale dell'impostazione TempDB troppo bassa

Non ho macchine mostruose in grado di supportare file da 64 x 1 GB e nemmeno questo sarebbe un test realistico, quindi ho deciso di testare l'impatto di IFI su 8 file di dati tempdb da 1 GB ciascuno. Sono una specie di vecchia scuola, quindi ho creato quattro diversi file .ini e ho evidenziato le righe che avrei cambiato per ogni test (volevo basare un'installazione minima con i file di dati 4 x 8 MB, usando IFI e no, quindi confrontarlo con 8 file da 1.024 MB). Dal momento che avrei eseguito questi loop più volte, era importante utilizzare nomi di istanza diversi a seconda che IFI fosse abilitato o meno, perché una volta concesso il diritto a un account di servizio, non viene rimosso semplicemente rimuovendo l'istanza (e avrei potuto impostare quegli account in modo indipendente, ma volevo rendere questi test facili da riprodurre).

;File di configurazione RC0 di SQL Server 2016
[OPZIONI]
ACTION="Install"
ENU="True"
QUIET="True"
QUIETSIMPLE="False"
UpdateEnabled="False"
ERRORREPORTING="False"
USEMICROSOFTUPDATE="False"
FEATURES=SQLENGINE
HELP="False"
INDICATEPROGRESS=" False"
INSTALLSHAREDDIR="C:\Programmi\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Programmi (x86)\Microsoft SQL Server"
INSTANCENAME="ABTESTIFI_ON"
INSTANCEID="ABTESTIFI_ON"
SQLTELSVCSTARTUPTYPE="Disabled"
INSTANCEDIR="C:\Programmi\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 per IFI =ON, False per OFF :
SQLSVCINSTANTFILEINIT="False"
SQLSYSADMINACCOUNTS="NT Authority\System"
SQLTEMPDBFILECOUNT="8"
;1024 per 8 GB in totale, 8 per 64 MB in totale:
SQLTEMPD BFILESIZE="1024"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
BROWSERSVCSTARTUPTYPE="Manuale"

Ed ecco il file batch che ho usato (posizionato nella stessa cartella dei file di configurazione), che ha installato e quindi disinstallato l'istanza utilizzando ciascuna combinazione tre volte e registrato i tempi di installazione in un file di testo, ignorando la disinstallazione e la pulizia.

echo Test iniziale…
@echo off 2>nul
setlocal enabledelayedexpansion
set outputfile=time.txt
echo.> %outputfile%
rem Rimuovere Eight e/o Sixteen se si hanno solo 4 core!
FOR %%e IN (Baseline Four Eight Sixteen) DO (
FOR %%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=DISINSTALLA /INSTANCENAME=ABTEST%%x /FEATURES=SQL
rem del /Q /S "C:\Programmi\Microsoft SQL Server\MSSQL13.ABTEST %%x\*.*"
rem rd /Q /S "C:\Programmi\Microsoft SQL Server\MSSQL13.ABTEST%%x\"
)
)
)
@echo on
echo …test completato.

Alcune note:

  • Potrebbe essere necessario modificare le due righe da D:\setup.exe al percorso della directory di installazione.
  • Potrebbe essere necessario riavviare il sistema prima di eseguire questa operazione.
  • Ti consigliamo di eseguire il file batch da un prompt dei comandi con privilegi elevati in modo che l'UAC non ti interrompa ad ogni iterazione.

Ho eseguito i test su tre diversi sistemi:

  • Una VM Windows 10 con 4 core e storage SSD
    Test di riferimento di 4 x 8 MB e poi 4 x 1.024 MB
  • Una macchina virtuale Windows 10 con 8 core e storage PCIe
    Test di riferimento di 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB
  • Una macchina virtuale Windows 2012 R2 con 16 core e un array RAID 10 a doppio canale di 8 unità SAS da 10K
    Test di riferimento di 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB e 16 x 1.024 MB

I file di output hanno generato una serie di istruzioni di inserimento che potrei incollare qui:

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];

Ecco i tempi di dieci test ciascuno, mediati e arrotondati (clicca per ingrandire):

Prevedibilmente, IFI diventa importante con file più grandi su unità più lente

L'installazione richiede poco più di un minuto su tutta la linea (quanto è bello eseguire l'installazione senza strumenti di gestione). L'unica deviazione, in realtà, è stata quando le dimensioni dei file hanno iniziato a diventare più grandi sulle unità meccaniche e con l'inizializzazione istantanea dei file disabilitata. Non posso fingere di essere scioccato da questo.

Conclusione

Se utilizzi SSD o PCIe, l'inizializzazione istantanea dei file non può peggiorare le cose, ma non vi è alcun chiaro vantaggio durante l'installazione, purché le limitazioni arcaiche delle dimensioni dei file per i file di dati tempdb rimangano intatte. Con le regole attuali non sembra possibile testare questo impatto oltre (1 GB x il numero di core disponibili). Se si utilizzano unità meccaniche lente, tuttavia, c'è una notevole differenza, anche quando si inizializzano solo 8 GB o 16 GB di dati:l'azzeramento è piuttosto costoso quando le testine del disco devono spostarsi. Detto questo, se l'installazione richiede 75 secondi o 2 minuti è piuttosto irrilevante nel grande schema delle cose (a meno che tu non stia installando centinaia di server, ma non automatizzandolo per qualche motivo), quindi penso che il vantaggio più grande qui sia la comodità, non ricordarsi di andare a concedere all'account di servizio i diritti di volume necessari qualche tempo dopo che l'installazione è andata a buon fine. Se ci pensi, questa nuova opzione di configurazione può effettivamente ripagare molto meglio nelle installazioni automatizzate di un gran numero di server, al di fuori del tempo risparmiato durante l'installazione effettiva.

  • Scarica i file di configurazione e il file batch

(Il mio prossimo test esaminerà il tempo necessario per espandere i file tempdb esistenti a una dimensione molto maggiore di 1.024 MB dopo l'installazione .)