<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Batch Scheduling on jyukki's Blog</title><link>https://jyukki.com/tags/batch-scheduling/</link><description>Recent content in Batch Scheduling on jyukki's Blog</description><generator>Hugo -- 0.147.0</generator><language>ko-KR</language><lastBuildDate>Tue, 06 Oct 2026 10:06:00 +0900</lastBuildDate><atom:link href="https://jyukki.com/tags/batch-scheduling/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 개발 트렌드: Carbon-Aware Workload Scheduling, 전력 탄소 집약도를 배치 정책에 넣는 팀이 먼저 정해야 할 것</title><link>https://jyukki.com/posts/2026-10-06-carbon-aware-workload-scheduling-trend/</link><pubDate>Tue, 06 Oct 2026 10:06:00 +0900</pubDate><guid>https://jyukki.com/posts/2026-10-06-carbon-aware-workload-scheduling-trend/</guid><description>탄소 집약도 신호를 이용해 지연 허용 배치·재색인·백필·AI 평가 작업의 실행 시각과 리전을 조정하는 흐름을, SLO·비용·데이터 경계·실패 복구까지 포함한 실무 기준으로 정리합니다.</description><content:encoded><![CDATA[<p>클라우드 비용 최적화는 오랫동안 “사용하지 않는 인스턴스를 끄고, 예약 할인과 autoscaling을 맞춘다”는 문제로 다뤄졌습니다. 최근 플랫폼 팀이 보는 다음 단계는 <strong>언제, 어디서, 어떤 지연 허용 작업을 실행할 것인가</strong>입니다. 전력의 탄소 집약도는 시간과 지역에 따라 달라지고, 재색인·분석·백필·AI evaluation·대용량 변환처럼 즉시 끝날 필요가 없는 작업은 실행 시각을 조정할 여지가 있습니다.</p>
<p>하지만 carbon-aware scheduling은 서버를 친환경 시간대로 자동 이동시키는 기능이 아닙니다. 사용자 데이터의 리전 경계, 고객과 약속한 deadline, 큐 적체, GPU·spot 가용성, 네트워크 전송량, 복구 가능성이 먼저입니다. 이 글은 <a href="/posts/2026-07-20-kubernetes-custom-metrics-autoscaling-contract-trend/">Kubernetes Custom Metrics와 업무 신호 기반 Autoscaling</a>, <a href="/posts/2026-08-03-ai-usage-metrics-cost-governance-contract-trend/">AI Usage Metrics Contract</a>, <a href="/posts/2026-09-23-prometheus-otel-interoperability-metric-identity-trend/">OpenTelemetry Metric Identity</a>, <a href="/learning/deep-dive/deep-dive-capacity-planning-littles-law-saturation/">용량 계획과 Little’s Law</a>를 연결해, 이 흐름을 운영 정책으로 바꾸는 기준을 정리합니다.</p>
<h2 id="이-글에서-얻는-것">이 글에서 얻는 것</h2>
<ul>
<li>탄소 인식 스케줄링에 적합한 workload와 절대 옮기면 안 되는 workload를 구분합니다.</li>
<li>SLO, data residency, capacity를 hard constraint로 두고 탄소·비용을 soft objective로 최적화하는 방법을 배웁니다.</li>
<li>탄소 신호의 신선도·예측 오차·region 이동 비용을 운영 의사결정에 반영합니다.</li>
<li>“절감 추정”을 과장하지 않고 deadline·재시도·사용자 영향과 함께 보고하는 지표를 만듭니다.</li>
</ul>
<h2 id="핵심-개념이슈">핵심 개념/이슈</h2>
<h3 id="1-모든-작업이-이동-후보는-아니다">1) 모든 작업이 이동 후보는 아니다</h3>
<p>carbon-aware 정책의 첫 질문은 “어느 리전이 더 친환경적인가”가 아니라 “이 작업을 늦추거나 옮겨도 되는가”입니다. 다음처럼 작업을 세 부류로 나누면 출발점이 명확해집니다.</p>
<table>
  <thead>
      <tr>
          <th>분류</th>
          <th>예시</th>
          <th>정책</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>즉시 실행</td>
          <td>결제 승인, 로그인, 권한 회수, 보안 알림</td>
          <td>탄소 신호와 무관하게 가장 가까운 정상 경로에서 실행</td>
      </tr>
      <tr>
          <td>deadline 보장</td>
          <td>야간 정산, 고객 export, 일별 지표 집계</td>
          <td>정해진 deadline 안에서만 시각 조정</td>
      </tr>
      <tr>
          <td>유연 실행</td>
          <td>재색인, 테스트 fixture 생성, 비긴급 backfill, 대규모 evaluation</td>
          <td>탄소·비용·용량 점수가 좋은 슬롯을 선택</td>
      </tr>
  </tbody>
