none
Aplicação pesada RRS feed

  • Pergunta

  • Galéra, minha aplicação não é grande, é workflow, tem 8 telas de aprovações, cada tela se conecta com SQL é outra maquina, todas os itens que são apresentados nestas telas tem a opção de visualizar os anexos, cada anexo tem em torno de 3mb no máximo, consultado em um outro BD (outra maquina).

    Minha aplicação esta consumindo 98% de memória e 88% da cpu com 5 usuarios online.

    Alguém sabe como verifico onde esta o problema?


    Junior Santana

    terça-feira, 11 de junho de 2013 17:10

Todas as Respostas

  • Você utiliza programação assincrona ?

    Se não utilize e distribuia os cores e a memoria.

    Se sim limite os cores e memoria.

    http://www.devmedia.com.br/programacao-assincrona-multithreading-em-net-com-c/23357

    http://msdn.microsoft.com/pt-br/magazine/hh456402.aspx

    terça-feira, 11 de junho de 2013 20:06
  • Você utiliza programação assincrona ?

    Se não utilize e distribuia os cores e a memoria.

    Se sim limite os cores e memoria.

    http://www.devmedia.com.br/programacao-assincrona-multithreading-em-net-com-c/23357

    http://msdn.microsoft.com/pt-br/magazine/hh456402.aspx

    è complicado... é assincrona, tem conexões com banco de dados constantemente e simultaneamente.

    Junior Santana

    quarta-feira, 12 de junho de 2013 14:51
  • O ideal é usar um profiler para diagnosticar o problema.
    quarta-feira, 12 de junho de 2013 18:55
  • Existem alguns itens que voce pode verificar para tentar identificar o problema:

    • Voce usa Factory de banco de dados com Singleton? Se não, seria uma boa ideia utilizar para reaproveitar o pool de conexões com o SqlServer.
    • Voce guarda os arquivos no BD? Se sim, e se possível, tente não guardar arquivos no seu BD, a menos que seja explicitamente necessário. O ideal é guardar os arquivos em um servidor de arquivos.
    • Voce utiliza Cache? O Cache ajuda bastante.
    • Voce controla o estado de suas Threads? O processamento assincrono pode ser uma dor de cabeça quando se executa muitas Threads simultaneas. Neste caso, o ideal é controlar a quantidade de Threads abertas no servidor. O .NET a partir da versão 4 possui o objeto Tasks que tem um monte de recurso para programação assíncrona
    • Voce utiliza DataReaders para recuperar dados? O DataReader, apesar de mais rápido, mantém a conexão com o BD aberta. Se possível, tente usar outro objeto.
    • Voce está garantindo o correto Dispose dos objetos? Sempre que possível utilize a instrução using () {}. Isso garante a correta liberação dos seus objetos.
    • Voce utiliza componentes de terceiros em sua aplicação? Neste caso, dar uma olhada na documentação do componente pode ajudar a esclarecer possíveis problemas.
    • Analise os logs do IIS para ver qual processo está consumindo mais recurso da máquina. Utilize também o Process Monitor do Windows. Com ele voce consegue monitorar tudo, desde de IO até Memoria, quantidade de Threads em execução, etc.
    • O VS 2010 possui um recurso que é um painel de processamento paralelo. Muito útil para ver as Threads em sistemas assincronos.

    Com certeza pode ter mais coisa para voce olhar, mas sempre digo o seguinte: difícil é fazer o fácil. Se for lembrando de mais coisa eu atualizo o post.

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    quinta-feira, 13 de junho de 2013 14:10
  • Esse consumo é apenas do processo do IIS? Qual o IIS que você utiliza?
    quinta-feira, 13 de junho de 2013 14:42
  • Existem alguns itens que voce pode verificar para tentar identificar o problema:

    • Voce usa Factory de banco de dados com Singleton? Se não, seria uma boa ideia utilizar para reaproveitar o pool de conexões com o SqlServer.
    • Voce guarda os arquivos no BD? Se sim, e se possível, tente não guardar arquivos no seu BD, a menos que seja explicitamente necessário. O ideal é guardar os arquivos em um servidor de arquivos.
    • Voce utiliza Cache? O Cache ajuda bastante.
    • Voce controla o estado de suas Threads? O processamento assincrono pode ser uma dor de cabeça quando se executa muitas Threads simultaneas. Neste caso, o ideal é controlar a quantidade de Threads abertas no servidor. O .NET a partir da versão 4 possui o objeto Tasks que tem um monte de recurso para programação assíncrona
    • Voce utiliza DataReaders para recuperar dados? O DataReader, apesar de mais rápido, mantém a conexão com o BD aberta. Se possível, tente usar outro objeto.
    • Voce está garantindo o correto Dispose dos objetos? Sempre que possível utilize a instrução using () {}. Isso garante a correta liberação dos seus objetos.
    • Voce utiliza componentes de terceiros em sua aplicação? Neste caso, dar uma olhada na documentação do componente pode ajudar a esclarecer possíveis problemas.
    • Analise os logs do IIS para ver qual processo está consumindo mais recurso da máquina. Utilize também o Process Monitor do Windows. Com ele voce consegue monitorar tudo, desde de IO até Memoria, quantidade de Threads em execução, etc.
    • O VS 2010 possui um recurso que é um painel de processamento paralelo. Muito útil para ver as Threads em sistemas assincronos.

    Com certeza pode ter mais coisa para voce olhar, mas sempre digo o seguinte: difícil é fazer o fácil. Se for lembrando de mais coisa eu atualizo o post.

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    Bom, analisei alguns pontos que o você citou e detectei que o prblema pode estar num função no meu Global.asa.

    No Session_Start -  faço um insert na base de dados com algumas informações do usuario logado, como o Session.SessionID.

    No Session_End - Faço um update na base onde o mesmo deu insert quando entrou.

    Comentei as duas instrução e o monitorei o servidor, percebi que o consumo diminuiu 50%.

    A questão é: como usar o Global.asa sem que isso aconteça?


    Junior Santana

    quinta-feira, 13 de junho de 2013 19:30
  • Esse consumo é apenas do processo do IIS? Qual o IIS que você utiliza?
    Sim, somente no ISS

    Junior Santana

    quinta-feira, 13 de junho de 2013 19:31
  • Alguém sabe como tratar este caso no global.asa?

    Junior Santana

    sexta-feira, 14 de junho de 2013 14:59
  • Uma desvantagem de se usar o evento Session_Start no Global, é que para qualquer usuário que entre em seu site, será criada uma Session. Mesmo que ele não efetue o Login em seu sistema, a Session será criada.

    Uma sugestão, é voce capturar as informações somente no momento da autenticação do usuário no sistema.

    Abraços,


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    segunda-feira, 17 de junho de 2013 12:47
  • Uma desvantagem de se usar o evento Session_Start no Global, é que para qualquer usuário que entre em seu site, será criada uma Session. Mesmo que ele não efetue o Login em seu sistema, a Session será criada.

    Uma sugestão, é voce capturar as informações somente no momento da autenticação do usuário no sistema.

    Abraços,


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    É uma intranet, só estarão nela, se tiver autenticado, mas não terão muitos usuário simultâneos.

    Junior Santana

    segunda-feira, 17 de junho de 2013 13:33
  • Existem alguns itens que voce pode verificar para tentar identificar o problema:

    • Voce usa Factory de banco de dados com Singleton? Se não, seria uma boa ideia utilizar para reaproveitar o pool de conexões com o SqlServer.
    • Voce guarda os arquivos no BD? Se sim, e se possível, tente não guardar arquivos no seu BD, a menos que seja explicitamente necessário. O ideal é guardar os arquivos em um servidor de arquivos.
    • Voce utiliza Cache? O Cache ajuda bastante.
    • Voce controla o estado de suas Threads? O processamento assincrono pode ser uma dor de cabeça quando se executa muitas Threads simultaneas. Neste caso, o ideal é controlar a quantidade de Threads abertas no servidor. O .NET a partir da versão 4 possui o objeto Tasks que tem um monte de recurso para programação assíncrona
    • Voce utiliza DataReaders para recuperar dados? O DataReader, apesar de mais rápido, mantém a conexão com o BD aberta. Se possível, tente usar outro objeto.
    • Voce está garantindo o correto Dispose dos objetos? Sempre que possível utilize a instrução using () {}. Isso garante a correta liberação dos seus objetos.
    • Voce utiliza componentes de terceiros em sua aplicação? Neste caso, dar uma olhada na documentação do componente pode ajudar a esclarecer possíveis problemas.
    • Analise os logs do IIS para ver qual processo está consumindo mais recurso da máquina. Utilize também o Process Monitor do Windows. Com ele voce consegue monitorar tudo, desde de IO até Memoria, quantidade de Threads em execução, etc.
    • O VS 2010 possui um recurso que é um painel de processamento paralelo. Muito útil para ver as Threads em sistemas assincronos.

    Com certeza pode ter mais coisa para voce olhar, mas sempre digo o seguinte: difícil é fazer o fácil. Se for lembrando de mais coisa eu atualizo o post.

    Abraços.


    Washington Luíz | MCP, MCTS
    O Senhor é minha força e somente Nele confio.

    Washington

    Tem algum material de como controlar as treads?, talvez seja isso o meu problema, já que minha aplicação usa 80% das atividades o SQL


    Junior Santana

    quinta-feira, 20 de junho de 2013 14:56
  • quinta-feira, 20 de junho de 2013 18:01