Uma MySQL Performance Dica Tem de ver
Eu corro cerca de vinte sites, anteriormente repartidas por duas contas de hospedagem compartilhada. No m锚s passado, meus anfitri玫es, tanto de forma independente fechar-me no ch茫o por mais de utiliza莽茫o da CPU. Muito justo, eu n茫o acho que eu estava abusando das contas, mas eu n茫o fa莽o as regras.
O pre莽o era de direita e um pouco mais de US $ 100 por m锚s eu tenho um servidor bom com 2 GB de mem贸ria, 500GB de banda mensal, uma CPU r谩pida todo o meu ego, a abusos como eu achar melhor.
Fast forward to UFC 77. Voc锚 v锚 que eu executar um web site que faz previs玫es e os resultados UFC UFC. Na noite de luta, o site pode ficar bastante movimentado, o meu anterior, alta foi de 18.000 visitantes nos 3 ou mais horas que as brigas ocorrem. Minha conta de hospedagem compartilhada nunca tive um problema com esta carga, pelo menos n茫o tanto quanto eu poderia dizer. No entanto, com o UFC 77 na minha conta de hospedagem dedicada de novo o meu servidor atingiu uma parede de tijolos. A CPU estava em 100% e houve 200 processos apache todos competindo para o CPU e mem贸ria dispon铆vel. Imediatamente comecei a procurar raz玫es e mais importante de solu莽玫es. Tr锚s dias depois, eu acho que a maioria das minhas respostas.
脡 importante saber que o Go Daddy n茫o houve culpa, eu perguntei para uma caixa com especifica莽玫es determinadas, e que 茅 exatamente o que eles me deram, completo com todos os softwares que eles disseram. MySQL, PHOP 4.3.9 e Apache 2.0.52. Ent茫o comecei a procurar (quando o servidor se acalmou) com o que estava acontecendo quando um usu谩rio requisitou uma p谩gina. A primeira coisa que eu notei foi que o processo apache corrente levaria cerca de 5% da CPU, eu n茫o prestar aten莽茫o a quanto tempo ele correu. A pr贸xima coisa que eu notei foi que o MySQL tamb茅m aproveita CPU significativo, mesmo que apenas por um curto per铆odo de tempo. 脡 importante saber que, durante o UFC 77 MySQL estava levando cerca de 50% da CPU durante todo o per铆odo ocupado. Tempo para procurar algumas otimiza莽玫es.
Para o meu site, onde existem 20.000 visitantes em 3 horas e talvez 10 atualiza莽玫es durante esse tempo, o cache seria, obviamente, ser 煤til. Notei pesquisar na web que o Apache tem cerca de cache e ainda melhor alguns cache min, no entanto, n茫o se considera produ莽茫o pronta no 2.0.52 build que eu tenho, por isso, descartada a id茅ia bastante r谩pido. Eu entretanto notar algumas coisas quando eu olhei para otimiza莽玫es MySQL.
A otimiza莽茫o do MySQL mais importante que eu encontrei 茅 a op莽茫o query_cache_size. Voc锚 v锚, o MySQL tem esse conceito de cache de consulta, aqui est谩 uma explica莽茫o simples. Se eu fizer uma consulta simples, digamos
Customer_name SELECT cliente onde customer_id> 10 (eu sei, uma pergunta boba)
Geralmente, o banco passa por toda a sua magia e devolve o resultado conjunto de todos os nomes de clientes que o id s茫o superiores aos 10. Para esta consulta n茫o tomaria muito tempo, mas quanto mais complexa a consulta a mais que seria necess谩rio. No entanto, com o MySQL cache de consulta, o resultado dessa consulta seria mantida na mem贸ria, juntamente com a consulta em si, o que significa que da pr贸xima vez que a mesma consulta foi executar o banco de dados seria apenas verificar se h谩 tabelas na consulta ter sido alterado e, em seguida procurar o resultado na mem贸ria e devolv锚-lo. Isto 茅 muito mais r谩pido. O MySQL tem consulta cache ativado por padr茫o, mas a vari谩vel query_cache_size 茅 definido como 0, essencialmente desactivar a funcionalidade. Para ativ谩-la voc锚 deve fazer:
query_cache_size = 64M em my.cnf
Nota: Eu tamb茅m aumentou minha query_cache_limit de 4M e meu thread_cache_size a 384. H谩 muitas outras op莽玫es MySQL que voc锚 pode definir para melhorar o desempenho, procurar um bom livro MySQL ou talvez eu vou postar algumas delas no meu dep贸sito de fonte aberta blog at [http://www.open-source-depot.com / blog].
Depois de configurar as op莽玫es no my.cnf voc锚 precisar谩 reiniciar o MySQL, sendo que eu sou do tipo impaciente e n茫o gosto de reiniciar o processo, fui para a linha de comando do MySQL e definir as op莽玫es globais. Por alguma raz茫o os 64M n茫o trabalho para mim l谩, ent茫o eu usei o expandido (bytes) version
ou seja, mysql> SET GLOBAL query_cache_size = 60000000;
para ver o que est谩 definido, fa莽a um:
mysql> SHOW VARIABLES LIKE have_query_cache ‘;
Nota: Voc锚 precisa dizer ao MySQL para “ir” com ag na pr贸xima linha.
Agora eu tentei bater o meu blog um pouco e descobri que nunca a CPU para o MySQL foi mais de 1 ou 2 (exceto para o primeiro hit), muito muito legal. Eu devo fazer uma nota que eu encontrei algumas refer锚ncias sobre a rede onde o cache de consulta no MySQL realmente degrada o desempenho de determinadas circunst芒ncias. Eu diria que em um ambiente de atualiza莽茫o pesados (um carrinho de compras, por exemplo) que a sobrecarga do cache pode outweight 茅 usefullness, mas para sites como mina onde 茅 99,9% da leitura e escrita de apenas 1% de cache de consulta 茅 impressionante. Existem outras otimiza莽玫es MySQL que eu quero olhar, como cache de tabela e talvez at茅 mesmo persistente connections, mas um passo de cada vez. Eu quero ver que tipo de diferen莽a esta mudan莽a um vai fazer. Eu estou esperando por coisas boas. Meu pr贸ximo passo 茅 o cache do PHP, mas vou guardar isso para outro artigo.
Fonte: http://www.compute-rs.com



