Estou vendo o seguinte comportamento de E/S do tempdb durante um período de uma hora:
Há uma boa quantidade de E/S de disco gerada por várias cargas de trabalho de DW em execução na máquina, algumas das quais não cabem nos aproximadamente 280 GB de memória alocada para SQL. Um aspecto interessante é que grande parte da E/S está concentrada nas unidades de disco giratórias (E) em vez das unidades de estado sólido (F e G) que lidam com a E/S com muito mais eficiência.
Pré-alocamos 300 GB completos cada (600 GB no total) nas unidades F e G para tempdb (usando 12 arquivos) e pré-alocamos 1,3 TB para tempdb na unidade E (atualmente 1 arquivo). Os dados de E/S acima sugerem que o uso de tempdb é distribuído entre arquivos com base no tamanho atual do arquivo. Não consegui encontrar documentação sobre isso, mas também executei uma consulta como a seguinte para investigar mais a fundo:
-- While running this query, writes to tempdb are distributed to E/F/G drives
-- in proportion to their current size. This was shown by both
-- sys.dm_io_virtual_file_stats and the space used on the tempdb files before and after
SELECT TOP 100000000 *
INTO #temp
FROM [A_Really_Big_Table]
O comportamento ideal seria que F e G fossem usados exclusivamente, a menos que ambos estivessem cheios, caso em que a unidade de disco giratória deve fornecer espaço tempdb adicional para que cargas de trabalho ocasionais muito grandes possam ser atendidas sem esgotar o espaço tempdb.
Estamos no caminho certo ao observar que o uso do tempdb é distribuído entre os arquivos com base no tamanho atual dos arquivos? Foi um pouco surpreendente ver esse tipo de distribuição em vez de ver um uso igual de cada arquivo (o que provavelmente foi a suposição de quem configurou esse hardware e decidiu alocar apenas um para tempdb no disco giratório).
Com base no comentário de Paul White em resposta a esta pergunta , estamos pensando na seguinte abordagem:
- Reduza os arquivos tempdb no disco giratório. Com base em nosso teste inicial, isso deve mudar a distribuição atual do trabalho mais para as unidades de estado sólido
- Configure os arquivos tempdb de estado sólido para pré-alocar seu espaço (como já fazemos agora)
- Configure os arquivos tempdb do disco giratório para iniciar sem alocação. Certifique-se de que a inicialização instantânea do arquivo esteja ativada. O Tempdb aumentará no disco giratório apenas conforme necessário (o que provavelmente ocorrerá no máximo uma vez por semana).
- Crie um plano de manutenção que reduza os arquivos tempdb no disco giratório após períodos de pico de carga, colocando a distribuição de volta em favor dos arquivos tempdb de estado sólido.
Isso parece razoável? Existem abordagens alternativas ou problemas potenciais a serem considerados? Obviamente, testaremos a abordagem na medida do possível, mas não poderemos fazê-lo em hardware de teste completamente equivalente.
As gravações de arquivo são distribuídas entre os arquivos no mesmo grupo de arquivos proporcionalmente com base no tamanho atual de cada arquivo no grupo de arquivos. Isso é conhecido como "algoritmo de preenchimento proporcional" - consulte http://sqlserver-performance-tuning.net/?p=2552 para obter alguns detalhes interessantes sobre isso.
tempdb
pode ter apenas um único grupo de arquivos. Se você tentar criar um grupo de arquivos,tempdb
obterá o seguinte:Se você tiver o sinalizador de rastreamento 1117 ativado, os arquivos em um grupo crescerão automaticamente simultaneamente entre os arquivos no grupo de arquivos para cada arquivo que não esteja atualmente em seu tamanho máximo e onde houver espaço no disco.
Sua instância tem o sinalizador de rastreamento 1117 ativado? Você provavelmente desejaria desativá-lo neste caso específico, embora as "práticas recomendadas" geralmente indiquem ter isso ativado. Há um item no Microsoft Connect solicitando uma configuração como esta que pode ser habilitada/desabilitada por banco de dados, aqui: https://connect.microsoft.com/SQLServer/feedback/details/781198/trace-flag -1117-autogrowth-of-data-files-is-instance-wide-would-like-a-flag-for-just-tempdb
Supondo que os SSDs sejam dedicados ao tempdb, concordo com sua afirmação e sugiro tornar o tempdb nos SSDs o maior possível (não 100% da unidade, talvez deixe 10% livre). Torne os arquivos tempdb no disco tão pequenos quanto possível, digamos 1 MB, com crescimento automático e tamanho máximo de arquivo tão grande quanto você precisar. Monitore o crescimento do arquivo tempdb nos HDDs e defenda a obtenção de SSDs maiores se você acha que a empresa se beneficiaria com isso.
De acordo com a documentação, os arquivos do SQL Server podem ser criados em partições brutas (partições que não foram formatadas) usando apenas a letra da unidade da partição na
ALTER DATABASE ... ADD FILE
sintaxe. Isso aparentemente elimina a necessidade de aumentar ou diminuir o arquivo, pois ele usa inerentemente toda a partição bruta, conforme necessário. Não tenho certeza se isso ajudaria sua situação ou não; apenas pensei em jogá-lo lá fora como um factóide interessante. Consulte "Se o arquivo estiver em uma partição bruta, os_file_name deve especificar apenas a letra da unidade de uma partição bruta existente. Apenas um arquivo pode ser colocado em cada partição bruta."