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 / 213010
Accepted
user9516827
user9516827
Asked: 2018-07-24 14:01:12 +0800 CST2018-07-24 14:01:12 +0800 CST 2018-07-24 14:01:12 +0800 CST

Uso de memória pelo SQL Server

  • 772

Como faço para verificar o uso de memória pelo meu servidor SQL na caixa de produção. Estou usando o SQL Server 2016. Sempre que verifico o gerenciador de tarefas, ele mostra acima de 90%. Eu não acho que seja o uso real de memória pelo servidor sql.

Eu tenho uma ferramenta de desempenho SQL grafana que mostra o uso da CPU muito menos do que vejo no gerenciador de tarefas. Verifiquei o Monitor de Recursos, pode-se ver o valor médio da CPU. Estou confuso sobre qual é o uso de memória do servidor SQL. Estou tentando determinar se a pressão da memória é um problema para alguns dos meus problemas.

Alguém pode direcionar para uma explicação boa/adequada.

sql-server performance
  • 4 4 respostas
  • 83203 Views

4 respostas

  • Voted
  1. Igor
    2018-07-26T06:41:56+08:002018-07-26T06:41:56+08:00

    'Estou tentando determinar se a pressão da memória é um problema para alguns dos meus problemas.'

    script muito útil: https://github.com/ktaranov/sqlserver-kit/blob/master/Scripts/SQLServer_Memory_Information.sql

    você vê a utilização de memória detalhada: insira a descrição da imagem aqui

    https://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-for-november-2017/ Consultas de informações de diagnóstico do SQL Server 2017:
    consulte o comentário

    -- Page Life Expectancy (PLE) value for each NUMA node in current instance  (Query 46) (PLE by NUMA Node)
    SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy]
    FROM sys.dm_os_performance_counters WITH (NOLOCK)
    WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances
    AND counter_name = N'Page life expectancy' OPTION (RECOMPILE);
    ------
    
    -- PLE is a good measurement of internal memory pressure
    -- Higher PLE is better. Watch the trend over time, not the absolute value
    

    (Consulta 14)

    -- Good basic information about OS memory amounts and state  (Query 14) (System Memory)
    SELECT total_physical_memory_kb/1024 AS [Physical Memory (MB)], 
           available_physical_memory_kb/1024 AS [Available Memory (MB)], 
           total_page_file_kb/1024 AS [Total Page File (MB)], 
           available_page_file_kb/1024 AS [Available Page File (MB)], 
           system_cache_kb/1024 AS [System Cache (MB)],
           system_memory_state_desc AS [System Memory State]
    FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE);
    ------
    
    -- You want to see "Available physical memory is high" for System Memory State
    -- This indicates that you are not under external memory pressure
    
    -- Possible System Memory State values:
    -- Available physical memory is high
    -- Physical memory usage is steady
    -- Available physical memory is low
    -- Available physical memory is running low
    -- Physical memory state is transitioning
    

    (47)

    -- Memory Grants Pending value for current instance  (Query 47) (Memory Grants Pending)
    SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending]
    FROM sys.dm_os_performance_counters WITH (NOLOCK)
    WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances
    AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE);
    ------
    
    -- Run multiple times, and run periodically if you suspect you are under memory pressure
    -- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure
    

    (62)

    -- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure  (Query 62) (SP Logical Reads)
    SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], 
    qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, 
    ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], 
    qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
    CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%<MissingIndexes>%' THEN 1 ELSE 0 END AS [Has Missing Index], 
    FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], 
    FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time]
    -- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan
    FROM sys.procedures AS p WITH (NOLOCK)
    INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
    ON p.[object_id] = qs.[object_id]
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    WHERE qs.database_id = DB_ID()
    AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0
    ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE);
    ------
    
    -- This helps you find the most expensive cached stored procedures from a memory perspective
    -- You should look at this if you see signs of memory pressure
    

    (63)

    -- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure  (Query 63) (SP Physical Reads)
    SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], 
    qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, 
    qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
    CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%<MissingIndexes>%' THEN 1 ELSE 0 END AS [Has Missing Index],
    FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], 
    FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time]
    -- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan 
    FROM sys.procedures AS p WITH (NOLOCK)
    INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
    ON p.[object_id] = qs.[object_id]
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    WHERE qs.database_id = DB_ID()
    AND qs.total_physical_reads > 0
    ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOMPILE);
    ------
    
    -- This helps you find the most expensive cached stored procedures from a read I/O perspective
    -- You should look at this if you see signs of I/O pressure or of memory pressure
    

    (64)

    -- Top Cached SPs By Total Logical Writes (Query 64) (SP Logical Writes)
    -- Logical writes relate to both memory and disk I/O pressure 
    SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], 
    qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count,
    ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute],
    qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
    CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%<MissingIndexes>%' THEN 1 ELSE 0 END AS [Has Missing Index], 
    FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], 
    FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time]
    -- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan 
    FROM sys.procedures AS p WITH (NOLOCK)
    INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
    ON p.[object_id] = qs.[object_id]
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    WHERE qs.database_id = DB_ID()
    AND qs.total_logical_writes > 0
    AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0
    ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE);
    ------
    
    -- This helps you find the most expensive cached stored procedures from a write I/O perspective
    -- You should look at this if you see signs of I/O pressure or of memory pressure
    

    PS esta não é uma resposta exaustiva

    • 21
  2. Best Answer
    Shanky
    2018-07-24T23:11:13+08:002018-07-24T23:11:13+08:00

    Alguém pode direcionar para uma explicação boa/adequada.

    Eu começaria dizendo que o Gerenciador de Tarefas não é um local correto para medir o consumo de memória do SQL Server, ele não informará o valor correto quando a conta de serviço do SQL Server tiver o privilégio Páginas bloqueadas na memória (LPIM). Isso ocorre porque normalmente o gerenciador de tarefas rastreia Process Private bytesqual é a memória paginável e alocada por meio da função VirtualAlloc() , mas com a conta de serviço com o bloco LPIM de alocação de memória é feito pela API AWE , que não é paginável, portanto, o gerenciador de tarefas não o rastreia e isso pode levar a erros valor.

    É bastante normal que o SQL Server utilize a memória alocada a ele, o que geralmente parece estar usando muita memória, mas isso é bastante normal. Não entre em pânico se alguma ferramenta estiver mostrando baixa utilização da CPU e o gerenciador de tarefas estiver mostrando muita memória, isso pode ser normal. Para saber quanta memória física o SQL Server está usando, use a consulta abaixo

    select
    (physical_memory_in_use_kb/1024)Phy_Memory_usedby_Sqlserver_MB,
    (locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
    (virtual_address_space_committed_kb/1024 )Total_Memory_UsedBySQLServer_MB,
    process_physical_memory_low,
    process_virtual_memory_low
    from sys. dm_os_process_memory
    

    Phy_Memory_usedby_Sqlserver_MB -- Fornece a memória física total usada pelo SQL Server em MB Total_Memory_usedBy_SQLServer_MB- - Fornece a memória total (RAM + arquivo de página) usada pelo SQL Server em MB

    Para ler mais sobre por que o gerenciador de tarefas não deve ser usado, consulte Diversão com páginas bloqueadas, AWE, Gerenciador de tarefas e o conjunto de trabalho…

    • 15
  3. Goforebroke
    2018-07-24T14:09:02+08:002018-07-24T14:09:02+08:00

    Não tenho certeza sobre a ferramenta grafana, mas se você executar a consulta abaixo ela mostra a memória atualmente alocada

    SELECT  
    (physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,  
    (locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,  
    (total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,  
    process_physical_memory_low,  
    process_virtual_memory_low  
    FROM sys.dm_os_process_memory; 
    
    • 2
  4. Błażej Ciesielski
    2018-07-24T14:56:13+08:002018-07-24T14:56:13+08:00

    Você deve deixar de fora o gerenciador de tarefas, pois ele não relata adequadamente as informações de alocação de memória em alguns casos, dependendo das rotinas de alocação de memória usadas pelo aplicativo. No sistema operacional, você deve ser bom com o perfmon, pois deve relatar o uso da memória corretamente. Você também pode usar SQL DMVs relatando informações de memória, por exemplo, sys.dm_os_sys_memory (há mais dmvs relacionados à memória, dependendo de suas necessidades e da versão do SQL Server).

    Aqui está um artigo explicando o gerenciador de tarefas relatando incorretamente o uso do memroy do SQL Server:

    LINK: stop-using-task-manager-to-check-sqls-memory-usage

    • 0

relate perguntas

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

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

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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