Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cbr600

Consumos de CPU excessivos

Recommended Posts

Oi pessoal:Tou com um grave problema no meu site. A empresa de hospedagem diz que o meu site está a consumir muitos recursos de CPU, e teve que limitar a 20% a utilização, e por isso o meu site está sempre dando "service unavailable". Não dá para abrir mais de 4-5 páginas seguidas sem isso acontecer. É um site muito visitado, com 60-80 pessoas em simultaneo, tem um fórum da Webwiz com 15.000 membros e 500 visitantes por dia, que usa MSSQL, e já fiz o upgrade para a última versão mas continua a consumir muito CPU.De resto, tenho umas bases de dados com 8.000 registos em MySQL, outras mais pequenas em Access, e utilizo o aspjpeg para converter o tamanho de algumas imagens. Os meus ficheiros de log têm 200mb e fica difícil procurar alguma coisa. Como poderei descobrir o que está consumindo tantos recursos de CPU?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um boa olhada é:

 

Recordsert e Conexões Abertas, sem fechar.

Destruir Objetos criados.

Uso do Option Explicit, forçando a declarãção de todas as variáveis utilizadas. assim o servidor não tem que ficar definindo que é e quem não é variável.

 

Tem um programa do Super asp chamado Asp Dataform Tools, ele faz algumas verificações, mas ele não é muito bom não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e utilizo o aspjpeg para converter o tamanho de algumas imagens.

Você reduz as imagens no upload e deixa uma miniatura gravada ou faz a transformação das imagens "on the fly" a cada chamada da página?Essa redução "on the fly" normalmente derruba ou deixa bem lento o servidor se for uma quantidade moderada de imagens.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há alguma forma de ver as conexões abertas? tenho centenas de páginas e não é fácil checkar todas. Há também alguma forma de ver o que está consumindo CPU?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As conversões são feitas on-the-fly. mas isso consome CPU ou memória? de facto a função do aspjpeg (sendbinary) está no topo das páginas mais solicitadas, pelo webalizer:Top 10 of 24390 Total URLs By KBytes# Hits KBytes URL1 269743 2.62% 307634 3.59% /common/sendbinary_height.asp2 410260 3.99% 248174 2.89% /common/sendbinary.asp3 138462 1.35% 133496 1.56% /forum/forum_posts.asp4 110659 1.08% 108687 1.27% /forum/forum_topics.asp5 87079 0.85% 97894 1.14% /left/servicos/classificados/adDetail.asp6 67681 0.66% 97259 1.13% /forum/css_styles2/default_style.css7 54676 0.53% 73252 0.85% /forum/RTE_javascript_common.asp8 63638 0.62% 72897 0.85% /forum/includes/milonic_src.js9 50610 0.49% 71336 0.83% /forum/includes/RTE_iframe_colour_palette.asp10 79795 0.78% 71041 0.83% /forum/default.aspPoderá ser apenas isto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara vou te dar uma dica em relação aos loopings em sites grandes que recebem muitas visitas:ao invés de usar a tradicional maneira de loopings em Recordsets, use o objeto getRows no Recordset.Com apenas UMAr equisição no server, TODOS os dados são armazenados num objeto, que depois você pode manipular facilmente. Aliás, após atribuir à esse objetos as getRows de um Recordset, você pode até fechar sua RecordSet!Já na maneira convencional, a cada looping de cada item relacionados ao recordset é uma requisição. Imagina um looping 50 linhas contendo 4 itens cada? 200 requisições no banco de dados por usuário a cada visita à uma simples página!Lógico que para refazer todo o site utilizando getRows irá consumir muito tempo seu, mas tenha certeza que o desempenho das conexões irá melhorar MUITO.PS: se você já estiver usando o método getRows e mesmo assim rola esse problema, então ignore meu post. :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ricardo obrigado pela resposta.Imagine que tenho um sistema de noticias no site com um banco de dados MySQL e os campos:NOT_IDNOT_TITULONOT_DESCRICAONOT_DATANOT_FOTOComo posso aplicar o comando getrows de maneira a que me mostre as noticias com estes campos todos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As conversões são feitas on-the-fly. mas isso consome CPU ou memória? de facto a função do aspjpeg (sendbinary) está no topo das páginas mais solicitadas, pelo webalizer:Top 10 of 24390 Total URLs By KBytes# Hits KBytes URL1 269743 2.62% 307634 3.59% /common/sendbinary_height.asp2 410260 3.99% 248174 2.89% /common/sendbinary.asp3 138462 1.35% 133496 1.56% /forum/forum_posts.asp4 110659 1.08% 108687 1.27% /forum/forum_topics.asp5 87079 0.85% 97894 1.14% /left/servicos/classificados/adDetail.asp6 67681 0.66% 97259 1.13% /forum/css_styles2/default_style.css7 54676 0.53% 73252 0.85% /forum/RTE_javascript_common.asp8 63638 0.62% 72897 0.85% /forum/includes/milonic_src.js9 50610 0.49% 71336 0.83% /forum/includes/RTE_iframe_colour_palette.asp10 79795 0.78% 71041 0.83% /forum/default.aspPoderá ser apenas isto?

