Recentemente, Erin Stellato (@erinstellato) escreveu em um blog sobre o impacto no desempenho que a Inicialização Instantânea de Arquivos (IFI) pode ter ao criar ou restaurar bancos de dados. Ela explica que a configuração do SQL Server 2016 agora oferece a capacidade de conceder os direitos apropriados ao serviço SQL Server durante a instalação (também falamos sobre isso na seção CTP 3.0 de Últimas compilações do SQL Server 2016):
Agora você pode habilitar a inicialização instantânea de arquivos durante a configuração do SQL Server
A chave é uma nova opção (que você também pode especificar em um arquivo de configuração):
SQLSVCINSTANTFILEINIT="Verdadeiro|Falso"
É bom que você possa realmente reduzir a quantidade de tempo que leva para criar ou restaurar bancos de dados posteriormente, sem precisar se lembrar de entrar no gpedit, atribuir os direitos corretamente e reiniciar o serviço. Mas um benefício muito maior para mim é a capacidade de configurar arquivos tempdb maiores durante a instalação, aproveitando antecipadamente o IFI.
Agora, existem alguns limites durante a configuração; por exemplo, o número de arquivos tempdb é limitado a 8 (ou o número de núcleos, o que for menor) e o tamanho de cada arquivo só pode atingir um máximo de 1.024 MB. Esses limites são impostos na interface do usuário, e pensei que poderia contorná-los especificando tamanhos maiores em um arquivo de configuração para uma instalação autônoma, mas isso também não funcionou. (Os logs diziam:"O valor 8192 para o tamanho do arquivo TempDB excede 1024 MB e pode afetar o tempo de instalação. Você pode configurá-lo para um tamanho menor e alterá-lo após a instalação.") Pessoalmente, acho que hoje e idade, com a velocidade e o tamanho do armazenamento que podemos obter, um limite de 1 GB no tamanho do arquivo de dados é artificialmente baixo. Então, registrei uma sugestão do Connect:
- Conexão nº 2457759:os arquivos de dados tempdb não devem ser limitados a 1024 MB
E então foi apontado que Brent Ozar (@BrentO) apresentou um item semelhante no início do ciclo CTP, quando o limite foi realmente aplicado como 256 MB em vez de 1 GB:
- Conexão nº 1841076:tamanho inicial de configuração do TempDB muito baixo
Eu não tenho nenhuma máquina monstro que possa suportar arquivos de 64 x 1 GB, e isso também não seria um teste realista, então resolvi testar o impacto do IFI em 8 arquivos de dados tempdb de 1 GB cada. Eu sou meio antigo, então criei quatro arquivos .ini diferentes e destaquei as linhas que mudaria para cada teste (eu queria fazer uma instalação básica com os arquivos de dados de 4 x 8 MB, usando IFI e não e, em seguida, compare-o com arquivos de 8 x 1.024 MB). Como eu estaria executando esses loops várias vezes, era importante usar nomes de instância diferentes, dependendo se o IFI estava ativado ou não, porque uma vez que você concede o direito a uma conta de serviço, ele não é removido simplesmente removendo a instância (e eu poderia ter configurado essas contas de forma independente, mas queria tornar esses testes fáceis de reproduzir).
;Arquivo de configuração do SQL Server 2016 RC0
[OPÇÕES]
ACTION="Install"
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="Desativado"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
AGTSVCACCOUNT="NT Authority\System"
AGTSVCSTARTUPTYPE ="Manual"
SQLSVCSTARTUPTYPE="Manual"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVACCOUNT="NT Service\MSSQL$ABTESTIFI_ON"
;True para IFI =ON, False para OFF :
SQLSVCINSTANTFILEINIT="False"
SQLSYSADMINACCOUNTS="NT Authority\System"
SQLTEMPDBFILECOUNT="8"
;1024 para 8 GB no total, 8 para 64 MB no total:
/>SQLTEMPD BFILESIZE="1024"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
BROWSERSVCSTARTUPTYPE="Manual"
E aqui está o arquivo de lote que usei (colocado na mesma pasta dos arquivos de configuração), que instalou e desinstalou a instância usando cada combinação três vezes e registrou os tempos de configuração em um arquivo de texto - ignorando a desinstalação e a limpeza.
echo Iniciando teste…
@echo off 2>nul
setlocal enabledelayedexpansion
set outputfile=time.txt
echo.> %outputfile%
rem Remova Eight e/ou Sixteen se você tiver apenas 4 núcleos!
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=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 em
echo …teste completo.
Algumas notas:
- Talvez seja necessário alterar as duas linhas de
D:\setup.exe
para o caminho para o diretório de configuração. - Talvez seja necessário reiniciar o sistema antes de executar isso.
- Você vai querer executar o arquivo em lote a partir de um prompt de comando elevado para que o UAC não o interrompa em cada iteração.
Fiz testes em três sistemas diferentes:
- Uma VM do Windows 10 com 4 núcleos e armazenamento SSD
Teste de linha de base de 4 x 8 MB e depois 4 x 1.024 MB - Uma VM do Windows 10 com 8 núcleos e armazenamento PCIe
Teste de linha de base de 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB - Uma VM Windows 2012 R2 com 16 núcleos e uma matriz RAID 10 de canal duplo com 8 unidades SAS de 10.000
Teste de linha de base de 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB e 16 x 1.024 MB
Os arquivos de saída geraram várias instruções de inserção que eu poderia colar aqui:
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];
Aqui estão os tempos em dez testes cada, em média e arredondados (clique para ampliar):
Previsivelmente, o IFI se torna importante com arquivos maiores em unidades mais lentas
A instalação demora um pouco mais de um minuto (como é bom executar a instalação sem as Ferramentas de Gerenciamento). O único desvio, na verdade, foi quando os tamanhos dos arquivos começaram a ficar maiores nas unidades mecânicas e com a inicialização instantânea de arquivos desabilitada. Não posso fingir estar chocado com isso.
Conclusão
Se você estiver em SSD ou PCIe, a inicialização instantânea de arquivos não pode piorar as coisas, mas não há benefício claro durante a configuração, desde que as limitações de tamanho de arquivo arcaicas para arquivos de dados tempdb permaneçam intactas. Com as regras atuais não parece possível testar esse impacto além (1 GB x o número de núcleos disponíveis). No entanto, se você estiver em unidades mecânicas lentas, há uma diferença notável, mesmo ao inicializar apenas 8 GB ou 16 GB de dados – zerar é bastante caro quando as cabeças do disco precisam se mover. Dito isto, se a configuração leva 75 segundos ou 2 minutos é bastante irrelevante no grande esquema das coisas (a menos que você esteja instalando centenas de servidores, mas não automatizando isso por algum motivo), então acho que a maior vantagem aqui é a conveniência - não ter que se lembrar de conceder à conta de serviço os direitos de volume necessários algum tempo após a instalação ter sido bem-sucedida. Se você pensar bem, essa nova opção de configuração pode realmente render muito melhor em instalações automatizadas de um grande número de servidores, fora de qualquer tempo economizado durante a instalação real.
- Faça o download dos arquivos de configuração e do arquivo em lote
(Meu próximo teste analisará o tempo necessário para expandir os arquivos tempdb existentes para um tamanho muito maior que 1.024 MB após a instalação .)