</table>
<p>예를 들어 “매일 06:00까지 끝나야 하는 집계”가 02:00~06:00의 4시간 창을 가진다면, scheduler는 탄소 신호가 낮은 시간대를 선호할 수 있습니다. 그러나 05:10이 되어 아직 backlog가 남았다면 최적화보다 deadline 보장이 우선입니다. 이때 기다리는 것은 절감이 아니라 SLO 위반입니다.</p>
<h3 id="2-탄소-점수는-하나의-input일-뿐이다">2) 탄소 점수는 하나의 input일 뿐이다</h3>
<p>스케줄러가 작업 후보를 고를 때 최소 네 층을 분리합니다.</p>
<ol>
<li><strong>Hard constraint</strong>: 허용 리전, data residency, deadline, 보안 등급, 필요한 accelerator, 최대 비용</li>
<li><strong>Safety gate</strong>: 현재 queue age, downstream 포화도, checkpoint 유무, 재시도 가능성</li>
<li><strong>Soft objective</strong>: 탄소 집약도, spot 가격, 유휴 용량, 예상 실행 시간</li>
<li><strong>Fallback</strong>: 신호가 stale·미수집·상충할 때 원래 schedule과 리전을 유지</li>
</ol>
<p>단순한 점수식은 다음 정도로 시작할 수 있습니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>eligible = residency_ok AND deadline_feasible AND capacity_ok AND checkpointable
</span></span><span style="display:flex;"><span>score = 0.45 * carbon_score + 0.25 * cost_score + 0.20 * capacity_score + 0.10 * locality_score
</span></span></code></pre></div><p>여기서 점수는 eligibility를 대체하지 않습니다. EU 보관 데이터가 다른 리전의 낮은 탄소 점수 때문에 이동하면 안 되고, 30분 후 deadline인 작업을 “두 시간 뒤 더 깨끗한 전력” 때문에 미뤄서도 안 됩니다. <code>eligible=false</code>면 탄소 점수가 아무리 좋아도 후보에서 제외합니다.</p>
<h3 id="3-시간-이동이-리전-이동보다-먼저다">3) 시간 이동이 리전 이동보다 먼저다</h3>
<p>지역을 바꾸는 정책은 데이터 복제, egress 비용, cache miss, 디버깅 복잡도를 동반합니다. 그래서 첫 도입은 같은 리전에서 실행 시각만 옮기는 time shifting이 안전합니다. 예를 들어 UTC 새벽에 매시간 실행하던 비긴급 report compaction을 6시간 window 안에서 한 번 실행하도록 바꾸는 식입니다.</p>
<p>리전 이동은 아래 조건을 모두 만족할 때만 검토합니다.</p>
<ul>
<li>입력 데이터가 이미 해당 리전에 있고, 복제·전송이 별도 탄소·비용 이득을 상쇄하지 않는다.</li>
<li>고객 계약과 데이터 주권이 허용한다.</li>
<li>checkpoint와 결과 artifact가 region-independent identifier로 추적된다.</li>
<li>실패 시 원래 리전에서 재개할 복구 경로가 있다.</li>
<li>이동 전후 latency·비용·성공률을 최소 2주간 비교했다.</li>
</ul>
<p>특히 AI batch는 GPU가 있는 곳으로 옮기기 쉬워 보여도, 모델 가중치 이동과 데이터 복사, queue egress가 커지면 결과가 달라집니다. “낮은 carbon intensity”라는 외부 신호 하나가 전체 lifecycle의 절감 근거가 되지는 않습니다.</p>
<h2 id="실무-적용">실무 적용</h2>
<h3 id="1-workload-contract에-유연성-필드를-추가한다">1) workload contract에 유연성 필드를 추가한다</h3>
<p>platform 팀이 모든 job을 추측해서 옮기면 사고가 납니다. producer가 job의 경계를 명시해야 합니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">workload_contract</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">name</span>: nightly-search-reindex
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">earliest_start</span>: <span style="color:#f1fa8c">&#34;00:00&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">deadline</span>: <span style="color:#f1fa8c">&#34;06:00&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">max_deferral_minutes</span>: <span style="color:#bd93f9">240</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">residency</span>: [ap-northeast-2]
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">checkpoint</span>: required
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">cancellation</span>: safe
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">fallback</span>: run_by_deadline
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">carbon_policy</span>: prefer_lower_intensity
</span></span></code></pre></div><p><code>max_deferral_minutes</code>가 없으면 scheduler는 늦춰도 되는지 모릅니다. checkpoint가 없으면 중간 중단이 손실 또는 이중 실행으로 이어질 수 있습니다. 이 계약은 <a href="/learning/deep-dive/deep-dive-workload-aware-queue-partitioning-fair-scheduling/">워크로드 인식 큐 분할과 공정 스케줄링</a>의 cost class처럼, 작업의 실행 조건을 producer와 platform 사이에 명시하는 장치입니다.</p>
<p>초기 기준은 보수적으로 둡니다. deadline까지 남은 시간이 예상 실행시간 p95의 <strong>2배 미만</strong>이면 즉시 실행하고, 탄소 신호가 <strong>60분 이상 stale</strong>이면 최적화를 끕니다. 같은 작업이 두 번 checkpoint 복구에 실패하면 그날은 자동 이동을 중지하고 기본 리전에서 실행합니다.</p>
<h3 id="2-shadow-schedule로-효과와-실패를-동시에-측정한다">2) shadow schedule로 효과와 실패를 동시에 측정한다</h3>
<p>처음부터 작업 시작 시각을 바꾸지 말고 2주 동안 “현재 schedule”과 “carbon-aware 추천 schedule”을 나란히 계산합니다. 실제 실행은 기존 정책을 따르고, 추천이 달랐던 경우에 아래를 기록합니다.</p>
<ul>
<li>추천 지연 시간과 deadline slack</li>
<li>탄소·비용 신호의 값과 수집 시각</li>
<li>예상 실행 시간과 실제 p95 실행 시간</li>
<li>옮겼다면 필요한 데이터 이동량과 cache warm-up 비용</li>
<li>해당 슬롯에서 발생했을 retry·preemption·queue backlog 위험</li>
</ul>
<p>이 비교가 있어야 낮은 점수만 보고 SLA를 위협하는 추천을 제거할 수 있습니다. 절감 추정치는 <code>estimated_kgco2e_avoided</code> 하나로 끝내지 말고, 계산에 쓴 전력·리전·실행시간·신호 version·결측 구간을 함께 남겨야 합니다. 그렇지 않으면 월말 보고가 측정이 아니라 홍보 문구가 됩니다.</p>
<h3 id="3-운영-지표는-efficiency와-reliability를-같이-본다">3) 운영 지표는 efficiency와 reliability를 같이 본다</h3>
<p>추천 대시보드에는 탄소 관련 숫자만 크게 놓지 마세요. 다음 지표를 같은 화면에서 봅니다.</p>
<table>
  <thead>
      <tr>
          <th>지표</th>
          <th>시작 기준</th>
          <th>의미</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>deadline miss rate</td>
          <td>0% 목표</td>
          <td>최적화가 약속을 깨지 않는지</td>
      </tr>
      <tr>
          <td>carbon signal freshness</td>
          <td>60분 이하</td>
          <td>stale input으로 움직이지 않는지</td>
      </tr>
      <tr>
          <td>deferred job recovery rate</td>
          <td>99% 이상</td>
          <td>미뤄진 작업이 결국 정상 완료되는지</td>
      </tr>
      <tr>
          <td>checkpoint restart rate</td>
          <td>5% 이하</td>
          <td>중단·이동 비용이 과하지 않은지</td>
      </tr>
      <tr>
          <td>data transfer per moved job</td>
          <td>baseline 대비 추적</td>
          <td>이동 이득이 egress로 상쇄되는지</td>
      </tr>
      <tr>
          <td>estimated avoided emissions</td>
          <td>방법론·범위 포함</td>
          <td>추정치를 투명하게 비교하는지</td>
      </tr>
  </tbody>
