- name: etcd_report_interval
  type: sec
  default: 5
  info: |
    Interval at which OSDs report their liveness to etcd. Affects OSD lease time
    and thus the failover speed. Lease time is equal to this parameter value
    plus max_etcd_attempts * etcd_quick_timeout because it should be guaranteed
    that every OSD always refreshes its lease in time.
  info_ru: |
    Интервал, с которым OSD сообщает о том, что жив, в etcd. Значение параметра
    влияет на время резервации (lease) OSD и поэтому - на скорость переключения
    при падении OSD. Время lease равняется значению этого параметра плюс
    max_etcd_attempts * etcd_quick_timeout.
- name: etcd_stats_interval
  type: sec
  default: 30
  info: |
    Interval at which OSDs report their statistics to etcd. Highly affects the
    imposed load on etcd, because statistics include a key for every OSD and
    for every PG. At the same time, low statistic intervals make `vitastor-cli`
    statistics more responsive.
  info_ru: |
    Интервал, с которым OSD обновляет свою статистику в etcd. Сильно влияет на
    создаваемую нагрузку на etcd, потому что статистика содержит по ключу на
    каждый OSD и на каждую PG. В то же время низкий интервал делает
    статистику, печатаемую `vitastor-cli`, отзывчивей.
- name: run_primary
  type: bool
  default: true
  info: |
    Start primary OSD logic on this OSD. As of now, can be turned off only for
    debugging purposes. It's possible to implement additional feature for the
    monitor which may allow to separate primary and secondary OSDs, but it's
    unclear why anyone could need it, so it's not implemented.
  info_ru: |
    Запускать логику первичного OSD на данном OSD. На данный момент отключать
    эту опцию может иметь смысл только в целях отладки. В теории, можно
    реализовать дополнительный режим для монитора, который позволит отделять
    первичные OSD от вторичных, но пока не понятно, зачем это может кому-то
    понадобиться, поэтому это не реализовано.
- name: osd_network
  type: string or array of strings
  type_ru: строка или массив строк
  info: |
    Network mask of the network (IPv4 or IPv6) to use for OSDs. Note that
    although it's possible to specify multiple networks here, this does not
    mean that OSDs will create multiple listening sockets - they'll only
    pick the first matching address of an UP + RUNNING interface. Separate
    networks for cluster and client connections are also not implemented, but
    they are mostly useless anyway, so it's not a big deal.
  info_ru: |
    Маска подсети (IPv4 или IPv6) для использования для соединений с OSD.
    Имейте в виду, что хотя сейчас и можно передать в этот параметр несколько
    подсетей, это не означает, что OSD будут создавать несколько слушающих
    сокетов - они лишь будут выбирать адрес первого поднятого (состояние UP +
    RUNNING), подходящий под заданную маску. Также не реализовано разделение
    кластерной и публичной сетей OSD. Правда, от него обычно всё равно довольно
    мало толку, так что особенной проблемы в этом нет.
- name: bind_address
  type: string
  default: "0.0.0.0"
  info: |
    Instead of the network mask, you can also set OSD listen address explicitly
    using this parameter. May be useful if you want to start OSDs on interfaces
    that are not UP + RUNNING.
  info_ru: |
    Этим параметром можно явным образом задать адрес, на котором будет ожидать
    соединений OSD (вместо использования маски подсети). Может быть полезно,
    например, чтобы запускать OSD на неподнятых интерфейсах (не UP + RUNNING).
- name: bind_port
  type: int
  info: |
    By default, OSDs pick random ports to use for incoming connections
    automatically. With this option you can set a specific port for a specific
    OSD by hand.
  info_ru: |
    По умолчанию OSD сами выбирают случайные порты для входящих подключений.
    С помощью данной опции вы можете задать порт для отдельного OSD вручную.
