# Настройка производительности

> Когда следует изменять интервал heartbeat и тайм-аут выборов

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

Настройки etcd по умолчанию хорошо подходят для локальных сетей с небольшой средней задержкой. Однако при использовании etcd в нескольких центрах обработки данных или в сети с высокой задержкой может потребоваться настроить интервал heartbeat и тайм-аут выборов.

Сеть — не единственный источник задержки. На каждый запрос и ответ могут влиять медленные диски лидера и последователя. Каждый из этих тайм-аутов охватывает полное время от отправки запроса до успешного ответа другой машины.

## Временные параметры {#time-parameters}

Базовый протокол распределённого консенсуса использует два независимых временных параметра, чтобы узлы могли передать лидерство при зависании или отключении лидера. Первый параметр — *интервал heartbeat*. Он определяет, как часто лидер сообщает последователям, что по-прежнему остаётся лидером.
Рекомендуется устанавливать его примерно равным времени кругового обхода между участниками. По умолчанию etcd использует интервал heartbeat `100ms`.

Второй параметр — *тайм-аут выборов*. Он определяет, как долго последователь может не получать heartbeat, прежде чем сам попытается стать лидером. По умолчанию etcd использует тайм-аут выборов `1000ms`.

Выбор этих значений является компромиссом. Интервал heartbeat рекомендуется задавать примерно равным максимальному среднему времени кругового обхода (RTT) между участниками, обычно 0.5-1.5x RTT. Слишком малый интервал заставляет etcd отправлять лишние сообщения и увеличивает потребление ресурсов CPU и сети. Слишком большой интервал приводит к большому тайм-ауту выборов, а значит замедляет обнаружение отказа лидера. Проще всего измерить RTT с помощью [утилиты PING][ping].

Тайм-аут выборов следует выбирать на основе интервала heartbeat и среднего RTT между участниками. Он должен как минимум в 10 раз превышать RTT, чтобы учитывать колебания сети. Например, если RTT между участниками равен 10ms, тайм-аут выборов должен составлять не менее 100ms.

Верхний предел тайм-аута выборов — 50000ms (50s); использовать его следует только в глобально распределённом кластере etcd. Разумный RTT в пределах континентальной части США составляет 130ms, а между США и Японией — около 350-400ms. При неравномерной работе сети или регулярных задержках и потерях пакетов для успешной передачи может потребоваться несколько попыток. Поэтому 5s — безопасная верхняя граница глобального RTT. Поскольку тайм-аут выборов должен быть на порядок больше времени распространения, при глобальном RTT около ~5s разумный максимум составляет 50 секунд.

Интервал heartbeat и тайм-аут выборов должны быть одинаковыми у всех участников одного кластера. Разные значения могут нарушить стабильность кластера.

Значения по умолчанию можно переопределить в командной строке:

```sh
# Command line arguments:
$ etcd --heartbeat-interval=100 --election-timeout=500

# Environment variables:
$ ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd
```

Значения задаются в миллисекундах.

## Снимки {#snapshots}

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

Чтобы журнал не становился огромным, etcd периодически создаёт снимки. Снимки позволяют компактизировать журнал: сохранить текущее состояние системы и удалить старые записи.

### Настройка снимков {#snapshot-tuning}

Создание снимков с бэкендом V2 может быть дорогой операцией, поэтому они создаются только после заданного числа изменений etcd. По умолчанию снимок создаётся после каждых 10,000 изменений. Если etcd использует слишком много памяти или дискового пространства, уменьшите порог снимка в командной строке:

```sh
# Command line arguments:
$ etcd --snapshot-count=5000

# Environment variables:
$ ETCD_SNAPSHOT_COUNT=5000 etcd
```

## Диск {#disk}

Кластер etcd очень чувствителен к задержкам диска. Поскольку etcd должен сохранять предложения в журнале, дисковая активность других процессов может вызывать большие задержки `fsync`. В результате etcd может пропускать heartbeat, что приводит к тайм-аутам запросов и временной потере лидера. Иногда сервер etcd может стабильно работать рядом с такими процессами, если ему назначить высокий дисковый приоритет.

В Linux дисковый приоритет etcd настраивается с помощью `ionice`:

```sh
# best effort, highest priority
$ sudo ionice -c2 -n0 -p `pgrep etcd`
```

## Сеть {#network}

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

```
dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full
```

Эти ошибки можно устранить, назначив трафику между участниками etcd более высокий приоритет, чем клиентскому трафику. В Linux приоритет настраивается механизмом управления трафиком:

```
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:1
```

[ping]: https://en.wikipedia.org/wiki/Ping_(networking_utility)


Чтобы отменить настройку `tc`, выполните:

```
tc qdisc del dev eth0 root
```

## CPU {#cpu}

Поскольку etcd очень чувствителен к задержке, в Linux производительность можно дополнительно оптимизировать, переведя регулятор частоты CPU в режим performance или conservative.

В Linux режим performance настраивается командой:
```
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
```
