선점
선점 (Preemption)
이 페이지는 선점(preemption)에 대한 개념 정보를 제공해요. 선점은 더 높은 우선순위 작업의 할당을 배치하기 위해 기존 할당을 축출(evict)하는 것을 말해요. Nomad가 작업 우선순위를 사용해 실행 중인 할당을 언제 선점할지 결정하는 방법과, Nomad가 할당을 선점했는지 확인하는 방법을 알아봐요. nomad plan을 사용해 스케줄러를 드라이 런(dry run)해서 선점이 필요한지 확인해요.
출처: 문서
본문
선점을 사용하면 Nomad가 더 높은 우선순위 작업의 할당을 배치하기 위해 기존 할당을 종료할 수 있어요. 축출된 할당은 클러스터에 실행할 용량이 생길 때까지 일시적으로 자리를 비워요. 이를 통해 운영자는 클러스터 전반의 리소스 경합 상황에서도 높은 우선순위 작업을 실행할 수 있어요.
고급 주제! 이 페이지는 Nomad의 기술적 세부 사항을 다루고 있어요. 이 내용을 이해하지 않아도 Nomad를 효과적으로 사용할 수 있어요. 이 세부 사항은 소스 코드를 직접 뒤지지 않고도 배우고 싶은 사람들을 위해 문서화된 것이에요.
Nomad에서의 선점 (Preemption in Nomad)
Nomad의 모든 작업에는 우선순위가 연관되어 있어요. 우선순위는 평가(evaluation)와 계획(planning) 단계에서 해당 큐를 정렬함으로써 스케줄링에 영향을 줘요(높은 우선순위 작업이 큐에서 앞으로 이동해요).
Nomad는 service, batch, system 작업에 대한 선점 기능이 있어요. Nomad 스케줄러는 상대적으로 높은 우선순위 작업에서 비롯된 새 할당을 위한 용량을 확보하기 위해 낮은 우선순위의 실행 중인 할당을 축출하도록 구성할 수 있고, 축출된 할당을 계획 큐로 다시 보내요.
세부 사항 (Details)
선점은 system 작업에 대해 기본적으로 활성화되어 있어요. scheduler config API 엔드포인트나 nomad operator scheduler set-config 명령어를 사용해 선점을 비활성화하거나 다른 작업 유형에 대해 활성화할 수 있어요.
Nomad는 job priority 필드를 사용해 어떤 실행 중인 할당을 선점할 수 있는지 결정해요. 우선순위가 가까운 작업들이 선점으로 인해 연쇄적인 선점이 발생하는 것을 방지하기 위해, 배치가 필요한 작업과 비교해 우선순위 차이(delta)가 10 이상인 작업의 할당만 선점 대상이 될 수 있어요.
예를 들어 다음 분포의 할당을 가진 노드를 생각해 봐요.
| 작업 (Job) | 우선순위 (Priority) | 할당 (Allocations) | 총 사용 용량 (Total Used capacity) |
|---|---|---|---|
| cache | 70 | a6 | 2 GB 메모리, 0.5 GB 디스크, 1 CPU |
| batch-analytics | 50 | a4, a5 | <1 GB 메모리, 0.5 GB 디스크, 0.5 CPU>, <1 GB 메모리, 0.5 GB 디스크, 0.5 CPU> |
| email-marketing | 20 | a1, a2 | <0.5 GB 메모리, 0.8 GB 디스크>, <0.5 GB 메모리, 0.2 GB 디스크> |
우선순위 75의 작업 webapp이 위 노드에 배치되어야 한다면, batch-analytics와 email-marketing의 할당만 더 낮은 우선순위이므로 선점 대상으로 간주돼요. cache 작업의 할당은 우선순위 값 70이 요구되는 델타 10보다 작으므로 절대 선점되지 않아요.
할당은 가장 낮은 우선순위부터 선택되며, 작업이 요구하는 용량에 얼마나 근접하게 맞는지에 따라 점수가 매겨져요. 예를 들어 우선순위 75 작업이 1GB 디스크와 2GB 메모리를 필요로 한다면, Nomad는 이 요구 사항을 충족하기 위해 할당 a1, a2, a4를 선점해요.
선점 가시성 (Preemption Visibility)
운영자는 allocation API나 alloc status 명령어를 사용해 할당이 선점되었는지 확인할 수 있어요. 선점된 할당은 DesiredStatus가 "evict"로 설정돼요. API의 Allocation 객체에는 선점과 관련된 추가 필드가 두 개 더 있어요.
PreemptedAllocs— 이 필드는 선점을 일으킨 할당에 설정돼요. 이 할당을 배치하기 위해 선점된 할당의 할당 ID를 포함해요. 위 예시에서 jobwebapp을 위해 생성된 할당에는 a1, a2, a4 값이 설정돼요.PreemptedByAllocID— 이 필드는 스케줄러가 선점한 할당에 설정돼요. 이를 선점한 할당의 할당 ID를 포함해요. 위 예시에서 할당 a1, a2, a4는 이 필드가 jobwebapp의 할당 ID로 설정돼요.
nomad plan과의 통합 (Integration with Nomad plan)
nomad plan은 운영자가 스케줄러를 드라이 런할 수 있게 해줘요. 스케줄러가 작업을 배치하기 위해 선점이 필요하다고 판단하면, 아래에서 보는 것처럼 nomad plan의 CLI 출력에 추가 정보를 표시해요.
$ nomad plan example.nomad.hcl
+ Job: "test"
+ Task Group: "test" (1 create)
+ Task: "test" (forces create)
Scheduler dry-run:
- All tasks successfully allocated.
Preemptions:
Alloc ID Job ID Task Group
ddef9521 my-batch analytics
ae59fe45 my-batch analytics
위 nomad plan 출력에 표시된 할당들이 나중에 작업을 실행할 때 실제로 선택되는 것과 동일하다는 보장은 없어요. 이것은 운영자에게 선점될 수 있는 할당 유형의 샘플을 제공하는 것이에요.