Mostrando postagens com marcador SQLOS. Mostrar todas as postagens
Mostrando postagens com marcador SQLOS. Mostrar todas as postagens

segunda-feira, 10 de dezembro de 2012

Material de SQLOS – SQL Internal Ops

Na última sexta-feira eu e o maníaco do windbg – Ivan Lima (http://ivanglima.com) – palestramos no evento SQL Internal Ops (http://sqlinternalopsconference-web.sharepoint.com)! Encontrar os amigos e conhecer novas pessoas é sempre muito recompensador, ainda mais tendo a chance de falar sobre o SQL Server, mas especificamente do SQLOS, e com diversas demos utilizando o windbg. #SQLGeek total.
Ficamos por volta de 2h falando (se deixassem ficaríamos mais umas 4 horas) e mesmo sendo uma sessão detalhada sobre o SQL Server, eu acho que o pessoal curtiu. Tentei manter mais simples algumas coisas e dar cenários práticos sobre o que estava falando, para o pessoal não dormir. A preparação do material já trouxe novidades que estou incorporando nos nossos treinamentos, com certeza as novas animações e recebendo um “embelezador” melhor, vão brilhar nos nossos cursos.
O evento foi legal, mas sempre pode ser melhor. Como de costume tivemos uma quebra grande e mesmo com um apoio em cima da hora a sensação do início do evento foi de que faltou um pouco de comprometimento de todos os envolvidos. Nosso amigo Logan falou um pouco sobre isso: http://www.merazzi.eti.br/blog/2012/12/09/sql-server-internal-ops-eu-fui/
Mesmo que você não tenha ido, o PDF da nossa apresentação você baixa aqui: https://skydrive.live.com/redir?resid=E145F7753042D628!2155
E para você que mora em BSB e não pode participar da nossa sessão, já estamos com ela programada para o SQLServerDF, mais informações eu vou encaminhar no próximo ano.

Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

quinta-feira, 29 de novembro de 2012

Palestras no SQL Internals Ops

Depois das 24 horas de SQL Server na próxima semana teremos mais um evento, dessa vez presencial, o SQL Internal Ops Conference. Você pode ver os detalhes do evento em: http://sqlinternalopsconference-web.sharepoint.com/Pages/default.aspx
Eu novamente estarei palestrando juntamente com nosso amigo geek Ivan Lima (http://ivanglima.com/) sobre o SQLOS. Dessa vez em duas sessões e para um registro mais completo coloco as descrições que enviamos quando nos registramos no evento.
Conhecendo o SQLOS
Na arquitetura do SQL Server existe um conjunto de elementos que são agrupados como parte do SQLOS, ou SQL Server Operating System. São componentes fundamentais para o funcionamento do SQL Server e integração com o Windows, entre eles: NUMA nodes, schedulers, workers, memory clerks e comunicação com o subsistema de I/O.
Essa sessão tem por objetivo apresentar alguns desses elementos e como eles interagem entre si, fornecendo uma visão teórica e clara do mecanismo de agendamento, uso de memória, operações de I/O, esperas (waits), etc.
Palestrantes: Luciano Moreira e Ivan Lima
Nível: Avançado

Explorando o SQLOS com o windbg
Depois de apresentar os mecanismos básicos do SQLOS, essa sessão tem por objetivo expor de forma prática como é a implementação e uso desses elementos. Para conseguirmos fazer isso vamos trabalhar com diversas demonstrações, analisando DMVs do SQL Server e usando o windbg, utilizando breakpoints e explorando call stacks. Não recomendado para aqueles de coração fraco...
Palestrantes: Ivan Lima e Luciano Moreira
Nível: Avançado++

Teremos muitas figuras conhecidas do SQL Server no Brasil e tenho certeza que teremos excelentes palestras técnicas. Nas sessões dos profissionais da Nimbus, já que é um evento SQL Internal Ops, achamos por bem mostrar muito internals. E sim, vamos ver muitos detalhes, pena que o tempo é limitado, mas mesmo assim será interessante.
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

terça-feira, 7 de julho de 2009

Affinity mask 0x0 ou 0xFFFFFFF?

Bom dia pessoal.

Durante o último treinamento de internals do SQL Server 2008 que ministrei, acabei pensando em um artigo interessante que pode mostrar como a falta de conhecimento do funcionamento do SQL Server pode impactar o seu ambiente. Hoje vamos falar do affinity mask.
Como vocês já sabem, o affinity mask define quais processadores o SQL Server vai utilizar, então se você possui oito processadores lógicos com o affinity mask definido para 85 (01010101 em binário), está indicando para o SQL Server utilizar o primeiro, terceiro, quinto e sétimo processadores. Por padrão o SQL Server configura o affinity mask como zero (“0”), o que indica que ele pode utilizar todos os processadores.
Com base nas afirmações acima, podemos tirar uma conclusão básica para minha máquina, que possui dois processadores (um slot dual-core): affinity mask = 0 é a mesma coisa que affinity mask 3 (11 em binário), pois ambos indicam que todos os processadores serão utilizados, certo?
Bem, infelizmente a afirmação acima não é totalmente verdadeira, o SQL Server vai utilizar os dois núcleos que tenho disponível, mas seu comportamento é diferente. Quer ver?

SQLOS basics

Sabemos que o SQL Server 2005 (e 2008) é NUMA aware (SQL Server 2000 com SP4 também? Hhhuuumm, bem +/-), o que significa que ele identifica os nós NUMA na sua máquina (hard ou soft) e associa um número X de schedulers a cada um dos nós. Sabendo que os schedulers não migram entre nós e os workers (threads ou fibers – aqui indiferente) estão vinculados a somente um scheduler, o SQLOS tenta balancear a carga entre schedulers através do load factor.
Mas e se, por acaso do destino, um scheduler receber alguns workers que estão executando tarefas mais pesadas e demoradas, haverá um desbalanceamento de uso da CPUs dentro do mesmo nó NUMA? A resposta é não, por padrão um scheduler poderá escolher qual CPU vai utilizar para colocar o worker para trabalhar, deixando aberto um grau de dinamismo entre CPU/scheduler, já que o worker está vinculado ao scheduler.
É claro que o SQL Server somente permite que CPUs do mesmo nó sejam utilizadas por um scheduler, evitando que o ganho pela localidade dos dados na memória do nó seja perdido com a alocação de uma CPU em um nó remoto. Quando falamos em paralelismo isso é factível de acontecer (novos workers em nós diferentes), mas aí com o particionamento dos dados pelo paralelismo você pode ganhar (ao invés de perder) usando as características de uma arquitetura NUMA.
O comportamento que citei acima somente pode acontecer quando o affinity mask está definido como zero. Isto é, se você especificar um affinity mask qualquer, mesmo que indique que todos os processadores serão utilizados, o SQLOS vai entender que um scheduler está vinculado a uma CPU, matando esse pequeno grau de dinamismo e somente confiando no load factor do scheduler.

Demonstração

Vamos a um exemplo simples. Minha máquina possui somente um nó (sys.dm_os_nodes) e dois schedulers (sys.dm_os_schedulers) que são utilizados para as requisições que chegam (deixe de lado hidden schedulers e o reservado para o DAC).
Com affinity mask = 0 eu começo a monitorar o contador “% processor time” (ou “% tempo do processador”) para os dois núcleos e vejo que minha máquina está trabalhando com uma média de 20% (cada um), mas quando eu abro uma nova conexão e executo o script abaixo (script 01) vejo que a média de utilização dos dois contadores sobe para uns 70%.

(Script 01)

DECLARE @I BIGINT = 0
DECLARE @S varchar(200)

WHILE @I < 100000000
BEGIN
select @S = @@VERSION
SET @I += 1
END

O que está acontecendo? A requisição (veja em sys.dm_exec_requests) recebeu um worker e está vinculada a um scheduler, mas esse por sua vez utiliza os dois processadores (em quantuns diferentes) para executar a tarefa, resultado em um uso equilibrado dos núcleos. O número resultante para o contador bate bem em cima do esperado, com um aumento de 50% para cada um.
Vamos mudar um pouco o cenário? Altero o affinity mask para três, indicando que o SQL Server também pode usar os dois núcleos disponíveis. Como resultado, temos a figura 01.

exec sp_configure 'affinity mask', 3
reconfigure


Veja que a diferença entre os dois momentos é clara (figura 01), em um primeiro momento a carga de 100% ficou dividida entre os núcleos, enquanto no segundo momento o SQL Server vinculou o scheduler a somente um núcleo, fazendo com que esse fique constantemente em 100% enquanto o outro fica com aproximadamente 20%.



(Figura 01)


Com isso eu demonstro meu ponto, affinity mask = 0 é diferente de affinity mask = 0xffffff (isto é, usando todos os núcleos), pois no segundo caso o SQL Server mantém uma afinidade entre scheduler e CPU.

O que isso significa para sua empresa? Talvez você não sinta um impacto direto dessa configuração, mas podemos supor um cenário potencial onde, mesmo o SQLOS usando o load factor dos schedulers para definir onde uma tarefa será executada, é factível termos tarefas pesadas caindo sobre um mesmo núcleo, demorando mais e usando de forma desigual os recursos de processamento disponíveis.
Se você quer que o SQL Server trabalhe com processadores específicos (affinity mask diferente de zero), mas não deseja que essa afinidade entre CPU/Scheduler seja respeitada, existe luz no fim do túnel, basta habilitar o trace flag 8002. De onde tirei isso? Leia a série inside SQL Server.

Gostou? Viu como um detalhe simples pode causar um eventual impacto, não reproduzível facilmente, no seu ambiente? Então entenda como o SQL Server funciona para não ser surpreendido...

Prefere ler o PDF deste artigo? Pegue no skydrive.







[]s
Luciano Caixeta Moreira - {Luti Nimbus}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br