Nosso SQL está configurado para usar no máximo 704 threads, algumas vezes recebemos alertas informando que restam apenas 10 threads, então não consigo entender se o SQL mantém o thread aberto, pois criar um novo thread é caro.
então minha pergunta é
Como saber se um thread está disponível para uma nova solicitação ou atualmente ocupado com outras solicitações.
Estou tentando vincular
task_address
sys.dm_exec_requests com sys.dm_os_tasks eworker_address
como abaixoselect * from sys.dm_exec_requests ec join sys.dm_os_tasks tsk on tsk.task_state=ec.task_address join sys.dm_os_workers wrk on wrk.worker_address=tsk.worker_address
Não vejo nenhuma saída, isso significa que posso assumir que todos os tópicos estão livres
- Atualmente, abaixo está o estado dos meus threads de trabalho, o que isso significa suspenso?. Pude ver a contagem de mais de 500 com status suspenso.
4. Posso usar a consulta abaixo para descobrir que tenho inanição de thread de trabalho
select status from sys.dm_Exec_requests
se o status estiver pendente, posso assumir que o SQL está aguardando novos threads de trabalho
- Atualmente, vejo uma sessão com mais de 250 linhas em sysprocesses, quando consulto,
sys.dm_os_Waiting_tasks
vejo mais de 2186 linhas e 90% delas são para a mesma sessão. Portanto, minha pergunta aqui é como uma consulta pode abranger esses muitos segmentos
Vou obter a contagem de trabalhadores disponíveis usando a consulta abaixo, isso está correto?
select ( select max_workers_count from sys.dm_os_sys_info ) - ( select sum(active_workers_count) from sys.dm_os_Schedulers )
Você pode usar DMV sys.dm_os_schedulers para obter essas informações. A coluna que você deve consultar é
work_queue_count
. De acordo com o BOL, significaVocê pode usar a consulta abaixo para verificar o número de tarefas em espera para todos os agendadores online
Não tenho certeza do que você está tentando alcançar, mas abaixo está o que recebi deste blog
Um suspenso é um encadeamento que está aguardando algum recurso e não está ativo no momento. A espera pode ser I/O, rede etc. Veja o blog que compartilhei para mais detalhes.
Não, essa não é a consulta correta.
Parar de usar sys.sysprocesses é uma exibição herdada e a MS não recomenda seu uso. Em vez disso, use
sys.dm_exec_requests
Você pode obter a contagem de threads de trabalho para cada agendador usando DMV sys.dm_os_scheduler
Fiz alguns testes e encontrei poucos esclarecimentos para minha dúvida.Adicionando-os aqui.
1.Como saber se um thread está disponível para uma nova requisição ou atualmente ocupado com outras requisições.
O servidor SQL irá alocar threads com base nesta fórmula e o mesmo pode ser encontrado em sys.dm_os_sys_info também, o SQL por padrão começa com threads iniciais e continuará aumentando os threads até o limite máximo de threads com base na carga. os encadeamentos uma vez criados porque é caro criá-los novamente.
No meu caso, costumávamos receber alertas informando que apenas 10 threads estão disponíveis, mas não consigo descobrir se há threads disponíveis para atender às solicitações.
O mesmo aconteceu com pequenos testes usando a ferramenta Ostress com base neste blog e descobri que os tópicos disponíveis podem ser encontrados a qualquer momento usando a consulta abaixo
2. Estou tentando vincular task_address de sys.dm_exec_requests com sys.dm_os_tasks e endereço de trabalho como abaixo
Desculpe se minha pergunta não está clara, mas queria verificar se uma consulta está sendo executada em paralelo.
Qualquer consulta paralela terá uma entrada em sys.dm_os_tasks Plus sys.sysprocesses, portanto, para executar quais consultas estão sendo executadas paralelamente, podemos usar abaixo dmv.
3. Atualmente, abaixo está o estado dos meus threads de trabalho, o que isso significa suspenso?. Pude ver a contagem de mais de 500 com status suspenso.
Um thread pode ser suspenso devido a vários motivos, verifiquei o tipo de espera e todos os spids estão aguardando o CXpacket
4. Posso usar a consulta abaixo para descobrir que tenho inanição de thread de trabalho
Para saber se você está sofrendo de inanição de thread de trabalho, use as consultas abaixo.
Atualmente vejo uma sessão, está tendo mais de 250 linhas em sysprocesses, quando consulto sys.dm_os_Waiting_tasks, pude ver mais de 2186 linhas e 90% delas são para a mesma sessão. Portanto, minha pergunta aqui é como uma consulta pode abranger essas muitos tópicos
Pelo que entendi, o SQL ao usar o paralelismo gera muitos threads se eles estiverem disponíveis e o número de threads que o SQL abrange não é limitado ao número de núcleos da CPU, foi o que aconteceu no meu caso, então tentaremos verificar por que esse custo de consulta é considerado alto pelo SQL e testará isso.
E obrigado pelos recursos online, eu tive um equívoco de que quando um thread é bloqueado com i/O assíncrono, pensei que o SQL tentaria descarregar esse trabalho para o thread do sistema operacional, mas esse não é o caso