diff --git a/ydb/docs/en/core/development/load-actors-storage.md b/ydb/docs/en/core/development/load-actors-storage.md index e9bb087121f5..b36d6354c38f 100644 --- a/ydb/docs/en/core/development/load-actors-storage.md +++ b/ydb/docs/en/core/development/load-actors-storage.md @@ -1,11 +1,12 @@ # StorageLoad -Tests the read/write performance to and from Distributed Storage. The load is generated on Distributed Storage directly without using any tablet and Query Processor layers. When testing write performance, the actor writes data to the specified VDisk group. To test read performance, the actor first writes data to the specified VDisk group and then reads the data. After the load is removed, all the data written by the actor is deleted. +Tests the read/write performance to and from Distributed Storage. The load is generated on Distributed Storage directly without using any tablet and Query Processor layers. When testing write performance, the actor writes data to the specified storage group. To test read performance, the actor first writes data to the specified storage group and then reads the data. After the load is removed, all the data written by the actor is deleted. -You can generate two types of load: +You can generate three types of load: -* _Continuous_: The actor ensures the specified number of requests are run concurrently. To generate a continuous load, set a zero interval between requests (e.g., `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }`), while keeping the `MaxInFlightWriteRequests` parameter value different from zero. -* _Interval_: The actor runs requests at preset intervals. To generate an interval load, set a non-zero interval between requests, e.g., `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }`. Maximum number of in-flight requests is set by the `InFlightReads` parameter. If its value is `0`, their number is unlimited. +* _Continuous_: The actor ensures that the specified number of requests are running concurrently. To generate a continuous load, set a zero interval between requests (e.g., `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }`), while keeping the `MaxInFlightWriteRequests` parameter value different from zero and omit the `WriteHardRateDispatcher` parameter. +* _Interval_: The actor runs requests at specific intervals. To generate an interval load, set a non-zero interval between requests, e.g., `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }` and don't set the `WriteHardRateDispatcher` parameter. The maximum number of in-flight requests is set by the `InFlightWrites` parameter (0 means unlimited). +* _Hard rate_: The actor runs requests at certain intervals, but the interval length is adjusted to maintain a configured request rate per second. If the duration of the load is limited by `LoadDuration` than the request rate may differ between start and finish of the workload and will adjust gradually throughout all the main load cycle. To generate a load of this type, set the [parameters of hard rate load](#hardRateDispatcher) (parameter `WriteHardRateDispatcher`). Note that if this parameter is set, the hard rate type of load will be launched, regardless the value of the `WriteIntervals` parameter. The maximum number of in-flight requests is set by the `InFlightWrites` parameter (0 means unlimited). ## Actor parameters {#options} @@ -13,22 +14,61 @@ You can generate two types of load: | Parameter | Description | --- | --- -| ` DurationSeconds` | Load duration. | -| ` Tablets` | The load is generated on behalf of a tablet with the following parameters: | -| ` WriteSizes` | Size of the data to write. It is selected randomly for each request from the `Min`-`Max` range. You can set multiple `WriteSizes` ranges, in which case a value from a specific range will be selected based on its `Weight`. | -| ` WriteIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals between the records loaded at intervals (in milliseconds). You can set multiple `WriteIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. | -| ` MaxInFlightWriteRequests` | Maximum number of simultaneously processed write requests. | -| ` ReadSizes` | Size of the data to read. It is selected randomly for each request from the `Min`-`Max` range. You can set multiple `ReadSizes` ranges, in which case a value from a specific range will be selected based on its `Weight`. | -| ` ReadIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals between the queries loaded by intervals (in milliseconds). You can set multiple `ReadIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. | -| ` MaxInFlightReadRequests` | Maximum number of simultaneously processed read requests. | -| ` FlushIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals (in microseconds) between the queries used to delete data written by the StorageLoad actor. You can set multiple `FlushIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. | -| ` PutHandleClass` | Class of data writes to the disk subsystem. If the `TabletLog` value is set, the write operation has the highest priority. | -| ` GetHandleClass` | Class of data reads from the disk subsystem. If the `FastRead` is set, the read operation is performed with the highest speed possible. | +| `DurationSeconds` | Load duration. The timer starts upon completion of the initial data allocation. | +| `Tablets` | The load is generated on behalf of a tablet with the following parameters: | +| `WriteSizes` | Size of the data to write. It is selected randomly for each request from the `Min`-`Max` range. You can set multiple `WriteSizes` ranges, in which case a value from a specific range will be selected based on its `Weight`. | +| `WriteHardRateDispatcher` | Setting up the [parameters of load with hard rate](#hardRateDispatcher) for write requests. If this parameter is set than the value of `WriteIntervals` is ignored. | +| `WriteIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals between the records loaded at intervals (in milliseconds). You can set multiple `WriteIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. | +| `MaxInFlightWriteRequests` | The maximum number of write requests being processed simultaneously. | +| `ReadSizes` | Size of the data to read. It is selected randomly for each request from the `Min`-`Max` range. You can set multiple `ReadSizes` ranges, in which case a value from a specific range will be selected based on its `Weight`. | +| `WriteHardRateDispatcher` | Setting up the [parameters of load with hard rate](#hardRateDispatcher) for read requests. If this parameter is set than the value of `ReadIntervals` is ignored. | +| `ReadIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals between the queries loaded by intervals (in milliseconds). You can set multiple `ReadIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. | +| `MaxInFlightReadRequests` | The maximum number of read requests being processed simultaneously. | +| `FlushIntervals` | Setting up the [parameters for probabilistic distribution](#params) of intervals (in microseconds) between the queries used to delete data written by the write requests in the main load cycle of the StorageLoad actor. You can set multiple `FlushIntervals` ranges, in which case a value from a specific range will be selected based on its `Weight`. Only one flush request will be processed concurrently. | +| `PutHandleClass` | [Class of data writes](#writeClass) to the disk subsystem. If the `TabletLog` value is set, the write operation has the highest priority. | +| `GetHandleClass` | [Class of data reads](#readClass) from the disk subsystem. If the `FastRead` is set, the read operation is performed with the highest speed possible. | +| `Initial allocation` | Setting up the [parameters for initial data allocation](#initialAllocation). It defines the amount of data to be written before the start of the main load cycle. This data can be read by read requests along with the data written in the main load cycle. | + +### Write requests class {#writeClass} +| Class | Description | +--- | --- +| `TabletLog` | The highest priority of write operation. | +| `AsyncBlob` | Used for writing SSTables and their parts. | +| `UserData` | Used for writing user data as separate blobs. | + +### Read requests class {#readClass} +| Class | Description | +--- | --- +| `AsyncRead` | Used for reading compacted tablets' data. | +| `FastRead` | Used for fast reads initiated by user. | +| `Discover` | Reads from Discover query. | +| `LowRead` | Low priority reads executed on the background. | ### Parameters of probabilistic distribution {#params} {% include [load-actors-params](../_includes/load-actors-interval.md) %} +### Parameters of load with hard rate {#hardRateDispatcher} + +| Parameter | Description | +--- | --- +| `RequestRateAtStart` | Requests per second at the moment of load start. If load duration limit is not set then the request rate will remain the same and equal to the value of this parameter. | +| `RequestRateOnFinish` | Requests per second at the moment of load finish. | + +### Parameters of initial data allocation {#initialAllocation} + +| Parameter | Description | +--- | --- +| `TotalSize` | Total size of allocated data. This parameter and `BlobsNumber` are mutually exclusive. | +| `BlobsNumber` | Total number of allocated blobs. | +| `BlobSizes` | Size of the blobs to write. It is selected randomly for each request from the `Min`-`Max` range. You can set multiple `WriteSizes` ranges, in which case a value from a specific range will be selected based on its `Weight`. | +| `MaxWritesInFlight` | Maximum number of simultaneously processed write requests. If this parameter is not set then the number of simultaneously processed requests is not limited. | +| `MaxWriteBytesInFlight` | Maximum number of total amount of simultaneously processed write requests' data. If this parameter is not set then the total amount of data being written concurrently is unlimited. | +| `PutHandleClass` | [Class of data writes](#writeClass) to the disk subsystem. | +| `DelayAfterCompletionSec` | The amount of time in seconds the actor will wait upon completing the initial data allocation before starting the main load cycle. If its value is `0` or not set the load will start immediately after the completion of the data allocaion. | + +{% include [load-actors-params](../_includes/load-actors-interval.md) %} + ## Examples {#examples} ### Write load {#write} @@ -51,8 +91,8 @@ StorageLoad: { When viewing test results, the following values should be of most interest to you: -* ` Writes per second`: Number of writes per second, e.g., `28690.29`. -* ` Speed@ 100%`: 100 percentile of write speed in MB/s, e.g., `108.84`. +* `Writes per second`: Number of writes per second, e.g., `28690.29`. +* `Speed@ 100%`: 100 percentile of write speed in MB/s, e.g., `108.84`. ### Read load {#read} @@ -79,4 +119,31 @@ StorageLoad: { When viewing test results, the following value should be of most interest to you: -* ` ReadSpeed@ 100%`: 100 percentile of read speed in MB/s, e.g., `60.86`. +* `ReadSpeed@ 100%`: 100 percentile of read speed in MB/s, e.g., `60.86`. + +### Read only {#readonly} + +Before the start of the main load cycle the `1 GB` data block of blobs with sizes between `1 MB` and `5 MB` is allocated. To avoid overloading the system with write requests the number of simultaneously processed requests is limited by the value of `5`. After completing the initial data allocation the main cycle is launched. It consists of read requests sent with increasing rate: from `10` to `50` requests per second, the rate will increase gradually for `300` seconds. + +```proto +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 + } + } +} +``` +Calculated percentiles will only represent the requests of the main load cycle and won't include write requests sent during the initial data allocation. The [graphs in Monitoring](../administration/grafana-dashboards.md) should be of interest, for example, they allow to trace the request latency degradation caused by the increasing load. diff --git a/ydb/docs/ru/core/development/load-actors-storage.md b/ydb/docs/ru/core/development/load-actors-storage.md index 2d4cda784972..54a94d696bbb 100644 --- a/ydb/docs/ru/core/development/load-actors-storage.md +++ b/ydb/docs/ru/core/development/load-actors-storage.md @@ -1,11 +1,12 @@ # StorageLoad -Тестирует производительность записи и чтения с Distributed Storage. Нагрузка подается непосредственно на Distributed Storage без задействования слоев таблеток и Query Processor. При тестировании производительности записи актор записывает данные в указанную группу VDisk. Для тестирования чтения актор предварительно записывает данные в указанную группу VDisk, а потом читает их. После снятия нагрузки все данные, записанные актором, удаляются. +Тестирует производительность записи и чтения с Distributed Storage. Нагрузка подается непосредственно на Distributed Storage без задействования слоев таблеток и Query Processor. При тестировании производительности записи актор записывает данные в указанную группу хранения. Для тестирования чтения актор предварительно записывает данные в указанную группу хранения, а потом читает их. После снятия нагрузки все данные, записанные актором, удаляются. -Вы можете подать нагрузку двух видов: +Вы можете подать нагрузку трех видов: -* _Постоянная_ — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }`) и отличный от нуля `MaxInFlightWriteRequests`. -* _Интервальная_ — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }`). Максимальное число одновременно выполняемых запросов задается параметром `InFlightReads`. Если его значение равно `0`, то ограничения нет. +* _Постоянная_ — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }`) и отличный от нуля `MaxInFlightWriteRequests`, при этом не задавайте `WriteHardRateDispatcher`. +* _Интервальная_ — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }`) и не задавайте `WriteHardRateDispatcher`. Максимальное число одновременно выполняемых запросов задается параметром `InFlightWrites`. Если его значение равно `0`, то ограничения нет. +* _С фиксированной частотой_ — актор запускает запросы через определенные промежутки времени, величина которых меняется таким образом, чтобы поддерживать определенную частоту запросов в секунду. Если продолжительность нагрузки ограничена параметром `DurationSeconds`, то эта частота может отличаться в момент старта и в момент завершения нагрузки и будет изменяться равномерно на протяжении всего основного цикла нагрузки. Чтобы подать нагрузку этого вида, задайте описание [параметров нагрузки с фиксированной частотой](#hardRateDispatcher) (параметр `WriteHardRateDispatcher`). Обратите внимание, что если в параметрах актора задан `WriteHardRateDispatcher`, то запустится нагрузка с фиксированной частотой, вне зависимости значений `WriteIntervals`. Максимальное количество одновременно выполняемых запросов задается параметром `InFlightWrites`, если его значение равно `0`, то ограничения нет. ## Параметры актора {#options} @@ -13,22 +14,60 @@ Параметр | Описание --- | --- -` DurationSeconds` | Продолжительность нагрузки. -` Tablets` | Нагрузка подается от имени таблетки со следующими реквизитами: -` WriteSizes` | Размер записываемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `WriteSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. -` WriteIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между записями для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов `WriteIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. -` MaxInFlightWriteRequests` | Максимальное количество одновременно обрабатываемых запросов на запись. -` ReadSizes` | Размер читаемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `ReadSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. -` ReadIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между запросами для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов `ReadIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. -` MaxInFlightReadRequests` | Максимальное количество одновременно обрабатываемых запросов на чтение. -` FlushIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между запросами на удаление записанных StorageLoad данных в микросекундах. Вы можете задать несколько диапазонов `FlushIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. -` PutHandleClass` | Класс записи данных в дисковую подсистему. В случае `TabletLog` запись выполняется с максимальным приоритетом. -` GetHandleClass` | Класс чтения данных с дисковой подсистемы. В случае `FastRead` чтение выполняется с максимальной скоростью. +`DurationSeconds` | Продолжительность нагрузки. Таймер запускается после завершения начальной записи данных. +`Tablets` | Нагрузка подается от имени таблетки со следующими реквизитами: +`WriteSizes` | Размер записываемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `WriteSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +`WriteHardRateDispatcher` | Описание [параметров нагрузки с фиксированной частотой](#hardRateDispatcher) для запросов записи. Если задан этот параметр, то значение `WriteIntervals` игнорируется. +`WriteIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между записями для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов `WriteIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +`MaxInFlightWriteRequests` | Максимальное количество одновременно обрабатываемых запросов на запись. +`ReadSizes` | Размер читаемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `ReadSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +`ReadIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между запросами для интервальной нагрузки в микросекундах. Вы можете задать несколько диапазонов `ReadIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +`ReadHardRateDispatcher` | Описание [параметров нагрузки с фиксированной частотой](#hardRateDispatcher) для запросов чтения. Если задан этот параметр, то значение `ReadIntervals` игнорируется. +`MaxInFlightReadRequests` | Максимальное количество одновременно обрабатываемых запросов на чтение. +`FlushIntervals` | Описание [параметров вероятностного распределения](#params) временных интервалов между запросами на удаление записанных основным циклом StorageLoad данных в микросекундах. Вы можете задать несколько диапазонов `FlushIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. Одновременно будет обрабатываться только один запрос на удаление записанных данных. +`PutHandleClass` | [Класс записи данных](#writeClass) в дисковую подсистему. В случае `TabletLog` запись выполняется с максимальным приоритетом. +`GetHandleClass` | [Класс чтения данных](#readClass) с дисковой подсистемы. В случае `FastRead` чтение выполняется с максимальной скоростью. +`InitialAllocation` | Описание [параметров начальной записи данных](#initialAllocation). Определяет объем данных, который будет записан до старта основной нагрузки, и которые затем могут быть прочитаны запросами чтения, наряду с данными, записанными в основном цикле нагрузки. + +### Write requests class {#writeClass} +| Class | Description | +--- | --- +| `TabletLog` | Самый высокий приоритет запросов записи. | +| `AsyncBlob` | Используется для записи таблиц SSTable и их частей. | +| `UserData` | Используется для записи пользовательских данных отдельными блобами. | + +### Read requests class {#readClass} +| Class | Description | +--- | --- +| `AsyncRead` | Используется для чтения данных таблеток, прошедших процесс компакшена. | +| `FastRead` | Используется для быстрого чтения пользовательских данных. | +| `Discover` | Чтения запросов Discover. | +| `LowRead` | Низкоприоритетные чтения, выполняемые на фоне. | ### Параметры вероятностного распределения {#params} {% include [load-actors-params](../_includes/load-actors-interval.md) %} + +### Параметры нагрузки с фиксированной частотой {#hardRateDispatcher} + +Параметр | Описание +--- | --- +`RequestsPerSecondAtStart` | Частота запросов в секунду в момент старта нагрузки. Если продолжительность нагрузки не задана, то частота запросов остается постоянной и равной величине этого параметра. +`RequestsPerSecondOnFinish` | Частота запросов в секунду в момент завершения нагрузки. + +### Параметры начальной записи данных {#initialAllocation} + +Параметр | Описание +--- | --- +`TotalSize` | Суммарный размер записанных данных. Этот параметр и `BlobsNumber` – взаимосключающие. +`BlobsNumber` | Количество записанных блобов. +`BlobSizes` | Размер записываемых блобов. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `BlobSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +`MaxWritesInFlight` | Максимальное количество одновременно обрабатываемых запросов на запись. Если парамаетр не задан, то ограничения на количество одновременно обрабатываемых запросов нет. +`MaxWriteBytesInFlight` | Максимальный суммарный объем данных одновременно обрабатываемых запросов на запись. Если парамаетр не задан, то ограничения на суммарный объем данных одновременно обрабатываемых запросов нет. +`PutHandleClass` | [Класс записи данных](#writeClass) в дисковую подсистему. +`DelayAfterCompletionSec` | Время в секундах, которое актор ждет от момента завершения начальной записи данных до момента старта основной нагрузки. Если параметр не задан, нагрузка начнется сразу же после завершения начальной записи данных. + ## Примеры {#examples} ### Нагрузка на запись {#write} @@ -51,8 +90,8 @@ StorageLoad: { При просмотре результата тестирования наибольший интерес представляют следующие значения: -* ` Writes per seconds` — количество записей в секунду, например `28690.29`. -* ` Speed@ 100%` — 100 перцентиль скорости записи в МБ/с, например `108.84`. +* `Writes per seconds` — количество записей в секунду, например `28690.29`. +* `Speed@ 100%` — 100 перцентиль скорости записи в МБ/с, например `108.84`. ### Нагрузка на чтение {#read} @@ -79,4 +118,33 @@ StorageLoad: { При просмотре результата тестирования наибольший интерес представляют следующие значение: -* ` ReadSpeed@ 100%` — 100 перцентиль скорости чтения МБ/с, например `60.86`. +* `ReadSpeed@ 100%` — 100 перцентиль скорости чтения МБ/с, например `60.86`. + +### Нагрузка только на чтение {#readonly} + +До старта основной нагрузки записывается блок данных, объемом `1 GB`, состоящий из блобов размером от `1 MB` до `5 MB`. Чтобы не перегрузить систему запросами записи, количество одновременно выполняемых запросов ограничивается `5`. После завершения записи этого блока запускается readonly нагрузка с возрастающей частотой: с `10` до `50` запросов в секунду, частота возрастает равномерно на протяжении `300` секунд. + +```proto +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](../administration/grafana-dashboards.md), например, по ним можно проследить, как ухудшается время отклика системы по мере роста нагрузки. +