Профилирование базы данных

Оценивайте производительность Firebase Realtime Database с помощью инструмента профилирования баз данных, встроенного в Firebase CLI. Профайлер регистрирует все действия в базе данных за определенный период времени, а затем создает подробный отчет. Подробный отчет позволяет устранять неполадки с производительностью базы данных, выявлять проблемные области и сокращать количество неиндексированных запросов.

Создайте профиль

  1. Прежде чем начать профилирование Firebase Realtime Database, убедитесь, что вы используете последнюю версию Firebase CLI и инициализировали ее для базы данных и проекта, которые хотите профилировать. Обратите внимание, что для профилирования вы должны быть редактором или владельцем этого проекта.

  2. Запустите профилирование базы данных с помощью следующей команды:

    firebase database:profile
    Профилировщик будет показывать сообщения о статусе, пока он записывает операции из базы данных и создает профиль.

  3. Нажмите Ввод, чтобы завершить создание профиля и посмотреть результаты.

Как интерпретировать результаты

Инструмент профилирования агрегирует собранные данные об операциях в базе данных и показывает результаты в трех основных категориях: скорость, пропускная способность и неиндексированные запросы.

Скорость

В отчете о скорости указывается время ответа сервера (в миллисекундах) для каждого типа операции. Однако скорость, указанная в отчете о скорости, может не отражать реальную скорость, которую видят конечные пользователи. Различные факторы, в том числе состояние сети, могут увеличить задержку на стороне клиента.

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

  • Путь. Путь в базе данных, по которому выполнялись операции. Если дочерних узлов больше 25, инструмент профилирования сворачивает их в родительский путь и добавляет маркер $wildcard. В отчете может быть указан корневой каталог базы данных, обозначенный косой чертой /.
  • Количество. Количество операций, выполненных по указанному пути.
  • Средняя скорость выполнения. Среднее время, которое требуется серверу для выполнения бизнес-логики, необходимой для обработки определенного типа операции по этому пути. Временной интервал, измеряемый здесь, начинается после интервала, измеряемого показателем "Среднее время ожидания", описанным ниже.
  • Среднее время ожидания. Среднее время, в течение которого запросы находятся в очереди перед выполнением. Такая задержка характерна для всех запросов, инициированных клиентом. Общая задержка запроса на стороне сервера примерно равна сумме времени ожидания и скорости выполнения этого запроса.
  • Доступ запрещен. Количество операций по указанному пути, которые были заблокированы правилами Firebase Database в вашей базе данных.
Отчет о скорости по типу операции
Чтение данных о скорости выполнения Время ответа сервера на запросы клиентов о чтении данных из базы данных. Время выполнения чтения обычно зависит от объема считываемых данных, но даже некоторые небольшие операции чтения могут задерживаться из-за предварительной выборки кэша.
Скорость выполнения записи Время ответа сервера на запросы клиента о записи данных в базу данных. Время выполнения записи зависит от объема записываемых данных.
Скорость выполнения подключения Время ответа сервера на запросы, отправленные клиентам базы данных. Задержка запросов на подключение в основном связана с серверным учетом в памяти, относящимся к управлению подключениями.
Скорость выполнения трансляции

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

Свойство Count в отчете о скорости трансляции показывает количество трансляций, а не количество клиентов, получивших информацию. Например, если 10 клиентов прослушивали определенный путь и сервер передал обновление всем 10 клиентам, количество трансляций отражает только одну трансляцию, несмотря на то, что данные получили 10 клиентов.

Свойство Permission Denied не включено в отчет о скорости трансляции.

Пропускная способность

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

Отчет о пропускной способности содержит следующие свойства:

  • Путь. Путь в базе данных, по которому выполнялись операции. Если дочерних узлов больше 25, инструмент профилирования сворачивает их в родительский путь.

  • Всего. Общее количество исходящих или входящих байтов, использованных во всех операциях по указанному пути.

  • Количество. Число операций, выполненных по указанному пути.

  • Среднее. Среднее количество скачанных или загруженных байтов по всем операциям по указанному пути (байты/запись или байты/чтение).

Отчет о пропускной способности
Скачанные байты Данные, полученные в результате операций чтения и трансляции, отправленных через клиентские SDK и REST API.
Загружено байт Данные, потребляемые через запросы на запись, поступающие на сервер базы данных. Удаления отображаются как записи с 0 байтов в разделе "Входящие".

Непроиндексированные запросы

Неиндексированные запросы могут быть дорогостоящими, поскольку клиенты скачивают все данные в определенном местоположении, а затем выполняют запросы к ним. Это приводит к неоправданному увеличению трафика. Чтобы оптимизировать производительность базы данных, устраните как можно больше неиндексированных запросов.

В отчете "Неиндексированные запросы" представлены следующие свойства:

  • Путь. Путь в базе данных, по которому выполнялись неиндексированные запросы.
  • Индекс. Правило, которое нужно добавить, чтобы решить проблему с неиндексируемыми запросами. Подробнее об индексировании читайте в статье Индексирование данных.
  • Количество. Число неиндексированных запросов, выполненных по указанному пути.

Расширенное профилирование

Чтобы увидеть все операции, которые обрабатывает база данных, используйте флаг --raw при профилировании базы данных, как показано ниже:

firebase database:profile --raw

Необработанные выходные данные также включают информацию о клиенте для каждой операции, например строки userAgent и IP-адреса. Подробнее о различных операциях, профилированных в Firebase Realtime Database, рассказывается в статье Типы операций Firebase Realtime Database.

Инструмент профилирования не предназначен для работы с платежами

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

Ниже приведены некоторые распространенные примеры сетевого трафика, оплачиваемого Firebase, которые не отражены в профиле базы данных.

  • Избыточность протокола. Для установления и поддержания сеанса требуется дополнительный трафик между сервером и клиентами. В зависимости от используемого протокола этот трафик может включать в себя: избыточные данные протокола реального времени Firebase Realtime Database, избыточные данные WebSocket и избыточные данные заголовка HTTP. Каждый раз, когда устанавливается соединение, эти накладные расходы, а также расходы на SSL-шифрование, увеличивают стоимость соединения. Обычно это не требует большой пропускной способности, но может быть существенным, если полезная нагрузка невелика или вы часто устанавливаете кратковременные соединения.
  • Дополнительные расходы на шифрование SSL. Для обеспечения безопасного соединения требуется шифрование SSL, которое связано с дополнительными расходами. В среднем это около 3,5 КБ для первоначального рукопожатия и около 40 Б для заголовков записей TLS в каждом исходящем сообщении. Для большинства приложений это небольшая часть счета. Однако эта доля может быть и выше, если в вашем случае требуется много SSL-рукопожатий. Например, устройства, которые не поддерживают билеты сеансов TLS, могут требовать большого количества подтверждений SSL-подключения.

Подробнее о том, как рассчитывается стоимость подписки…