- name: autosync_interval
  type: sec
  default: 5
  online: true
  info: |
    Time interval at which automatic fsyncs/flushes are issued by each OSD when
    the immediate_commit mode if disabled. fsyncs are required because without
    them OSDs quickly fill their journals, become unable to clear them and
    stall. Also this option limits the amount of recent uncommitted changes
    which OSDs may lose in case of a power outage in case when clients don't
    issue fsyncs at all.
  info_ru: |
    Временной интервал отправки автоматических fsync-ов (операций очистки кэша)
    каждым OSD для случая, когда режим immediate_commit отключён. fsync-и нужны
    OSD, чтобы успевать очищать журнал - без них OSD быстро заполняют журналы и
    перестают обрабатывать операции записи. Также эта опция ограничивает объём
    недавних незафиксированных изменений, которые OSD могут терять при
    отключении питания, если клиенты вообще не отправляют fsync.
- name: autosync_writes
  type: int
  default: 128
  online: true
  info: |
    Same as autosync_interval, but sets the maximum number of uncommitted write
    operations before issuing an fsync operation internally.
  info_ru: |
    Аналогично autosync_interval, но задаёт не временной интервал, а
    максимальное количество незафиксированных операций записи перед
    принудительной отправкой fsync-а.
- name: recovery_queue_depth
  type: int
  default: 1
  online: true
  info: |
    Maximum recovery and rebalance operations initiated by each OSD in parallel.
    Note that each OSD talks to a lot of other OSDs so actual number of parallel
    recovery operations per each OSD is greater than just recovery_queue_depth.
    Increasing this parameter can speedup recovery if [auto-tuning](#recovery_tune_interval)
    allows it or if it is disabled.
  info_ru: |
    Максимальное число параллельных операций восстановления, инициируемых одним
    OSD в любой момент времени. Имейте в виду, что каждый OSD обычно работает с
    многими другими OSD, так что на практике параллелизм восстановления больше,
    чем просто recovery_queue_depth. Увеличение значения этого параметра может
    ускорить восстановление если [автотюнинг скорости](#recovery_tune_interval)
    разрешает это или если он отключён.
- name: recovery_sleep_us
  type: us
  default: 0
  online: true
  info: |
    Delay for all recovery- and rebalance- related operations. If non-zero,
    such operations are artificially slowed down to reduce the impact on
    client I/O.
- name: recovery_pg_switch
  type: int
  default: 128
  online: true
  info: |
    Number of recovery operations before switching to recovery of the next PG.
    The idea is to mix all PGs during recovery for more even space and load
    distribution but still benefit from recovery queue depth greater than 1.
    Degraded PGs are anyway scanned first.
  info_ru: |
    Число операций восстановления перед переключением на восстановление другой PG.
    Идея заключается в том, чтобы восстанавливать все PG одновременно для более
    равномерного распределения места и нагрузки, но при этом всё равно выигрывать
    от глубины очереди восстановления, большей, чем 1. Деградированные PG в любом
    случае сканируются первыми.
- name: recovery_sync_batch
  type: int
  default: 16
  online: true
  info: Maximum number of recovery operations before issuing an additional fsync.
  info_ru: Максимальное число операций восстановления перед дополнительным fsync.
- name: readonly
  type: bool
  default: false
  info: |
    Read-only mode. If this is enabled, an OSD will never issue any writes to
    the underlying device. This may be useful for recovery purposes.
  info_ru: |
    Режим "только чтение". Если включить этот режим, OSD не будет писать ничего
    на диск. Может быть полезно в целях восстановления.
- name: no_recovery
  type: bool
  default: false
  online: true
  info: |
    Disable automatic background recovery of objects. Note that it doesn't
    affect implicit recovery of objects happening during writes - a write is
    always made to a full set of at least pg_minsize OSDs.
  info_ru: |
    Отключить автоматическое фоновое восстановление объектов. Обратите внимание,
    что эта опция не отключает восстановление объектов, происходящее при
    записи - запись всегда производится в полный набор из как минимум pg_minsize
    OSD.
- name: no_rebalance
  type: bool
  default: false
  online: true
  info: |
    Disable background movement of data between different OSDs. Disabling it
    means that PGs in the `has_misplaced` state will be left in it indefinitely.
  info_ru: |
    Отключить фоновое перемещение объектов между разными OSD. Отключение
    означает, что PG, находящиеся в состоянии `has_misplaced`, будут оставлены
    в нём на неопределённый срок.
- name: print_stats_interval
  type: sec
  default: 3
  online: true
  info: |
    Time interval at which OSDs print simple human-readable operation
    statistics on stdout.
  info_ru: |
    Временной интервал, с которым OSD печатают простую человекочитаемую
    статистику выполнения операций в стандартный вывод.
- name: slow_log_interval
  type: sec
  default: 10
  online: true
  info: |
    Time interval at which OSDs dump slow or stuck operations on stdout, if
    they're any. Also it's the time after which an operation is considered
    "slow".
  info_ru: |
    Временной интервал, с которым OSD выводят в стандартный вывод список
    медленных или зависших операций, если таковые имеются. Также время, при
    превышении которого операция считается "медленной".
- name: inode_vanish_time
  type: sec
  default: 60
  online: true
  info: |
    Number of seconds after which a deleted inode is removed from OSD statistics.
  info_ru: |
    Число секунд, через которое удалённые инод удаляется и из статистики OSD.
- name: max_write_iodepth
  type: int
  default: 128
  online: true
  info: |
    Parallel client write operation limit per one OSD. Operations that exceed
    this limit are pushed to a temporary queue instead of being executed
    immediately.
  info_ru: |
    Максимальное число одновременных клиентских операций записи на один OSD.
    Операции, превышающие этот лимит, не исполняются сразу, а сохраняются во
    временной очереди.
- name: min_flusher_count
  type: int
  default: 1
  online: true
  info: |
    Flusher is a micro-thread that moves data from the journal to the data
    area of the device. Their number is auto-tuned between minimum and maximum.
    Minimum number is set by this parameter.
  info_ru: |
    Flusher - это микро-поток (корутина), которая копирует данные из журнала в
    основную область устройства данных. Их число настраивается динамически между
    минимальным и максимальным значением. Этот параметр задаёт минимальное число.
- name: max_flusher_count
  type: int
  default: 256
  online: true
  info: |
    Maximum number of journal flushers (see above min_flusher_count).
  info_ru: |
    Максимальное число микро-потоков очистки журнала (см. выше min_flusher_count).
- name: inmemory_metadata
  type: bool
  default: true
  info: |
    This parameter makes Vitastor always keep metadata area of the block device
    in memory. It's required for good performance because it allows to avoid
    additional read-modify-write cycles during metadata modifications. Metadata
    area size is currently roughly 224 MB per 1 TB of data. You can turn it off
    to reduce memory usage by this value, but it will hurt performance. This
    restriction is likely to be removed in the future along with the upgrade
    of the metadata storage scheme.
  info_ru: |
    Данный параметр заставляет Vitastor всегда держать область метаданных диска
    в памяти. Это нужно, чтобы избегать дополнительных операций чтения с диска
    при записи. Размер области метаданных на данный момент составляет примерно
    224 МБ на 1 ТБ данных. При включении потребление памяти снизится примерно
    на эту величину, но при этом также снизится и производительность. В будущем,
    после обновления схемы хранения метаданных, это ограничение, скорее всего,
    будет ликвидировано.
- name: inmemory_journal
  type: bool
  default: true
  info: |
    This parameter make Vitastor always keep journal area of the block
    device in memory. Turning it off will, again, reduce memory usage, but
    hurt performance because flusher coroutines will have to read data from
    the disk back before copying it into the main area. The memory usage benefit
    is typically very small because it's sufficient to have 16-32 MB journal
    for SSD OSDs. However, in theory it's possible that you'll want to turn it
    off for hybrid (HDD+SSD) OSDs with large journals on quick devices.
  info_ru: |
    Данный параметр заставляет Vitastor всегда держать в памяти журналы OSD.
    Отключение параметра, опять же, снижает потребление памяти, но ухудшает
    производительность, так как для копирования данных из журнала в основную
    область устройства OSD будут вынуждены читать их обратно с диска. Выигрыш
    по памяти при этом обычно крайне низкий, так как для SSD OSD обычно
    достаточно 16- или 32-мегабайтного журнала. Однако в теории отключение
    параметра может оказаться полезным для гибридных OSD (HDD+SSD) с большими
    журналами, расположенными на быстром по сравнению с HDD устройстве.
- name: data_io
  type: string
  default: direct
  info: |
    I/O mode for *data*. One of "direct", "cached" or "directsync". Corresponds
    to O_DIRECT, O_SYNC and O_DIRECT|O_SYNC, respectively.

    Choose "cached" to use Linux page cache. This may improve read performance
    for hot data and slower disks - HDDs and maybe SATA SSDs - but will slightly
    decrease write performance for fast disks because page cache is an overhead
    itself.

    Choose "directsync" to use [immediate_commit](layout-cluster.ru.md#immediate_commit)
    (which requires disable_data_fsync) with drives having write-back cache
    which can't be turned off, for example, Intel Optane. Also note that *some*
    desktop SSDs (for example, HP EX950) may ignore O_SYNC thus making
    disable_data_fsync unsafe even with "directsync".
  info_ru: |
    Режим ввода-вывода для *данных*. Одно из значений "direct", "cached" или
    "directsync", означающих O_DIRECT, O_SYNC и O_DIRECT|O_SYNC, соответственно.

    Выберите "cached", чтобы использовать системный кэш Linux (page cache) при
    чтении и записи. Это может улучшить скорость чтения горячих данных с
    относительно медленных дисков - HDD и, возможно, SATA SSD - но немного
    снижает производительность записи для быстрых дисков, так как кэш сам по
    себе тоже добавляет накладные расходы.

    Выберите "directsync", если хотите задействовать
    [immediate_commit](layout-cluster.ru.md#immediate_commit) (требующий
    включенияd disable_data_fsync) на дисках с неотключаемым кэшем. Пример таких
    дисков - Intel Optane. При этом также стоит иметь в виду, что *некоторые*
    настольные SSD (например, HP EX950) игнорируют флаг O_SYNC, делая отключение
    fsync небезопасным даже с режимом "directsync".
- name: meta_io
  type: string
  default: direct
  info: |
    I/O mode for *metadata*. One of "direct", "cached" or "directsync".

    "cached" may improve read performance, but only under the following conditions:
    1. your drives are relatively slow (HDD, SATA SSD), and
    2. checksums are enabled, and
    3. [inmemory_metadata](#inmemory_metadata) is disabled.
    Under all these conditions, metadata blocks are read from disk on every
    read request to verify checksums and caching them may reduce this extra
    read load. Without (3) metadata is never read from the disk after starting,
    and without (2) metadata blocks are read from disk only during journal
    flushing.

    "directsync" is the same as above.

    If the same device is used for data and metadata, meta_io by default is set
    to the same value as [data_io](#data_io).
  info_ru: |
    Режим ввода-вывода для *метаданных*. Одно из значений "direct", "cached" или
    "directsync".

    "cached" может улучшить скорость чтения, если:
    1. у вас медленные диски (HDD, SATA SSD)
    2. контрольные суммы включены
    3. параметр [inmemory_metadata](#inmemory_metadata) отключён.
    При этих условиях блоки метаданных читаются с диска при каждом запросе чтения
    для проверки контрольных сумм и их кэширование может снизить дополнительную
    нагрузку на диск. Без (3) метаданные никогда не читаются с диска после
    запуска OSD, а без (2) блоки метаданных читаются только при сбросе журнала.

    Если одно и то же устройство используется для данных и метаданных, режим
    ввода-вывода метаданных по умолчанию устанавливается равным [data_io](#data_io).
- name: journal_io
  type: string
  default: direct
  info: |
    I/O mode for *journal*. One of "direct", "cached" or "directsync".

    Here, "cached" may only improve read performance for recent writes and
    only if [inmemory_journal](#inmemory_journal) is turned off.

    If the same device is used for metadata and journal, journal_io by default
    is set to the same value as [meta_io](#meta_io).
  info_ru: |
    Режим ввода-вывода для *журнала*. Одно из значений "direct", "cached" или
    "directsync".

    Здесь "cached" может улучшить скорость чтения только недавно записанных
    данных и только если параметр [inmemory_journal](#inmemory_journal)
    отключён.

    Если одно и то же устройство используется для метаданных и журнала,
    режим ввода-вывода журнала по умолчанию устанавливается равным
    [meta_io](#meta_io).
- name: journal_sector_buffer_count
  type: int
  default: 32
  info: |
    Maximum number of buffers that can be used for writing journal metadata
    blocks. The only situation when you should increase it to a larger value
    is when you enable journal_no_same_sector_overwrites. In this case set
    it to, for example, 1024.
  info_ru: |
    Максимальное число буферов, разрешённых для использования под записываемые
    в журнал блоки метаданных. Единственная ситуация, в которой этот параметр
    нужно менять - это если вы включаете journal_no_same_sector_overwrites. В
    этом случае установите данный параметр, например, в 1024.
- name: journal_no_same_sector_overwrites
  type: bool
  default: false
  info: |
    Enable this option for SSDs like Intel D3-S4510 and D3-S4610 which REALLY
    don't like when a program overwrites the same sector multiple times in a
    row and slow down significantly (from 25000+ iops to ~3000 iops). When
    this option is set, Vitastor will always move to the next sector of the
    journal after writing it instead of possibly overwriting it the second time.

    Most (99%) other SSDs don't need this option.
  info_ru: |
    Включайте данную опцию для SSD вроде Intel D3-S4510 и D3-S4610, которые
    ОЧЕНЬ не любят, когда ПО перезаписывает один и тот же сектор несколько раз
    подряд. Такие SSD при многократной перезаписи одного и того же сектора
    сильно замедляются - условно, с 25000 и более iops до 3000 iops. Когда
    данная опция установлена, Vitastor всегда переходит к следующему сектору
    журнала после записи вместо потенциально повторной перезаписи того же
    самого сектора.

    Почти все другие SSD (99% моделей) не требуют данной опции.
- name: throttle_small_writes
  type: bool
  default: false
  online: true
  info: |
    Enable soft throttling of small journaled writes. Useful for hybrid OSDs
    with fast journal/metadata devices and slow data devices. The idea is that
    small writes complete very quickly because they're first written to the
    journal device, but moving them to the main device is slow. So if an OSD
    allows clients to issue a lot of small writes it will perform very good
    for several seconds and then the journal will fill up and the performance
    will drop to almost zero. Throttling is meant to prevent this problem by
    artifically slowing quick writes down based on the amount of free space in
    the journal. When throttling is used, the performance of small writes will
    decrease smoothly instead of abrupt drop at the moment when the journal
    fills up.
  info_ru: |
    Разрешить мягкое ограничение скорости журналируемой записи. Полезно для
    гибридных OSD с быстрыми устройствами метаданных и медленными устройствами
    данных. Идея заключается в том, что мелкие записи в этой ситуации могут
    завершаться очень быстро, так как они изначально записываются на быстрое
    журнальное устройство (SSD). Но перемещать их потом на основное медленное
    устройство долго. Поэтому если OSD быстро примет от клиентов очень много
    мелких операций записи, он быстро заполнит свой журнал, после чего
    производительность записи резко упадёт практически до нуля. Ограничение
    скорости записи призвано решить эту проблему с помощью искусственного
    замедления операций записи на основании объёма свободного места в журнале.
    Когда эта опция включена, производительность мелких операций записи будет
    снижаться плавно, а не резко в момент окончательного заполнения журнала.
- name: throttle_target_iops
  type: int
  default: 100
  online: true
  info: |
    Target maximum number of throttled operations per second under the condition
    of full journal. Set it to approximate random write iops of your data devices
    (HDDs).
  info_ru: |
    Расчётное максимальное число ограничиваемых операций в секунду при условии
    отсутствия свободного места в журнале. Устанавливайте приблизительно равным
    максимальной производительности случайной записи ваших устройств данных
    (HDD) в операциях в секунду.
- name: throttle_target_mbs
  type: int
  default: 100
  online: true
  info: |
    Target maximum bandwidth in MB/s of throttled operations per second under
    the condition of full journal. Set it to approximate linear write
    performance of your data devices (HDDs).
  info_ru: |
    Расчётный максимальный размер в МБ/с ограничиваемых операций в секунду при
    условии отсутствия свободного места в журнале. Устанавливайте приблизительно
    равным максимальной производительности линейной записи ваших устройств
    данных (HDD).
- name: throttle_target_parallelism
  type: int
  default: 1
  online: true
  info: |
    Target maximum parallelism of throttled operations under the condition of
    full journal. Set it to approximate internal parallelism of your data
    devices (1 for HDDs, 4-8 for SSDs).
  info_ru: |
    Расчётный максимальный параллелизм ограничиваемых операций в секунду при
    условии отсутствия свободного места в журнале. Устанавливайте приблизительно
    равным внутреннему параллелизму ваших устройств данных (1 для HDD, 4-8
    для SSD).
- name: throttle_threshold_us
  type: us
  default: 50
  online: true
  info: |
    Minimal computed delay to be applied to throttled operations. Usually
    doesn't need to be changed.
  info_ru: |
    Минимальная применимая к ограничиваемым операциям задержка. Обычно не
    требует изменений.
- name: osd_memlock
  type: bool
  default: false
  info: |
    Lock all OSD memory to prevent it from being unloaded into swap with
    mlockall(). Requires sufficient ulimit -l (max locked memory).
  info_ru: |
    Блокировать всю память OSD с помощью mlockall, чтобы запретить её выгрузку
    в пространство подкачки. Требует достаточного значения ulimit -l (лимита
    заблокированной памяти).
- name: auto_scrub
  type: bool
  default: false
  online: true
  info: |
    Data scrubbing is the process of background verification of copies to find
    and repair corrupted blocks. It's not run automatically by default since
    it's a new feature. Set this parameter to true to enable automatic scrubs.

    This parameter makes OSDs automatically schedule data scrubbing of clean PGs
    every `scrub_interval` (see below). You can also start/schedule scrubbing
    manually by setting `next_scrub` JSON key to the desired UNIX time of the
    next scrub in `/pg/history/...` values in etcd.
  info_ru: |
    Скраб - процесс фоновой проверки копий данных, предназначенный, чтобы
    находить и исправлять повреждённые блоки. По умолчанию эти проверки ещё не
    запускаются автоматически, так как являются новой функцией. Чтобы включить
    автоматическое планирование скрабов, установите данный параметр в true.

    Включённый параметр заставляет OSD автоматически планировать фоновую
    проверку чистых PG раз в `scrub_interval` (см. ниже). Вы также можете
    запустить или запланировать проверку вручную, установив значение ключа JSON
    `next_scrub` внутри ключей etcd `/pg/history/...` в UNIX-время следующей
    желаемой проверки.
- name: no_scrub
  type: bool
  default: false
  online: true
  info: |
    Temporarily disable scrubbing and stop running scrubs.
  info_ru: |
    Временно отключить и остановить запущенные скрабы.
- name: scrub_interval
  type: string
  default: 30d
  online: true
  info: |
    Default automatic scrubbing interval for all pools. Numbers without suffix
    are treated as seconds, possible unit suffixes include 's' (seconds),
    'm' (minutes), 'h' (hours), 'd' (days), 'M' (months) and 'y' (years).
  info_ru: |
    Интервал автоматической фоновой проверки по умолчанию для всех пулов.
    Значения без указанной единицы измерения считаются в секундах, допустимые
    символы единиц измерения в конце: 's' (секунды),
    'm' (минуты), 'h' (часы), 'd' (дни), 'M' (месяца) или 'y' (годы).
- name: scrub_queue_depth
  type: int
  default: 1
  online: true
  info: |
    Number of parallel scrubbing operations per one OSD.
  info_ru: |
    Число параллельных операций фоновой проверки на один OSD.
- name: scrub_sleep
  type: ms
  default: 0
  online: true
  info: |
    Additional interval between two consecutive scrubbing operations on one OSD.
    Can be used to slow down scrubbing if it affects user load too much.
  info_ru: |
    Дополнительный интервал ожидания после фоновой проверки каждого объекта на
    одном OSD. Может использоваться для замедления скраба, если он слишком
    сильно влияет на пользовательскую нагрузку.
- name: scrub_list_limit
  type: int
  default: 1000
  online: true
  info: |
    Number of objects to list in one listing operation during scrub.
  info_ru: |
    Размер загружаемых за одну операцию списков объектов в процессе фоновой
    проверки.
- name: scrub_find_best
  type: bool
  default: true
  online: true
  info: |
    Find and automatically restore best versions of objects with unmatched
    copies. In replicated setups, the best version is the version with most
    matching replicas. In EC setups, the best version is the subset of data
    and parity chunks without mismatches.

    The hypothetical situation where you might want to disable it is when
    you have 3 replicas and you are paranoid that 2 HDDs out of 3 may silently
    corrupt an object in the same way (for example, zero it out) and only
    1 HDD will remain good. In this case disabling scrub_find_best may help
    you to recover the data! See also scrub_ec_max_bruteforce below.
  info_ru: |
    Находить и автоматически восстанавливать "лучшие версии" объектов с
    несовпадающими копиями/частями. При использовании репликации "лучшая"
    версия - версия, доступная в большем числе экземпляров, чем другие. При
    использовании кодов коррекции ошибок "лучшая" версия - это подмножество
    частей данных и чётности, полностью соответствующих друг другу.

    Гипотетическая ситуация, в которой вы можете захотеть отключить этот
    поиск - это если у вас 3 реплики и вы боитесь, что 2 диска из 3 могут
    незаметно и одинаково повредить данные одного и того же объекта, например,
    занулив его, и только 1 диск останется неповреждённым. В этой ситуации
    отключение этого параметра поможет вам восстановить данные! Смотрите также
    описание следующего параметра - scrub_ec_max_bruteforce.
- name: scrub_ec_max_bruteforce
  type: int
  default: 100
  online: true
  info: |
    Vitastor can locate corrupted chunks in EC setups with more than 1 parity
    chunk by brute-forcing all possible error locations. This configuration
    value limits the maximum number of checked combinations. You can try to
    increase it if you have EC N+K setup with N and K large enough for
    combination count `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!` to be greater
    than the default 100.

    If there are too many possible combinations or if multiple combinations give
    correct results then objects are marked inconsistent and aren't recovered
    automatically.

    In replicated setups bruteforcing isn't needed, Vitastor just assumes that
    the variant with most available equal copies is correct. For example, if
    you have 3 replicas and 1 of them differs, this one is considered to be
    corrupted. But if there is no "best" version with more copies than all
    others have then the object is also marked as inconsistent.
  info_ru: |
    Vitastor старается определить повреждённые части объектов при использовании
    EC (кодов коррекции ошибок) с более, чем 1 диском чётности, путём перебора
    всех возможных комбинаций ошибочных частей. Данное значение конфигурации
    ограничивает число перебираемых комбинаций. Вы можете попробовать поднять
    его, если используете схему кодирования EC N+K с N и K, достаточно большими
    для того, чтобы число сочетаний `C(N+K-1, K-1) = (N+K-1)! / (K-1)! / N!`
    было больше, чем стандартное значение 100.

    Если возможных комбинаций слишком много или если корректная комбинаций не
    определяется однозначно, объекты помечаются неконсистентными (inconsistent)
    и не восстанавливаются автоматически.

    При использовании репликации перебор не нужен, Vitastor просто предполагает,
    что вариант объекта с наибольшим количеством одинаковых копий корректен.
    Например, если вы используете 3 реплики и 1 из них отличается, эта 1 копия
    считается некорректной. Однако, если "лучшую" версию с числом доступных
    копий большим, чем у всех других версий, найти невозможно, то объект тоже
    маркируется неконсистентным.
- name: recovery_tune_interval
  type: sec
  default: 1
  online: true
  info: |
    Interval at which OSD re-considers client and recovery load and automatically
    adjusts [recovery_sleep_us](#recovery_sleep_us). Recovery auto-tuning is
    disabled if recovery_tune_interval is set to 0.

    Auto-tuning targets utilization. Utilization is a measure of load and is
    equal to the product of iops and average latency (so it may be greater
    than 1). You set "low" and "high" client utilization thresholds and two
    corresponding target recovery utilization levels. OSD calculates desired
    recovery utilization from client utilization using linear interpolation
    and auto-tunes recovery operation delay to make actual recovery utilization
    match desired.

    This allows to reduce recovery/rebalance impact on client operations. It is
    of course impossible to remove it completely, but it should become adequate.
    In some tests rebalance could earlier drop client write speed from 1.5 GB/s
    to 50-100 MB/s, with default auto-tuning settings it now only reduces
    to ~1 GB/s.
  info_ru: |
    Интервал, с которым OSD пересматривает клиентскую нагрузку и нагрузку
    восстановления и автоматически подстраивает [recovery_sleep_us](#recovery_sleep_us).
    Автотюнинг (автоподстройка) отключается, если recovery_tune_interval
    устанавливается в значение 0.

    Автотюнинг регулирует утилизацию. Утилизация является мерой нагрузки
    и равна произведению числа операций в секунду и средней задержки
    (то есть, она может быть выше 1). Вы задаёте два уровня клиентской
    утилизации - "низкий" и "высокий" (low и high) и два соответствующих
    целевых уровня утилизации операциями восстановления. OSD рассчитывает
    желаемый уровень утилизации восстановления линейной интерполяцией от
    клиентской утилизации и подстраивает задержку операций восстановления
    так, чтобы фактическая утилизация восстановления совпадала с желаемой.

    Это позволяет снизить влияние восстановления и ребаланса на клиентские
    операции. Конечно, невозможно исключить такое влияние полностью, но оно
    должно становиться адекватнее. В некоторых тестах перебалансировка могла
    снижать клиентскую скорость записи с 1.5 ГБ/с до 50-100 МБ/с, а теперь, с
    настройками автотюнинга по умолчанию, она снижается только до ~1 ГБ/с.
- name: recovery_tune_util_low
  type: float
  default: 0.1
  online: true
  info: |
    Desired recovery/rebalance utilization when client load is high, i.e. when
    it is at or above recovery_tune_client_util_high.
  info_ru: |
    Желаемая утилизация восстановления в моменты, когда клиентская нагрузка
    высокая, то есть, находится на уровне или выше recovery_tune_client_util_high.
- name: recovery_tune_util_high
  type: float
  default: 1
  online: true
  info: |
    Desired recovery/rebalance utilization when client load is low, i.e. when
    it is at or below recovery_tune_client_util_low.
  info_ru: |
    Желаемая утилизация восстановления в моменты, когда клиентская нагрузка
    низкая, то есть, находится на уровне или ниже recovery_tune_client_util_low.
- name: recovery_tune_client_util_low
  type: float
  default: 0
  online: true
  info: Client utilization considered "low".
  info_ru: Клиентская утилизация, которая считается "низкой".
- name: recovery_tune_client_util_high
  type: float
  default: 0.5
  online: true
  info: Client utilization considered "high".
  info_ru: Клиентская утилизация, которая считается "высокой".
- name: recovery_tune_agg_interval
  type: int
  default: 10
  online: true
  info: |
    The number of last auto-tuning iterations to use for calculating the
    delay as average. Lower values result in quicker response to client
    load change, higher values result in more stable delay. Default value of 10
    is usually fine.
  info_ru: |
    Число последних итераций автоподстройки для расчёта задержки как среднего
    значения. Меньшие значения параметра ускоряют отклик на изменение нагрузки,
    большие значения делают задержку стабильнее. Значение по умолчанию 10
    обычно нормальное и не требует изменений.
- name: recovery_tune_sleep_min_us
  type: us
  default: 10
  online: true
  info: |
    Minimum possible value for auto-tuned recovery_sleep_us. Lower values
    are changed to 0.
  info_ru: |
    Минимальное возможное значение авто-подстроенного recovery_sleep_us.
    Меньшие значения заменяются на 0.
- name: recovery_tune_sleep_cutoff_us
  type: us
  default: 10000000
  online: true
  info: |
    Maximum possible value for auto-tuned recovery_sleep_us. Higher values
    are treated as outliers and ignored in aggregation.
  info_ru: |
    Максимальное возможное значение авто-подстроенного recovery_sleep_us.
    Большие значения считаются случайными выбросами и игнорируются в
    усреднении.
