Skip to content

Commit

Permalink
Add docs about performance metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
serbel324 committed Mar 6, 2024
1 parent 0851b7a commit 7f95899
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions ydb/docs/ru/core/maintenance/manual/performance_metrics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Метрики производительности BlobStorage

BlobStorage имеет определенную пропускную способность, ограниченную ресурсами физических устройств в кластере и может обеспечивать низкое время отклика, если нагрузка не превышает эту пропускную способность. Метрики производительности отображают количество доступных ресурсов физических устройств и позволяют оценить уровень их потребления.

### Модель cost

Cost запроса - это оценка времени в наносекундах, которое затратит физическое устройство на выполенение этой операции. Cost вычисляется по простой модели физического устройства. Мы предполагаем, что физическое устройство может одновременно выполнять только один запрос чтения или записи. На выполнение операции уходит определенное время работы устройства, соотвественно суммарное время выполнения запросов за определенный промежуток времени не может быть больше величины этого промежутка.

Cost вычисляется по линейной формуле:

$$
cost(operation) = A + operation.size() \times B
$$

Физический смысл такой зависимости таков: коэффициент $A$ - это время (нс), необходимое физическому устройству для получения доступа к данным, коэффициент $B$ - это время (нс), необходимое для чтения или записи одного бита данных.

Коэффициенты $A$ и $В$ зависят от типа запроса и типа устройства и были измерены экспериментально для каждого типа устройства и каждого типа запроса.

В ситеме YDB все физические устройства делятся на три типа: HDD, SATA SSD (далее SSD) и NVME SSD (далее NVME). HDD - это крутящиеся жесткие диски, они отличаются высоким временем доступа к данным. Типы SSD и NVME отличаются интерфейсом: NVME обеспечивает более высокую скорость выполнения операций.

Операции делятся на 3 типа: чтение, запись и huge-запись. Разделение записи на обычную и huge-запись обусловлено спецификой записи данных VDisk'ом.

Помимо пользовательских запросов, нагрузку на BlobStorage создают фоновые процессы компакшена, скраббинга и дефрагментации, а также внутренняя коммуникация между VDisk'ами. Процесс компакшена может создавать особенно высокую нагрузку при достаточно большом потоке записей маленьких блобов.

### Доступное время диска.

Планировщик PDisk управляет порядком выполнения PDisk'ом запросов от его клиентов-VDisk'ов. PDisk честно делит время устройства между своими VDisk'ами, то есть каждому из $n$ VDisk'ов гарантируется $1/n$ секунд работы физического устройства каждую секунду. Этот показатель мы будем называть доступным временем диска или `DiskTimeAvailable`.

### Детектор берстов.

Берст - это резкое краткосрочное повышение нагрузки на VDisk, которое может приводить к деградации latency операций. Значения сенсоров с нод кластера собираются через определенные промежутки времени, например, раз в 15 секунд, что делает невозможным надежное обнаружение краткосрочных событий с помощью одних только метрик Cost и TimeAvailable. Для решения этой задачи используется модифицированный [алгоритм Token Bucket](https://en.wikipedia.org/wiki/Token_bucket), в нашей модификации в ведре может быть отрицательное количество токенов, и такое состояние мы будем называть underflow. К каждому VDisk'у привязан отдельный объект Token Bucket.

### Метрики производительности.

Метрики производительности вычисляются через следующие сенсоры VDisk'а:
- `DiskTimeAvailableNs` - доступное время диска в наносекундах.
- `UserDiskCost` - суммарный cost запросов, полученных VDisk'ом из BlobStorage Proxy.
- `InternalDiskCost` - суммарный cost запросов, полученных VDisk'ом от другого VDisk'а группы. Такие запросы включают в себя, например, запросы процесса репликации.
- `CompactionDiskCost` - суммарный cost запросов, отправленных VDisk'ом в рамках системного процесса компакшена.
- `DefragDiskCost` - суммарный cost запросов, отправленных VDisk'ом в рамках системного процесса дефрагментации.
- `ScrubDiskCost` - суммарный cost запросов, отправленных VDisk'ом в рамках системного процесса скраббинга.
- `BurstDetector_redMs` - время в миллисекундах, на протяжении которого Token Bucket находился в состоянии underflow.

### Условия гарантий распределенного хранилища. {#requirements}

Распределенное хранилище YDB может обеспечивать низкое время отклика только при соблюдении следующих условий:
1. `DiskTimeAvailableNs >= UserDiskCost + InternalDiskCost + CompactionDiskCost + DefragDiskCost + ScrubDiskCost` - средний поток нагрузки не превышает предельно допустимый.
2. `BurstDetector_redMs = 0` - отсутствуют краткосрочные пики нагрузки, приводящие к образованию очередей запросов.

### Дашборд
Для удобного просмотра метрик и диагностики существует [дашборд](https://m.yandex-team.ru/projects/kikimr/dashboards/mongi8n4phijn4n3o4il) во внутреннем инструменте Monitoring.

Основной интерес представляют следующие графики:
- `Storage group latency` - время отклика запросов в BlobStorage.
- `Cost (estimated consumed device time, ns)` - отображает соотношение оценки cost и доступного времени диска. По этому графику можно следить, выполнено ли условие (1) [гарантий распределенного хранилища](#requirements).
- `Burst duration, ms` - время в миллисекундах, на протяжении которого наблюдались берсты. По этому графику можно следить, выполнено ли условие (2) [гарантий распределенного хранилища](#requirements).

0 comments on commit 7f95899

Please sign in to comment.