AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 114455
Accepted
TheGameiswar
TheGameiswar
Asked: 2015-09-09 04:03:08 +0800 CST2015-09-09 04:03:08 +0800 CST 2015-09-09 04:03:08 +0800 CST

Status do encadeamento do SQL Server

  • 772

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 é

  1. Como saber se um thread está disponível para uma nova solicitação ou atualmente ocupado com outras solicitações.

  2. Estou tentando vincular task_addresssys.dm_exec_requests com sys.dm_os_tasks e worker_addresscomo abaixo

    select * 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

  1. 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.

insira a descrição da imagem aqui

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

  1. Atualmente, vejo uma sessão com mais de 250 linhas em sysprocesses, quando consulto, sys.dm_os_Waiting_tasksvejo 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

insira a descrição da imagem aqui

  1. 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
            )
    
sql-server
  • 2 2 respostas
  • 17212 Views

2 respostas

  • Voted
  1. Best Answer
    Shanky
    2015-09-09T04:50:27+08:002015-09-09T04:50:27+08:00
    1. Como saber se um thread está disponível para uma nova solicitação ou atualmente ocupado com outras solicitações.

    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, significa

    Número de tarefas na fila pendente. Essas tarefas estão esperando que um trabalhador as pegue. Não é anulável.

    Você pode usar a consulta abaixo para verificar o número de tarefas em espera para todos os agendadores online

    select work_queue_count from sys.dm_os_scheduler where status='Visible online'
    
    1. Não tenho certeza do que você está tentando alcançar, mas abaixo está o que recebi deste blog

        select wt.session_id, 
        ot.task_state, 
        wt.wait_type, 
        wt.wait_duration_ms, 
        wt.blocking_session_id, 
        wt.resource_description, 
        es.[host_name], 
        es.[program_name] 
        FROM  sys.dm_os_waiting_tasks  wt  
        INNER  JOIN sys.dm_os_tasks ot 
        ON ot.task_address = wt.waiting_task_address 
        INNER JOIN sys.dm_exec_sessions es 
        ON es.session_id = wt.session_id 
        WHERE es.is_user_process =  1 
      
    1. Pude ver a contagem de mais de 500 com status suspenso. Não vejo nenhum bloqueio

    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.

    1. Posso usar a consulta abaixo para descobrir que tenho inanição de thread de trabalho

    Não, essa não é a consulta correta.

    1. Parar de usar sys.sysprocesses é uma exibição herdada e a MS não recomenda seu uso. Em vez disso, usesys.dm_exec_requests

    2. Você pode obter a contagem de threads de trabalho para cada agendador usando DMV sys.dm_os_scheduler

         select current_workers_count from sys.dm_os_scheduler where status='visible online'
      
    • 2
  2. TheGameiswar
    2015-09-13T02:50:02+08:002015-09-13T02:50:02+08:00

    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

    select (select max_workers_count from sys.dm_os_sys_info) as 'TotalThreads',sum(active_Workers_count) as 'Currentthreads',(select max_workers_count from sys.dm_os_sys_info)-sum(active_Workers_count) as 'Availablethreads',sum(runnable_tasks_count) as 'WorkersWaitingfor_cpu',sum(work_queue_count) as 'Request_Waiting_for_threads' 
    from  sys.dm_os_Schedulers where status='VISIBLE ONLINE'
    

    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.

    select
     er.session_id,
     er.status,
     er.command,
     er.blocking_session_id,
     er.wait_type,
     ot.exec_context_id,
     ot.task_state,
     st.text
    from
     sys.dm_exec_requests er
     join sys.dm_os_tasks ot on (er.session_id = ot.session_id)
     cross apply sys.dm_exec_sql_text(er.sql_handle) st
    where er.session_id in
     (select session_id
     from sys.dm_os_tasks
    group by session_id
    having count(exec_context_id)>1)
    

    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.

    select sum(work_queue_count) from sys.dm_os_schedulers
    select * from sys.dm_os_tasks
    
    select * from sys.dm_os_waiting_tasks where wait_type='threadpool'
    

    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

    insira a descrição da imagem aqui

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve