Динамический учёт потребления CPU

В случае, когда джоб потребляет существенно меньше CPU, чем было заказано в спецификации операции, гарантия CPU джоба может быть уменьшена. Освободившиеся ресурсы могут быть переданы другим джобам, работающим в операциях конкретного пула. За потреблением и изменением гарантий CPU джобов следит процесс job-cpu-monitor.

Периодически с контейнера с джобом снимается значение потребленного CPU за период (check_period). К этому значению применяется экспоненциальное сглаживание с параметром smoothing_factor. Далее рассматриваются последние vote_window_size сглаженных значений и интервал (relative_lower_bound*current_cpu_limit, relative_upper_bound*current_cpu_limit), где current_cpu_limit — текущий лимит, выставленный на контейнере.
После этого каждое значение преобразуется по правилу:

  • -1 — значение < relative_lower_bound*current_cpu_limit;
  • 1 — значение > relative_upper_bound*current_cpu_limit;
  • 0 — в остальных случаях.

Полученные значения суммируются в переменную votes_sum, текущее ограничение current_cpu_limit пересчитывается:

  • votes_sum > votes_decision_threshold => current_cpu_limit *= increase_coefficient
  • votes_sum < -votes_decision_threshold => current_cpu_limit *= decrease_coefficient

Значение current_cpu_limit ограничено снизу опцией min_cpu_limit из конфигурации job-cpu-monitor и сверху опцией cpu_limit из спецификации операции.
В случае, если значение переменной current_cpu_limit изменилось, новое значение выставляется на контейнер и отправляется планировщику, чтобы актуализировать потребление ресурсов в пуле.

job-cpu-monitor стремится держать текущее потребление CPU в интервале между relative_lower_bound и relative_upper_bound от выставленного на контейнере, и сдвигает указанный интервал в большую или меньшую сторону, если потребление выходит за его границы.

Значения по умолчанию (актуальные могут отличаться):

  • check_period = 1000 (ms);
  • smoothing_factor = 0.1;
  • relative_upper_bound = 0.9;
  • relative_lower_bound = 0.6;
  • increase_coefficient = 1.45;
  • decrease_coefficient = 0.97;
  • vote_window_size = 5;
  • vote_decision_threshold = 3;
  • min_cpu_limit = 1.

Перечисленные настройки можно задать в спецификации операции в секции job-cpu-monitor. В секции можно указать опцию enable_cpu_reclaim, которая включает/отключает изменение ограничения CPU. Актуальные значения опций можно посмотреть в веб-интерфейсе на странице операции, на вкладке Specification -> Resulting specification -> job-cpu-monitor.