StorageLoad

Тестирует производительность записи и чтения с Distributed Storage. Нагрузка подается непосредственно на Distributed Storage без задействования слоев таблеток и Query Processor. При тестировании производительности записи актор записывает данные в указанную группу VDisk. Для тестирования чтения актор предварительно записывает данные в указанную группу VDisk, а потом читает их. После снятия нагрузки все данные, записанные актором, удаляются.

Вы можете подать нагрузку двух видов:

  • Постоянная — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }) и отличный от нуля MaxInFlightWriteRequests.
  • Интервальная — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }). Максимальное число одновременно выполняемых запросов задается параметром InFlightReads. Если его значение равно 0, то ограничения нет.

Параметры актора

Ниже описаны основные параметры актора. Полный список параметров смотрите в файле load_test.proto Git-репозитория YDB.

Параметр Описание
DurationSeconds Продолжительность нагрузки.
Tablets Нагрузка подается от имени таблетки со следующими реквизитами:
  • TabletId — идентификатор таблетки. Должен быть уникальным для каждого нагружающего актора.
  • Channel — канал таблетки.
  • GroupId — идентификатор группы VDisk'ов, на которую будет подана нагрузка.
  • Generation — поколение таблетки.
WriteSizes Размер записываемых данных. Для каждого запроса выбирается случайным образом из интервала Min-Max. Вы можете задать несколько диапазонов WriteSizes, и тогда выбор значения из конкретного диапазона будет определяться его Weight.
WriteIntervals Описание параметров вероятностного распределения временных интервалов между записями для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов WriteIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight.
MaxInFlightWriteRequests Максимальное количество одновременно обрабатываемых запросов на запись.
ReadSizes Размер читаемых данных. Для каждого запроса выбирается случайным образом из интервала Min-Max. Вы можете задать несколько диапазонов ReadSizes, и тогда выбор значения из конкретного диапазона будет определяться его Weight.
ReadIntervals Описание параметров вероятностного распределения временных интервалов между запросами для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов ReadIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight.
MaxInFlightReadRequests Максимальное количество одновременно обрабатываемых запросов на чтение.
FlushIntervals Описание параметров вероятностного распределения временных интервалов между запросами на удаление записанных StorageLoad данных в микросекундах. Вы можете задать несколько диапазонов FlushIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight.
PutHandleClass Класс записи данных в дисковую подсистему. В случае TabletLog запись выполняется с максимальным приоритетом.
GetHandleClass Класс чтения данных с дисковой подсистемы. В случае FastRead чтение выполняется с максимальной скоростью.

Параметры вероятностного распределения

Интервал, записанный в виде repeated-поля TIntervalInfo, вычисляется по следующему алгоритму:

  • случайным образом выбирается элемент из массива TIntervalInfo с вероятностью, пропорциональной весу;
  • для элемента типа TIntervalUniform равновероятно выбирается значение в интервале Min-Max (если указано MinMs/MaxMs, то значение в миллисекундах; если MinUs/MaxUs — в микросекундах);
  • для элемента типа TIntervalPoisson выбирается интервал по формуле Min(log(-x / Frequency), MaxIntervalMs), где x — случайное значение в интервале [0, 1], что обеспечивает соответствие интервалов распределению Пуассона с частотой Frequency, но с интервалом не больше MaxIntervalMs.

Аналогичный механизм применяется и для вероятностного распределения размеров записываемых данных, за исключением того, что в том механизме есть только равновероятное распределение размера [Min, Max].

Примеры

Нагрузка на запись

Следующий актор будет писать в группу с идентификатором 2181038080 в течение 60 секунд. Размер одной записи 4096 байт, число одновременно выполняемых запросов не более 256 (постоянная нагрузка):

StorageLoad: {
    DurationSeconds: 60
    Tablets: {
        Tablets: { TabletId: 1000 Channel: 0 GroupId: 2181038080 Generation: 1 }
        WriteSizes: { Weight: 1.0 Min: 4096 Max: 4096 }
        WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }
        MaxInFlightWriteRequests: 256
        FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } }
        PutHandleClass: TabletLog
    }
}

При просмотре результата тестирования наибольший интерес представляют следующие значения:

  • Writes per seconds — количество записей в секунду, например 28690.29.
  • Speed@ 100% — 100 перцентиль скорости записи в МБ/с, например 108.84.

Нагрузка на чтение

Чтобы подать нагрузку на чтение, необходимо сначала записать данные. Данные записываются запросами по 4096 байт каждые 50 мс, при этом число одновременно выполняемых запросов не более 1 (интервальная нагрузка). Если запрос не успеет завершиться за 50 мс, актор дождется его завершения и через 50 мс запустит следующий запрос. Данные старше 10 с удаляются. Чтение данных выполнятся запросами по 4096 байт, число одновременно выполняемых запросов 16 (постоянная нагрузка):

StorageLoad: {
    DurationSeconds: 60
    Tablets: {
        Tablets: { TabletId: 5000 Channel: 0 GroupId: 2181038080 Generation: 1 }
        WriteSizes: { Weight: 1.0 Min: 4096 Max: 4096}
        WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }
        MaxInFlightWriteRequests: 1

        ReadSizes: { Weight: 1.0 Min: 4096 Max: 4096 }
        ReadIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }
        MaxInFlightReadRequests: 16
        FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } }
        PutHandleClass: TabletLog
        GetHandleClass: FastRead
    }
}

При просмотре результата тестирования наибольший интерес представляют следующие значение:

  • ReadSpeed@ 100% — 100 перцентиль скорости чтения МБ/с, например 60.86.