none
Melhorar o desempenho com baixo custo RRS feed

  • Pergunta

  • Pessoal, aqui na empresa possuímos um deskserver, e nossos usuários estão reclamando de desempenho, monitorando o servidor a CPU e a memória estão ok, o problema está no disco, ele fica em constante atualização, já adicionei mais um disco e separei os logs das databases, mas mesmo assim ainda não melhorou.

    O que eu poderia fazer com baixo custo? Tentar um RAID5 via windows será que ajuda?

    Obrigado


    Diego Fucitalo

    segunda-feira, 8 de outubro de 2012 14:09

Respostas

  • Faça o monitoramento que o Leonardo citou e alem disso procure por missing index em sua base de dados do aplicativo.

    SELECT  sys.objects.name
    , (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) AS Impact
    ,  'CREATE NONCLUSTERED INDEX ix_IndexName ON ' + sys.objects.name COLLATE DATABASE_DEFAULT + ' ( ' + IsNull(mid.equality_columns, '') + CASE WHEN mid.inequality_columns IS NULL 
                    THEN ''  
        ELSE CASE WHEN mid.equality_columns IS NULL 
                        THEN ''  
            ELSE ',' END + mid.inequality_columns END + ' ) ' + CASE WHEN mid.included_columns IS NULL 
                    THEN ''  
        ELSE 'INCLUDE (' + mid.included_columns + ')' END + ';' AS CreateIndexStatement
    , mid.equality_columns
    , mid.inequality_columns
    , mid.included_columns 
        FROM sys.dm_db_missing_index_group_stats AS migs 
                INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle 
                INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle AND mid.database_id = DB_ID() 
                INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID 
        WHERE     (migs.group_handle IN 
            ( 
            SELECT     TOP (500) group_handle 
                FROM          sys.dm_db_missing_index_group_stats WITH (nolock) 
                ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC))  
            AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1 
        ORDER BY 2 DESC , 3 DESC 
    

    O script acima varre as tabelas de sistema para encontrar os missing index e ordena por peso de criação. Avalie antes de realizar a criação do mesmo, mas isso pode ajudar você a dimunir o numero de leituras feitas.

    Se a resposta foi útil, classifique-a.


    Se a resposta foi útil, classifique-a Att, Marcos Freccia [MCTS|MCITP|MCT SQL Server 2008]

    • Marcado como Resposta Richard Juhasz sexta-feira, 18 de janeiro de 2013 17:07
    terça-feira, 16 de outubro de 2012 20:18
  • Diego,

    Execute a seguinte query:

    select 
    
    CONVERT(VARCHAR,CAST(bpool_committed *8  AS MONEY),1)AS [SIZE],
    
    bpool_committed,bpool_commit_target 
    
      from 
    
    sys.dm_os_sys_info
    

    Com esta query você vai obter as informações sobre o uso de memória por parte do SQL Server.

    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Richard Juhasz sexta-feira, 18 de janeiro de 2013 17:07
    quarta-feira, 17 de outubro de 2012 14:31
    Moderador

Todas as Respostas

  • Diego,

    Você utilizou algum contador de disco através do Perfmon para identificar esta suposta lentidão de disco?

    Isso esta ocorrendo somente no SQL Server?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 8 de outubro de 2012 14:23
    Moderador
  • Junior, como assim comente no SQL Server? Este servidor é somente de banco de dados. Referente ao contador, sim eu usei um contador. Olha o gráfico abaixo:

    Diego Fucitalo

    segunda-feira, 8 de outubro de 2012 14:31
  • Diego, nem precisa do gráfico, dá só o nome do contador o valor médio que ele aprensentando em X minutos, antes de tudo, veja se os contadores estão realmente habilitados no servidor através dessa chave do registro, ela tem que tá como 0:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Perfdisk\Performance\Disable Performance Counters

    Depois disso, colete os seguintes contadores:

    Physical Disk\Current Disk Queue Length
    Physical Disk/% Idle Time
    Physical Disk\Avg. Disk sec/Write
    Physical Disk\Avg. Disk sec/Read

    E um detalhe, como você chegou ao ponto em que o CPU e memória está ok? Se a CPU estiver baixa, considere que você pode estar tendo muitos locks, e por isso o uso de cpu não está intenso.

    Memória você viu foi o Page Life Expectancy? Veja se ele está com um valor > 300, que é o mínimo recomendável. Se ele tiver baixo, é sinal de que a pressão sobre o disco está alta e indica um problema de memória.

    quarta-feira, 10 de outubro de 2012 22:07
  • Leonardo, não achei a chave "Disable Performance Counters", eu cheguei até a chave "Perfomance", existe algumas etradas mas não essas que você falou.

    Vou realizar o monitoramentos dos contadores que você falou e coloco aqui.

    Referente a memória e cpu apenas olhando pelo task manager.


    Diego Fucitalo

    sexta-feira, 12 de outubro de 2012 03:28
  • Faça o monitoramento que o Leonardo citou e alem disso procure por missing index em sua base de dados do aplicativo.

    SELECT  sys.objects.name
    , (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) AS Impact
    ,  'CREATE NONCLUSTERED INDEX ix_IndexName ON ' + sys.objects.name COLLATE DATABASE_DEFAULT + ' ( ' + IsNull(mid.equality_columns, '') + CASE WHEN mid.inequality_columns IS NULL 
                    THEN ''  
        ELSE CASE WHEN mid.equality_columns IS NULL 
                        THEN ''  
            ELSE ',' END + mid.inequality_columns END + ' ) ' + CASE WHEN mid.included_columns IS NULL 
                    THEN ''  
        ELSE 'INCLUDE (' + mid.included_columns + ')' END + ';' AS CreateIndexStatement
    , mid.equality_columns
    , mid.inequality_columns
    , mid.included_columns 
        FROM sys.dm_db_missing_index_group_stats AS migs 
                INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle 
                INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle AND mid.database_id = DB_ID() 
                INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID 
        WHERE     (migs.group_handle IN 
            ( 
            SELECT     TOP (500) group_handle 
                FROM          sys.dm_db_missing_index_group_stats WITH (nolock) 
                ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC))  
            AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1 
        ORDER BY 2 DESC , 3 DESC 
    

    O script acima varre as tabelas de sistema para encontrar os missing index e ordena por peso de criação. Avalie antes de realizar a criação do mesmo, mas isso pode ajudar você a dimunir o numero de leituras feitas.

    Se a resposta foi útil, classifique-a.


    Se a resposta foi útil, classifique-a Att, Marcos Freccia [MCTS|MCITP|MCT SQL Server 2008]

    • Marcado como Resposta Richard Juhasz sexta-feira, 18 de janeiro de 2013 17:07
    terça-feira, 16 de outubro de 2012 20:18
  • Diego,

    Execute a seguinte query:

    select 
    
    CONVERT(VARCHAR,CAST(bpool_committed *8  AS MONEY),1)AS [SIZE],
    
    bpool_committed,bpool_commit_target 
    
      from 
    
    sys.dm_os_sys_info
    

    Com esta query você vai obter as informações sobre o uso de memória por parte do SQL Server.

    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Richard Juhasz sexta-feira, 18 de janeiro de 2013 17:07
    quarta-feira, 17 de outubro de 2012 14:31
    Moderador