Изменение конфигурации актор-системы

Актор-система основа YDB, каждый компонент системы представляется одним или несколькими акторами.
Каждый актор распределен в определенный ExecutorPool, соответствующий задаче актора.
Изменение конфигурации поможет более точно распределить количество зарезервированных ядер для каждого типа задач.

Описание конфига актор-системы

Конфиг актор-системы состоит из перечисления ExecutorPool'ов, сопоставления ExecutorPool с видами задач и конфигураций шедулера актор-системы.

На данный момент есть следующие типы задач и соответствующие им пулы:

  • System - предназначен для выполнения быстрых внутренних операций YDB;
  • User - включает в себя всю пользовательскую нагрузку по обработке и выполнению входящих запросов;
  • Batch - задачи, которые не имеют строгого лимита на время выполнения, в основном выполнение фоновых операций;
  • IO - отвечает за выполнение всех задач с блокирующими операциями (как пример запись логов в файл);
  • IC - Interconnect, включает всю нагрузку связанную с коммуникацией между узлами.

Каждый пул описывается полем Executor, как в примере ниже.

Executor {
  Type: BASIC
  Threads: 9
  SpinThreshold: 1
  Name: "System"
}

Описание основных полей:

  • Type - на данный момент может иметь два типа: BASIC и IO. Все пулы, кроме IO, имеют тип BASIC;
  • Threads - количество потоков (количество параллельно работающих акторов) в данном пуле;
  • SpinThreshold - количество тактов процессора перед уходом в сон при отсутствии задач, которое будет исполнять поток, выполняющий работу акторов (влияет на потребление cpu и latency запросов во время слабой нагрузки);
  • Name - название пула, которое будет отображаться у узла в мониторинге.

Сопоставление пулов с типами задач происходит заданием порядкового номера пула в специальные поля. Пулы нумеруются с нуля, также на один пул может повесить несколько типов задач.

Список полей с их задачами:

  • SysExecutor - System
  • UserExecutor - User
  • BatchExecutor - Batch
  • IoExecutor - IO

Пример:

SysExecutor: 0
UserExecutor: 1
BatchExecutor: 2
IoExecutor: 3

IC пул задается другим способом, через ServiceExecutor, как в примере ниже.

ServiceExecutor {
  ServiceName: "Interconnect"
  ExecutorId: 4
}

Шедулер актор-системы отвечает за доставку отложенных сообщений между акторами и задается следующими параметрами:

  • Resolution - минимальный шаг смещения времени в микросекундах;
  • SpinThreshold - аналогично с параметром пула, количество тактов процессора перед уходом в сон при отсутствии сообщений;
  • ProgressThreshold - максимальный шаг смещения времени в микросекундах.

В случае если по неизвестным причинам поток шедулера залип, то он будет отправлять сообщения по отстающему времени, смещая его каждый раз на ProgressThreshold.

Не рекомендуется менять конфиг шедулера. В конфигах пулов рекомендуется менять только количество потоков.

Пример конфига актор-системы по умолчанию:

Executor {
  Type: BASIC
  Threads: 9
  SpinThreshold: 1
  Name: "System"
}
Executor {
  Type: BASIC
  Threads: 16
  SpinThreshold: 1
  Name: "User"
}
Executor {
  Type: BASIC
  Threads: 7
  SpinThreshold: 1
  Name: "Batch"
}
Executor {
  Type: IO
  Threads: 1
  Name: "IO"
}
Executor {
  Type: BASIC
  Threads: 3
  SpinThreshold: 10
  Name: "IC"
  TimePerMailboxMicroSecs: 100
}
SysExecutor: 0
UserExecutor: 1
IoExecutor: 3
BatchExecutor: 2
ServiceExecutor {
  ServiceName: "Interconnect"
  ExecutorId: 4
}

На статических узлах

Статические узлы берут конфигурацию актор-системы из файла kikimr/cfg/sys.txt.

После замены конфигурации требуется перезапустить узел.

На динамических узлах

Динамические узлы берут конфигурацию из CMS, чтобы изменить ее, можно воспользоваться следующей командой:

ConfigureRequest {
  Actions {
    AddConfigItem {
      ConfigItem {
        // UsageScope: { ... }
        Config {
          ActorSystemConfig {
            <конфиг актор-системы>
          }  
        }
        MergeStrategy: 3
      }
    }
  }
}

```bash
kikimr -s <endpoint> admin console execute --domain=<domain> --retry=10 actorsystem.txt