</table>
<p>queue age와 retry rate가 악화되면 scheduler는 탄소 정책을 끄고 기본 deadline 정책으로 돌아가야 합니다. <a href="/posts/2026-07-20-kubernetes-custom-metrics-autoscaling-contract-trend/">Custom Metrics 기반 Autoscaling</a>처럼 사용자 영향과 가까운 신호가 비용·효율 점수보다 우선입니다.</p>
<h2 id="트레이드오프주의점">트레이드오프/주의점</h2>
<p>첫째, 탄소 집약도 API는 예측값이거나 지연된 관측값일 수 있습니다. 5분 전의 전력 구성과 다음 한 시간의 실제 구성은 다를 수 있으므로, 이를 정확한 배출 측정으로 표현하면 안 됩니다. 신호의 source, timestamp, region mapping, 결측 처리 방식을 문서화하고, 신호가 없을 때는 “평균값으로 추정”보다 <strong>정책을 보수적으로 유지</strong>하는 편이 낫습니다.</p>
<p>둘째, 느린 실행이 항상 더 친환경적이지는 않습니다. 낮은 우선순위 작업을 너무 오래 미루면 backlog가 커지고, 마감 직전에 worker를 한꺼번에 늘리며 더 큰 peak를 만들 수 있습니다. Little’s Law 관점에서 arrival rate와 처리율을 보지 않으면 green scheduling은 단순한 queue debt 축적이 됩니다. job별 최대 지연과 drain capacity를 함께 계산해야 합니다.</p>
<p>셋째, 지속가능성 지표가 비용 절감의 포장지가 되어서는 안 됩니다. spot 인스턴스가 싸고 탄소 점수가 낮더라도, preemption 때문에 재실행이 늘거나 데이터가 다른 리전으로 불필요하게 움직이면 사용자·운영 비용이 올라갑니다. 환경 목표는 reliability와 compliance를 우회하는 승인 근거가 아니라, 제약조건을 통과한 선택지의 우선순위를 정하는 기준이어야 합니다.</p>
<h2 id="체크리스트-또는-연습">체크리스트 또는 연습</h2>
<ul>
<li><input disabled="" type="checkbox"> workload마다 즉시 실행·deadline 보장·유연 실행 중 하나가 지정돼 있다.</li>
<li><input disabled="" type="checkbox"> deadline, 최대 지연, 예상 실행시간 p95, checkpoint 가능 여부, fallback이 contract에 있다.</li>
<li><input disabled="" type="checkbox"> data residency·보안 등급·필수 accelerator가 탄소 점수보다 먼저 eligibility를 결정한다.</li>
<li><input disabled="" type="checkbox"> 탄소·비용·용량 신호의 timestamp와 stale fallback이 명시돼 있다.</li>
<li><input disabled="" type="checkbox"> time shifting을 먼저 적용했고, region 이동은 데이터 이동량과 복구 경로까지 검증했다.</li>
<li><input disabled="" type="checkbox"> deadline miss, queue age, retry, checkpoint restart가 기준을 넘으면 기본 schedule로 돌아간다.</li>
<li><input disabled="" type="checkbox"> 절감 추정치에는 범위·계산 버전·결측 구간·가정이 함께 남는다.</li>
</ul>
<p>이번 주에는 야간 작업 세 개만 골라 <code>earliest start</code>, <code>deadline</code>, <code>p95 실행시간</code>, <code>checkpoint</code>, <code>허용 리전</code>을 적어 보세요. 그중 deadline slack이 2시간 이상이고 취소·재개가 안전한 작업 하나를 shadow schedule에 올립니다. 탄소 점수보다 먼저 “내일 아침까지 반드시 끝나야 하는가”, “실패하면 어디서 재개하는가”를 답할 수 있다면, 그때부터 carbon-aware scheduling은 구호가 아니라 관리 가능한 플랫폼 기능이 됩니다.</p>
]]></content:encoded></item></channel></rss>