Começando como um desenvolvedor de software, é recomendado seguir uma abordagem mais pragmática para desenvolver software.
Conforme o tempo passa, quando você começa a construir um software mais complexo que atende milhares ou milhões de usuários, torna-se crucial estar mais preocupado com conceitos como arquitetura, design de sistema, teste, segurança, implantação e, principalmente, desempenho. Além disso, no desempenho, é prática comum seguir as principais métricas de desempenho, como tempo médio de resposta, taxa de tráfego e uso da CPU de seu aplicativo e do servidor.
O principal problema agora decorre de adquirir o melhor criador de perfil ferramenta que mede o desempenho do aplicativo Node.js com base nessas métricas e não afeta a capacidade de resposta do software.
NB, perfil de CPU e monitoramento de CPU são frequentemente usados de forma intercambiável, mas são diferentes.
Neste artigo, você aprenderá sobre a ferramenta de criação de perfil embutida recomendada em Node.js.
Por que criar perfil?
Criar perfil é coletar e analisar dados sobre como funções em seu código, execute quando executado, em relação aos parâmetros de medição de desempenho, como complexidade de tempo, rendimento, cargas de trabalho de entrada, coleta de lixo e tempo para invocar e executar uma função.
O propósito veja aqui é para identificar gargalos em seu código. Os gargalos acontecem quando uma linha/bloco de código ou função não está funcionando tão bem quanto o resto do programa. Alguns desses gargalos podem ser óbvios, mas a maioria deles nem tanto.
Então, em essência, um criador de perfil diz: “Ei, não se preocupe em adivinhar onde está escondido o bug que desacelera seu aplicativo. Deixe-me ajudá-lo a fazer isso programaticamente. ”
O criador de perfil Node.js
A maneira mais fácil no Node.js de criar perfis de aplicativos é usando o criador de perfil embutido, que coleta todos os dados de funções e registra-o em um arquivo. O Node.js implementa isso introduzindo o sinalizador–prof, que se comunica com o criador de perfil V8 e, em seguida, registra os dados.
Vamos ilustrar como isso funciona com um aplicativo Node.js de amostra. Este exemplo usa o framework Node.js Fastify. Fastify afirma ser a “estrutura da web mais rápida da cidade!” então achei que usar isso seria perfeito para uma demonstração.
A API Fastify executa operações CRUD para um aplicativo de livraria. Para acompanhar, você pode clonar o repositório GitHub .
Vamos examinar as funções do manipulador em controladores/bookController.js e perfilá-los:
//controllers/bookController.js const boom=require (‘boom’) const Book=require (‘../models/Book’)//get all books extensions.getAllBooks=async (req, reply)=> {try {const books=await Book.find () return reply.code (200).send ({Message:”Success”, data: books})} catch (err) {throw boom.boomify (err)}}//obtenha um único livro por id exports.getSingleBook=async (req, reply)=> {try {const id=req.params.id const book=await Book.findById (id) return reply.code (200).send ({Message:”Success”, data: book})} catch (err) {throw boom.boomify (err)}}//adicionar um novo livro exports.addNewBook =async (req, responder )=> {tente {livro const=novo livro (req.body) const n ewBook =await book.save () return reply.code (200).send ({Message:”Novo livro adicionado com sucesso”, data: newBook})} catch (err) {throw boom.boomify (err)}}//editar um livro exports.updateBook=async (req, reply)=> {try {const id=req.params.id const updatedBook=await Book.findByIdAndUpdate (id, req.body, {new: true}) return reply.code (200).send ({Message:”Livro atualizado com sucesso”, data: updatedBook})} catch (err) {throw boom.boomify (err)}}//excluir um livro exports.deleteBook=async (req, responder)=> {tentar {id const=req.params.id livro excluído const=aguardar Livro.findByIdAndDelete (id); return reply.code (200).send ({Message: `$ {deletedBook.title} foi excluída com sucesso`, data: id})} catch (err) {throw boom.boomify (err)}}
Você poderia adicionar alguns dados ao MongoDB como este:
> db.user.insert ({title:”The book for old people”, genre:”Self Help”})
Estamos adicionando alguns dados para ajudar Nós simulamos um cenário em que os usuários têm problemas de latência ao fazer solicitações ao seu aplicativo. Portanto, você pode ir em frente e criar o máximo de dados possível no banco de dados.
Execute este comando em seu terminal:
node–prof controllers/bookController.js
Este comando cria um arquivo de log isolate-0xnnnnnnnnn-v8.log (onde n é um dígito) e deve ser semelhante a:
Ilegível, certo? É por isso que executaremos o sinalizador–prof-process para converter esse arquivo de log em um arquivo mais legível.
Execute este comando em seu terminal:
node–prof-process isolate-000001EFE5017350-7076-v8.log> processamento.txt
Isso criará um arquivo processado.txt que contém os registros.
Vamos examinar os registros, começando pela seção de resumo.
Isso mostra que 97 por cento das amostras coletadas foram obtidas de bibliotecas compartilhadas. Portanto, vamos nos concentrar na seção [Bibliotecas compartilhadas] e ignorar o resto.
Podemos ver que 89 por cento do tempo da CPU é consumido pelo ambiente de execução Node.js e 8 por cento pelas funções do kernel do Windows. Além disso, mostra claramente que não é ideal criar o perfil do código em seu servidor de desenvolvimento local. É preferível executar testes em um servidor HTTP. Então, vamos simular um ambiente de produção com o Ngrok.
O Ngrok permite que você crie URLs públicos para expor seu servidor web de desenvolvimento. Você pode aprender a configurar o Ngrok aqui .
Um URL Ngrok típico se parece com http://873acd0acf28.ngrok.io .
Agora não estamos mais contando com o tempo de execução do Node.js e os kernels do sistema operacional para executar nosso servidor Node. Vamos executar o atributo–prof novamente. Primeiro, adicione alguma carga ao servidor. Eu uso Postman como um cliente API para testar meus endpoints de API, mas você pode usar qualquer ferramenta que desejar.
Você pode ir em frente e adicionar mais livros:
Vamos também obter a saída AB usando Ferramenta de benchmarking Apache . Se você não sabe como instalar esta ferramenta, coloquei um link na seção de recursos abaixo.
A saída AB:
É interessante notar que em nosso simples amostra aqui, cada solicitação (bem-sucedida ou não) leva em média quase três segundos para fazer uma viagem de ida e volta e atende a aproximadamente quatro solicitações por segundo. Em um aplicativo do mundo real, você gostaria de criar estratégias para melhorar esses números para que os usuários não tenham problemas com a capacidade de resposta do seu aplicativo quando o tráfego aumentar.
Isso é bom até agora. Agora, vamos reexecutar o comando–prof-process e tentar analisar o relatório.
Execute o seguinte em seu terminal:
NODE_ENV=production node–prof index.js node-prof-process isolate-000001E540DA5730-19636-v8.log
Neste ponto, você deve ser capaz de ler, analisar e implementar soluções se houver algum gargalo.
Conclusão
O criador de perfil Node.js embutido é o mais fácil e adequado para criar o perfil de seu Node.js aplicativos. Neste artigo, discutimos por que a criação de perfil é importante e como usar os sinalizadores–prof e–prof-process para depurar gargalos.
Espero que você tenha aprendido algo novo lendo isso. Se você tiver dúvidas ou sugestões, coloque-as na seção de comentários.