Вытеснение

Когда отдельные джобы операций выполняются долго, возможна ситуация, когда операция захватывает весь кластер и не позволяет другим операциям запустить джобы. В этом случае другие операции голодают (страдают, starve). Для решения описанной проблемы в планировщике реализован механизм вытеснения (preemption).

Каждая операция может находиться в одном из трех состояний:

  • normal — операция получает достаточное количество ресурсов;
  • starving for fair_share — операция получает количество ресурсов, не меньше ее минимальной гарантированной доли, но заметно меньше честной доли;
  • starving for min-share — операция получает количество ресурсов, заметно меньше даже минимальной гарантированной доли.

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

Настройки вытеснения

Вытеснение регулируется следующими параметрами (в скобках указаны значения по умолчанию, если заданы):

  • fair_share_starvation_tolerance — максимально допустимое относительное отклонение usage_ratio операции от её fair_share при котором операция еще не считается страдающей. Параметр призван побороть проблемы возникающие из-за фрагментации ресурсов;
  • fair_share_preemption_timeout — время, после которого операция с usage_ratio меньшим, чем fair_share_ratio * tolerance, считается страдающей;
  • enable_aggressive_starvation (false) — включает агрессивное вытеснение ради операций в данном пуле и во всех потомках. Агрессивное вытеснение — возможность вытеснять джобы других операций: всех запущенных операций, не только операций в данном пуле и потомках, вплоть до того момента, когда у операции останется лишь определённая доля гарантированных ей ресурсов. Данная граница регулируется в настройках планировщика отдельно для каждого кластера. Эта опция позволяет дать гарантии по времени запуска крупных джобов, требующих существенную долю ресурсов узла кластера;
  • allow_aggressive_starvation_preemption (true) — разрешает агрессивное вытеснение джобов в данном пуле, точнее, вытеснение джобов не будет запрещено данным пулом, если usage_ratio у пула больше половины (точное значение границы является настройкой кластера) fair_share_ratio. Когда на кластере есть агрессивно страдающие операции, по умолчанию разрешается вытеснять джобы других операций вплоть до половины доли, положенной не страдающим операциям. В случае если для процесса важны строгие гарантии времени его выполнения, данное вытеснение может такие гарантии нарушать. Поэтому для процессов, которым требуются гарантии, следует выключать агрессивное вытеснение.