Начиная с разработчика программного обеспечения, рекомендуется придерживаться более прагматичного подхода к разработке программного обеспечения.

Со временем, когда вы начинаете создавать более сложное программное обеспечение, которое обслуживает тысячи или миллионы пользователей, становится крайне важно уделять больше внимания таким понятиям, как архитектура, проектирование системы, тестирование, безопасность, развертывание и, особенно, производительность. Кроме того, в отношении производительности принято следовать ключевым показателям производительности, таким как среднее время отклика, скорость трафика и загрузка ЦП вашего приложения и сервера.

Основная проблема теперь связана с приобретением лучшего инструмента профилировщика, который измеряет Node.js производительность приложений. 

N. B., Профилирование ЦП и мониторинг ЦП часто используются взаимозаменяемо, но отличаются друг от друга.

В этой статье вы узнаете о встроенном средстве профилирования, рекомендованном в Node.js.

Почему профилирование?

Профилирование-это сбор и анализ данных о том, как функции в вашем коде выполняются при выполнении, в отношении параметров измерения производительности, таких как временная сложность, пропускная способность, входные рабочие нагрузки, сборка мусора и время для вызова и выполнения функции.

Цель здесь-выявить узкие места в вашем коде. Узкие места возникают, когда строка/блок кода или функция выполняются не так хорошо, как остальная часть программы. Некоторые из этих узких мест могут быть очевидны, но большинство из них не так велики.

Таким образом, по сути, профилировщик говорит вам: “Эй, не напрягайтесь, пытаясь угадать, где скрывается ошибка, замедляющая работу вашего приложения. Позвольте мне помочь вам сделать это программно".

Давайте рассмотрим функции обработчика в controllers/bookController.js.

//controllers/bookController.js
const boom = require('boom')
const Book = require('../models/Book')
// get all books
exports.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)
  }
}
// get a single book by 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)
  }
}
// add a new book
exports.addNewBook = async (req, reply) => {
  try {
    const book = new Book(req.body)
    const newBook = await book.save()
    return reply.code(200)
      .send({
        Message: "New Book added successfully",
        data: newBook
      })
  }
    catch (err) {
      throw boom.boomify(err)
    }
}
// edit a book
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: "Book updated successfully",
        data: updatedBook
      })
  } catch (err) {
    throw boom.boomify(err)
  }
}
// delete a book
exports.deleteBook = async (req, reply) => {
  try {
    const id = req.params.id
    const deletedBook = await Book.findByIdAndDelete(id);
    return reply.code(200)
      .send({
        Message: `${deletedBook.title} has been deleted successfully`,
        data: id
      })
  } catch (err) {
    throw boom.boomify(err)
  }
}

Вы могли бы добавить некоторые данные в MongoDB следующим образом:

> db.user.insert({ title: "The book for old people", genre: "Self Help" })

Мы добавляем некоторые данные, которые помогут нам смоделировать сценарий, в котором у пользователей возникают проблемы с задержкой при отправке запросов в ваше приложение. Таким образом, вы можете продолжить и создать как можно больше данных в базе данных.

Выполните эту команду на своем терминале:

node --prof controllers/bookController.js

Эта команда создает файл журнала isolate-0xnnnnnnnnn-v8.log (где n-цифра), и он должен выглядеть следующим образом:

 

 

Нечитабельно, верно? Вот поэтому мы запустим флаг --proof-process, чтобы скрыть этот файл журнала в более читаемый файл.

Выполните эту команду на своем терминале:

node --prof-process isolate-000001EFE5017350-7076-v8.log > processed.txt

Это создаст processed.txt файл, содержащий журналы.

Давайте рассмотрим журналы, начиная с раздела "Сводка".

 

 

Это показывает, что 97 процентов собранных образцов были получены из общих библиотек. Поэтому давайте сосредоточимся на разделе [Shared Libraries] и проигнорируем остальное.

 

 

Мы видим, что 89 процентов CPU занимает Node.js среда выполнения и 8 процентов функций ядра Windows. Кроме того, это ясно показывает, что профилирование кода на локальном сервере разработки не является идеальным. Предпочтительнее запускать тесты с HTTP-сервера. Итак, давайте смоделируем производственную среду с помощью Ngrok.

Ngrok позволяет создавать общедоступные URL-адреса для предоставления доступа к веб-серверу разработки.

Типичный URL-адрес Ngrok выглядит следующим образом http://873acd0acf28.ngrok.io.

Теперь мы больше не полагаемся на Node.js и ядра ОС для запуска нашего серверных узлов. Мы снова запустим атрибут --prof. Во-первых, добавьте некоторую нагрузку на сервер. Я использую Postman в качестве клиента API для тестирования своих конечных точек API, но вы можете использовать любой инструмент, который захотите.

 

 

Вы можете продолжить и добавить больше книг:

 

 

Давайте также получим выходные данные AB с помощью инструмента сравнительного анализа Apache.

Вывод AB:

 

 

Интересно отметить, что в нашем простом примере здесь каждый запрос (успешный или нет) в среднем занимает почти три секунды, чтобы совершить поездку туда и обратно, и обслуживает примерно четыре запроса в секунду. В реальном приложении вам бы хотелось разработать стратегии для улучшения этих показателей, чтобы у пользователей не возникало проблем с отзывчивостью вашего приложения при увеличении трафика.

Пока это хорошо. Теперь давайте повторно запустим команду --prof-process и попробуем проанализировать отчет.

Выполните следующие действия на своем терминале:

NODE_ENV=production node --prof index.js
node --prof-process isolate-000001E540DA5730-19636-v8.log

Вывод

Встроенный Node.js профилировщик является самым простым и наиболее подходящим для профилирования вашего Node.js приложения. В этой статье мы обсудили, почему профилирование важно и как использовать флаги --prof и --prof-process для отладки узких мест.

Мы надеемся, что вы узнали что-то новое, прочитав эту статью.

SkillPass.