Обзор тестирования с помощью нагружающих акторов

Тестирование производительности системы является важным этапом добавления изменений в ядро YDB. С помощью нагрузочного тестирования вы можете:

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

Сама по себе задача нагрузить высокопроизводительную распределенную систему является нетривиальной. Часто разработчику приходится запускать несколько инстансов клиента, чтобы добиться требуемой загрузки сервера. YDB реализует простой и удобный механизм подачи нагрузки — нагружающие акторы. Акторы создаются и запускаются в самом кластере, таким образом не нужно привлекать дополнительные ресурсы для запуска клиентов. Нагружающие акторы могут быть запущены на произвольных узлах кластера — на одном, на всех или только на выбранных. Вы можете создать любое количество акторов на любом из узлов.

Нагружающие акторы позволяют тестировать как систему в целом, так отдельные ее компоненты:

PDisk
PDisk
VDisk
VDisk
Device
Device
Key-value
Tablet
Key-value...
Distributed Storage Proxy
Distributed Storage Proxy
Data Shard
Tablet
Data Shard...
Query Processor
Query Processor
VDisk
VDisk
PDisk
PDisk
Distributed Storage Group
Distributed Storage Group
KqpLoad
KqpLoad
KeyValueLoad
KeyValueLoad
StorageLoad
StorageLoad
VDiskLoad
VDiskLoad
PDiskWriteLoad, PDiskReadLoad, PDiskLogLoad
PDiskWriteLoad, PDis...
Load actors
Load actors
YDB components
YDB components
Device
Device
Text is not SVG - cannot display

Например, вы можете подать нагрузку на Distributed Storage без задействования слоев таблеток и Query Processor. Таким образом можно изолированно тестировать отдельные слои системы и эффективно находить узкие места. Комбинация акторов разных типов позволяет запускать множество видов нагрузки.

Примечание

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

Типы акторов

Тип Описание
KqpLoad Подает нагрузку на слой Query Processor и нагружает все компоненты кластера.
KeyValueLoad Нагружает Key-value таблетку.
StorageLoad Нагружает Distributed Storage без задействования слоев таблеток и Query Processor.
VDiskLoad Тестирует производительность записи на VDisk.
PDiskWriteLoad Тестирует производительность записи на PDisk.
PDiskReadLoad Тестирует производительность чтения с PDisk.
PDiskLogLoad Тестирует корректность вырезания из середины лога PDisk.
MemoryLoad Аллоцирует память, полезен при тестировании логики.
Stop Останавливает все акторы, либо только указанные.

Запуск нагрузки

Запустить нагрузку можно с помощью следующих инструментов:

  • Embedded UI кластера — позволяет создать по конфигурации и запустить нагружающий актор либо на текущем узле, либо сразу на всех узлах тенанта.
  • Утилита ydbd — позволяет на любой узел кластера отправить конфигурацию актора с указанием, на каких узлах необходимо создать и запустить актор.

В качестве примера рассмотрим создание и запуск актора KqpLoad. Актор обращается к БД /slice/db как к key-value хранилищу в 64 потока, длительность нагрузки — 30 секунд. Перед началом работы актор создает необходимые таблицы, после окончания удаляет их. При создании актору будет автоматически присвоен тег. Этот же тег будет присвоен и результату теста.

  1. Откройте страницу управления нагружающими акторами на узле (например, http://<address>:8765/actors/load, где address — адрес узла кластера, на котором нужно запустить нагрузку).

  2. В поле ввода/вывода вставьте конфигурацию актора:

    KqpLoad: {
        DurationSeconds: 30
        WindowDuration: 1
        WorkingDir: "/slice/db"
        NumOfSessions: 64
        UniformPartitionsCount: 1000
        DeleteTableOnFinish: 1
        WorkloadType: 0
        Kv: {
            InitRowCount: 1000
            PartitionsByLoad: true
            MaxFirstKey: 18446744073709551615
            StringLen: 8
            ColumnsCnt: 2
            RowsCnt: 1
        }
    }
    
  3. Чтобы создать и запустить актор, нажмите кнопку:

    • Start new load on current node — нагрузка будет запущена на текущем узле.
    • Start new load on all tenant nodes — нагрузка будет запущена на всех узлах тенанта.

В поле ввода/вывода появится следующее сообщение:

{"status":"OK","tag":1}
  • status — статус запуска нагрузки;
  • tag — тег, который был присвоен нагрузке.
  1. Создайте файл с конфигурацией актора:

    NodeId: 1
    Event: {
        KqpLoad: {
            DurationSeconds: 30
            WindowDuration: 1
            WorkingDir: "/slice/db"
            NumOfSessions: 64
            UniformPartitionsCount: 1000
            DeleteTableOnFinish: 1
            WorkloadType: 0
            Kv: {
                InitRowCount: 1000
                PartitionsByLoad: true
                MaxFirstKey: 18446744073709551615
                StringLen: 8
                ColumnsCnt: 2
                RowsCnt: 1
            }
        }
    }
    
    • NodeId — идентификатор узла, на котором нужно запустить актор. Чтобы указать несколько узлов, перечислите их в отдельных строках:

      NodeId: 1
      NodeId: 2
      ...
      NodeId: N
      Event: {
      ...
      
    • Event — конфигурация актора.

  2. Запустите актор:

    ydbd load-test --server <endpoint> --protobuf "$(cat <proto_file>)"
    
    • endpoint — grpc-эндпоит узла (например, grpc://<address>:<port>, где address — адрес узла, port — grpc-порт узла).
    • proto_file — путь к файлу с конфигурацией актора.

Просмотр результата тестирования

Результаты тестирования можно просмотреть с помощью Embedded UI. Описание выводимых параметров смотрите в документации соответствующего актора.

  1. Откройте страницу управления нагружающими акторами на узле (например, http://<address>:<port>/actors/load, где address — адрес узла, port — http-порт мониторинга узла, на котором была запущена нагрузка).

  2. Нажмите кнопку Results.

    Будут отображены результаты завершенных тестирований. Найдите результат с соответствующим тегом.

    load-actors-finished-tests

Следующая