Com certeza consome muita CPU. Seu site fez quase 700000 conversões de imagens no período do relatório. Experimenta fazer um batch no fotoshop e vê onde vai parar a CPU.O melhor como já disse é fezer a conversão da imagem no upload e gravar a miniatura. Vai usar um pouco mais de espaço em disco, mas depois tudo que o servidor tem de fazer é enviar uma imagem estática. O desempenho melhora muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ricardo obrigado pela resposta.Imagine que tenho um sistema de noticias no site com um banco de dados MySQL e os campos:NOT_IDNOT_TITULONOT_DESCRICAONOT_DATANOT_FOTOComo posso aplicar o comando getrows de maneira a que me mostre as noticias com estes campos todos?

Então, o objeto que retorna do getRows é como uma array com 2 dimensões... por exemplo objgetrows = rs.getRowsobjgetrows(A,Z)... Onde A é o número da coluna e Z o número da linha, começando com 0 em indices numericos....No seu casoobjgetrows(0,0) seria NOT_ID da primeira linha e objgetrows(2,0) seria NOT_DESCRICAOPra fazer loopings :****JScript**************************************************for(i=0;i<objgetrows.ubound(2);i++) {Response.Write("id:" + objgectrows(0,i) + "titulo: " + objgectrows(1,i));}****V BScript************************************************For i= 0 To Ubound(objgetrows,2)Response.Write "id:" & objgectrows(0,i) & "titulo: " & objgectrows(1,i)Next***********************************************************Onde Ubound no indice 2 retorna o total de linhas. Caso precise ou queira o total de colunas o comando é Ubound no indice 1.Espero ter ajudado, abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cbr,Descordo do colega, acho que se você trabalhar com recordsets desconectados será melhor.Veja issohttp://forum.imasters.com.br/index.php?sho...ctado&st=20

Mas Marcelo, tem um erro considerável nesse tópico.Um getRows não obrigatoriamente tras TODOS itens pra dentro do objeto. Existem parametros pra esse método, alias parametros extramamente úteis.getrows(nro_de_rows,row_inicial,campos) onde....nro_de_rows -> a quantidade de linhas que deseja retornar. No exemplo citado, bastava um getRows(10) que tudo estaria resolvido e os 990 registros excedentes NÃO estariam ocupando espaço no objeto.row_inicial -> a partir de qual linha ele irá começar. Para paginações, isso é super útil.campos -> um nome do campo, ou uma array de campos que você possa querer atribuir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quem escreveu sobre o GetRows não foi eu, pois não uso. Uso Recordset Desconectado.De qualquer forma não importa quantos registros possuem o recordset ou o Array pois isso consome memória e não CPU

Mas os requests à um DB via um looping "normal" utilizam CPU... E por isso que sugeri o getRows.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com recordset desconetado não há requisição para o banco, pois o recordset não está "conectado"

eu sei que Recordset desconectado é outra alternativa, por isso falei em loopings "normais", ou seja, os mais comuns, que são os 'conectados'. B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.