|
2 | 2 |
|
3 | 3 | Распределённое хранилище {{ ydb-short-name }} обладает определённой пропускной способностью, ограниченной ресурсами физических устройств в кластере, и может обеспечивать низкое время отклика, если нагрузка не превышает эту пропускную способность. Метрики производительности отображают количество доступных ресурсов физических устройств и позволяют оценить уровень их потребления. По значениям метрик производительности можно отслеживать, выполнены ли необходимые условия для гарантии низкого времени отклика распределённого хранилища, а именно, что средний поток нагрузки не превышает предельно допустимый, и что отсутствуют краткосрочные всплески нагрузки.
|
4 | 4 |
|
5 |
| -### Модель стоимости запроса |
| 5 | +## Модель стоимости запроса |
6 | 6 |
|
7 | 7 | Стоимость запроса — это оценка времени в условных единицах, которое затратит физическое устройство на выполнение этой операции. Стоимость запроса вычисляется по простой модели физического устройства. Мы предполагаем, что физическое устройство может одновременно выполнять только один запрос на чтение или на запись. На выполнение операции уходит определённое время работы устройства, соотвественно, суммарное время выполнения запросов за определнённый промежуток времени не может превышать величину этого промежутка.
|
8 | 8 |
|
|
22 | 22 |
|
23 | 23 | Помимо пользовательских запросов, нагрузку на распределенное хранилище создают фоновые процессы компакшена, скраббинга и дефрагментации, а также внутренняя коммуникация между VDisk'ами. Процесс компакшена может создавать особенно высокую нагрузку при достаточно большом потоке записей маленьких блобов.
|
24 | 24 |
|
25 |
| -### Доступное время диска {#diskTimeAvailable} |
| 25 | +## Доступное время диска {#diskTimeAvailable} |
| 26 | + |
| 27 | +Планировщик PDisk управляет порядком выполнения запросов PDisk'ом от его клиентов-VDisk'ов. PDisk честно делит время устройства между своими VDisk'ами, то есть каждому из $N$ VDisk'ов гарантируется $1/N$ секунд работы физического устройства каждую секунду. |
| 28 | +Доступное время диска - это оценка времени работы физического устройства, которое планировщик PDisk выделит данному VDisk'у. Доступное время диска измеряется в тех же условных единицах, что и стоимость запроса. На основе информации о количестве VDisk'ов-соседей для каждого VDisk'а, которое мы обозначим как $N$, и настраиваемого параметра `DiskTimeAvailableScale` вычисляется доступное время диска по следующей формуле: |
26 | 29 |
|
27 |
| -Планировщик PDisk управляет порядком выполнения запросов PDisk'ом от его клиентов-VDisk'ов. PDisk честно делит время устройства между своими VDisk'ами, то есть каждому из $N$ VDisk'ов гарантируется $1/N$ секунд работы физического устройства каждую секунду. |
28 |
| -Доступное время диска - это оценка времени работы физического устройства, которое планировщик PDisk выделит данному VDisk'у. Доступное время диска измеряется в тех же условных единицах, что и стоимость запроса. На основе информации о количестве VDisk'ов-соседей для каждого VDisk'а, которое мы обозначим как $N$, и настраиваемого параметра `DiskTimeAvailableScale` вычисляется доступное время диска по формуле |
29 | 30 | $$
|
30 |
| - DiskTimeAvailable = \dfrac{1000000000}{N} \cdot \dfrac{DiskTimeAvailableScale}{1000} |
| 31 | + DiskTimeAvailable = \dfrac{1000000000}{N} \cdot \dfrac{DiskTimeAvailableScale}{1000} |
31 | 32 | $$
|
32 | 33 |
|
33 |
| -### Обнаружение всплесков нагрузки {#burstDetection} |
| 34 | +## Обнаружение всплесков нагрузки {#burstDetection} |
34 | 35 |
|
35 | 36 | Всплеск - это резкое краткосрочное повышение нагрузки на VDisk, которое может приводить к деградации времени отклика операций. Значения сенсоров с узлов кластера собираются через определенные промежутки времени, например, раз в 15 секунд, что делает невозможным надежное обнаружение краткосрочных событий с помощью одних только метрик стоимости запросов и доступного времени диска. Для обнаружения всплесков нагрузки используется модифицированный [алгоритм Token Bucket](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B5%D0%B3%D0%BE_%D0%B2%D0%B5%D0%B4%D1%80%D0%B0), в нашей модификации в ведре может быть отрицательное количество токенов, и такое состояние мы будем называть underflow. К каждому VDisk'у привязан отдельный объект Token Bucket. Минимальное ожидаемое время отклика, при котором повышение нагрузки считается всплеском, определяется настраиваемым параметром `BurstThresholdNs`. Ведро будет переходить в состояние underflow, если расчетная длительность обработки всплеска запросов в наносекундах превысит значение `BurstThresholdNs`.
|
36 | 37 |
|
37 |
| -### Метрики производительности |
| 38 | +## Метрики производительности |
| 39 | + |
38 | 40 | Метрики производительности вычисляются на основе следующих сенсоров VDisk'а:
|
39 | 41 | | Название сенсора | описание | единицы измерения |
|
40 | 42 | |-----------------------|-----------------------------------------------------------------------------------------------------------------------|-------------------|
|
|
50 | 52 |
|
51 | 53 | Метрики производительности выведены на [специальный дашборд Grafana](grafana-dashboards.md#ds-performance).
|
52 | 54 |
|
53 |
| -### Условия гарантий распределённого хранилища {#requirements} |
| 55 | +## Условия гарантий распределённого хранилища {#requirements} |
| 56 | + |
54 | 57 | Распределённое хранилище {{ ydb-short-name }} может обеспечивать низкое время отклика только при соблюдении следующих условий:
|
55 | 58 |
|
56 | 59 | 1. `DiskTimeAvailable >= UserDiskCost + InternalDiskCost + CompactionDiskCost + DefragDiskCost + ScrubDiskCost` — средний поток нагрузки не превышает предельно допустимый.
|
|
69 | 72 | | `burst_threshold_ns_ssd` | [Параметр `BurstThresholdNs`](#burstDetection) для VDisk'ов, запущенных поверх SSD-устройств. | нс | `50000000` |
|
70 | 73 | | `burst_threshold_ns_nvme` | [Параметр `BurstThresholdNs`](#burstDetection) для VDisk'ов, запущенных поверх NVMe-устройств. | нс | `32000000` |
|
71 | 74 |
|
72 |
| -#### Примеры конфигурации метрик |
| 75 | +### Примеры конфигурации метрик |
| 76 | + |
73 | 77 | Если в кластере {{ ydb-short-name }} используются NVMe-устройства и этот кластер обеспечивает на 10% более высокую производительность, чем эталон, то необходимо добавить следующую секцию в настройки `immediate_controls_config` динамической конфигурации кластера:
|
74 |
| -``` |
| 78 | + |
| 79 | +```text |
75 | 80 | vdisk_controls:
|
76 | 81 | disk_time_available_scale_nvme: 1100
|
77 | 82 | ```
|
78 | 83 |
|
79 | 84 | Если в кластере {{ ydb-short-name }} используются HDD-устройства и в условиях поданной нагрузки максимально допустимое время отклика составляет 500 мс, то необходимо добавить следующую секцию в настройки `immediate_controls_config` динамической конфигурации кластера:
|
80 |
| -``` |
| 85 | + |
| 86 | +```text |
81 | 87 | vdisk_controls:
|
82 | 88 | burst_threshold_ns_hdd: 500000000
|
83 | 89 | ```
|
84 | 90 |
|
85 |
| -### Как сравнить производительность кластера {{ ydb-short-name }} с эталоном |
| 91 | +## Как сравнить производительность кластера {{ ydb-short-name }} с эталоном |
86 | 92 |
|
87 | 93 | Чтобы сравнить производительность распределённого хранилища на кластере {{ ydb-short-name }} с эталонной, необходимо загрузить его запросами до такого состояния, когда VDisk'и не могут обрабатывать поток входящих запросов. В этот момент запросы начинают выстраиваться в очередь, и время отклика VDisk'ов резко возрастает. В момент, предшествующий перегрузке необходимо посчитать величину $D$:
|
88 | 94 | $$
|
|
0 commit comments