StorageLoad
Тестирует производительность записи и чтения с Distributed Storage. Нагрузка подается непосредственно на Distributed Storage без задействования слоев таблеток и Query Processor. При тестировании производительности записи актор записывает данные в указанную группу хранения. Для тестирования чтения актор предварительно записывает данные в указанную группу хранения, а потом читает их. После снятия нагрузки все данные, записанные актором, удаляются.
Вы можете подать нагрузку трех видов:
- Постоянная — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например,
WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }) и отличный от нуляMaxInFlightWriteRequests, при этом не задавайтеWriteHardRateDispatcher. - Интервальная — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например,
WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }) и не задавайтеWriteHardRateDispatcher. Максимальное число одновременно выполняемых запросов задается параметромInFlightWrites. Если его значение равно0, то ограничения нет. - С фиксированной частотой — актор запускает запросы через определенные промежутки времени, величина которых меняется таким образом, чтобы поддерживать определенную частоту запросов в секунду. Если продолжительность нагрузки ограничена параметром
DurationSeconds, то эта частота может отличаться в момент старта и в момент завершения нагрузки и будет изменяться равномерно на протяжении всего основного цикла нагрузки. Чтобы подать нагрузку этого вида, задайте описание параметров нагрузки с фиксированной частотой (параметрWriteHardRateDispatcher). Обратите внимание, что если в параметрах актора заданWriteHardRateDispatcher, то запустится нагрузка с фиксированной частотой, вне зависимости значенийWriteIntervals. Максимальное количество одновременно выполняемых запросов задается параметромInFlightWrites, если его значение равно0, то ограничения нет.
Параметры актора
Ниже описаны основные параметры актора. Полный список параметров смотрите в файле load_test.proto Git-репозитория YDB.
| Параметр | Описание |
|---|---|
DurationSeconds |
Продолжительность нагрузки. Таймер запускается после завершения начальной записи данных. |
Tablets |
Нагрузка подается от имени таблетки со следующими реквизитами:
|
WriteSizes |
Размер записываемых данных. Для каждого запроса выбирается случайным образом из интервала Min-Max. Вы можете задать несколько диапазонов WriteSizes, и тогда выбор значения из конкретного диапазона будет определяться его Weight. |
WriteHardRateDispatcher |
Описание параметров нагрузки с фиксированной частотой для запросов записи. Если задан этот параметр, то значение WriteIntervals игнорируется. |
WriteIntervals |
Описание параметров вероятностного распределения временных интервалов между записями для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов WriteIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight. |
MaxInFlightWriteRequests |
Максимальное количество одновременно обрабатываемых запросов на запись. |
ReadSizes |
Размер читаемых данных. Для каждого запроса выбирается случайным образом из интервала Min-Max. Вы можете задать несколько диапазонов ReadSizes, и тогда выбор значения из конкретного диапазона будет определяться его Weight. |
ReadIntervals |
Описание параметров вероятностного распределения временных интервалов между запросами для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов ReadIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight. |
ReadHardRateDispatcher |
Описание параметров нагрузки с фиксированной частотой для запросов чтения. Если задан этот параметр, то значение ReadIntervals игнорируется. |
MaxInFlightReadRequests |
Максимальное количество одновременно обрабатываемых запросов на чтение. |
FlushIntervals |
Описание параметров вероятностного распределения временных интервалов между запросами на удаление записанных основным циклом StorageLoad данных в микросекундах. Вы можете задать несколько диапазонов FlushIntervals, и тогда выбор значения из конкретного диапазона будет определяться его Weight. Одновременно будет обрабатываться только один запрос на удаление записанных данных. |
PutHandleClass |
Класс записи данных в дисковую подсистему. В случае TabletLog запись выполняется с максимальным приоритетом. |
GetHandleClass |
Класс чтения данных с дисковой подсистемы. В случае FastRead чтение выполняется с максимальной скоростью. |
InitialAllocation |
Описание параметров начальной записи данных. Определяет объем данных, который будет записан до старта основной нагрузки, и которые затем могут быть прочитаны запросами чтения, наряду с данными, записанными в основном цикле нагрузки. |
Write requests class
| Class | Description |
|---|---|
TabletLog |
Самый высокий приоритет запросов записи. |
AsyncBlob |
Используется для записи таблиц SSTable и их частей. |
UserData |
Используется для записи пользовательских данных отдельными блобами. |
Read requests class
| Class | Description |
|---|---|
AsyncRead |
Используется для чтения данных таблеток, прошедших процесс компакшена. |
FastRead |
Используется для быстрого чтения пользовательских данных. |
Discover |
Чтения запросов Discover. |
LowRead |
Низкоприоритетные чтения, выполняемые на фоне. |
Параметры вероятностного распределения
Интервал, записанный в виде repeated-поля TIntervalInfo, вычисляется по следующему алгоритму:
- случайным образом выбирается элемент из массива
TIntervalInfoс вероятностью, пропорциональной весу; - для элемента типа
TIntervalUniformравновероятно выбирается значение в интервалеMin-Max(если указаноMinMs/MaxMs, то значение в миллисекундах; еслиMinUs/MaxUs— в микросекундах); - для элемента типа
TIntervalPoissonвыбирается интервал по формулеMin(log(-x / Frequency), MaxIntervalMs), гдеx— случайное значение в интервале[0, 1], что обеспечивает соответствие интервалов распределению Пуассона с частотойFrequency, но с интервалом не большеMaxIntervalMs.
Аналогичный механизм применяется и для вероятностного распределения размеров записываемых данных, за исключением того, что в том механизме есть только равновероятное распределение размера [Min, Max].
Параметры нагрузки с фиксированной частотой
| Параметр | Описание |
|---|---|
RequestsPerSecondAtStart |
Частота запросов в секунду в момент старта нагрузки. Если продолжительность нагрузки не задана, то частота запросов остается постоянной и равной величине этого параметра. |
RequestsPerSecondOnFinish |
Частота запросов в секунду в момент завершения нагрузки. |
Параметры начальной записи данных
| Параметр | Описание |
|---|---|
TotalSize |
Суммарный размер записанных данных. Этот параметр и BlobsNumber – взаимосключающие. |
BlobsNumber |
Количество записанных блобов. |
BlobSizes |
Размер записываемых блобов. Для каждого запроса выбирается случайным образом из интервала Min-Max. Вы можете задать несколько диапазонов BlobSizes, и тогда выбор значения из конкретного диапазона будет определяться его Weight. |
MaxWritesInFlight |
Максимальное количество одновременно обрабатываемых запросов на запись. Если парамаетр не задан, то ограничения на количество одновременно обрабатываемых запросов нет. |
MaxWriteBytesInFlight |
Максимальный суммарный объем данных одновременно обрабатываемых запросов на запись. Если парамаетр не задан, то ограничения на суммарный объем данных одновременно обрабатываемых запросов нет. |
PutHandleClass |
Класс записи данных в дисковую подсистему. |
DelayAfterCompletionSec |
Время в секундах, которое актор ждет от момента завершения начальной записи данных до момента старта основной нагрузки. Если параметр не задан, нагрузка начнется сразу же после завершения начальной записи данных. |
Примеры
Нагрузка на запись
Следующий актор будет писать в группу с идентификатором 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.
Нагрузка только на чтение
До старта основной нагрузки записывается блок данных, объемом 1 GB, состоящий из блобов размером от 1 MB до 5 MB. Чтобы не перегрузить систему запросами записи, количество одновременно выполняемых запросов ограничивается 5. После завершения записи этого блока запускается readonly нагрузка с возрастающей частотой: с 10 до 50 запросов в секунду, частота возрастает равномерно на протяжении 300 секунд.
StorageLoad: {
DurationSeconds: 300
Tablets: {
Tablets: { TabletId: 5000 Channel: 0 GroupId: 2181038080 Generation: 1 }
MaxInFlightReadRequests: 10
GetHandleClass: FastRead
ReadHardRateDispatcher {
RequestsPerSecondAtStart: 10
RequestsPerSecondOnFinish: 50
}
InitialAllocation {
TotalSize: 1000000000
BlobSizes: { Weight: 1.0 Min: 1000000 Max: 5000000 }
MaxWritesInFlight: 5
}
}
}
Рассчитанные перцентили скорости чтения/записи относятся только к запросам основного цикла нагрузки, запросы начальной записи в них не учитываются. Представляют интерес графики в Monitoring, например, по ним можно проследить, как ухудшается время отклика системы по мере роста нагрузки.