BigQuery 에서 slot utilization 을 집계하는 SQL

2024-02-26

bigquery 에서 compute pricing 에 on-demand pricing 과 capacity pricing 으로 2가지가 있다. capacity pricing 은 slot 기반의 pricing 이다. 원하는 slot 개수만큼 임대하여 사용하고, 그만큼 비용을 지불한다. 그러니 임대한 slot 을 효과적으로 쓰고 있는지 monitoring 할 필요가 있다. 효과적으로 쓰고 있는지 = 실제 사용한 slot 개수 / 임대한 slot 개수 = slot utilization 으로 볼 수 있겠다.

Example: See total slot usage per minute 문서에서 이러한 slot utilization 을 집계하는 sql 을 알려준다. 그런데 이 sql 을 그대로 가져다가 실행 했을 때 slot_assigned 가 0 으로 나온다. reservation 의 baseline slots 은 0 으로 하고 / max size 를 조절하며 autoscale 하고 있기 때문이다. 저 sql 에서는 autoscale 로 조절되는 slot 개수를 고려하지 않는다.

JOBS_TIMELINE view 는 매 second 마다 집계 되고, RESERVATION_TIMELINE view 는 매 minute 마다 집계 된다. 그러니 매 minute 마다 집계하는 걸로 맞춘다.

with

job_timeline_by_minute as (

select
  project_id,
  reservation_id,
  timestamp_trunc(period_start, minute) as period_start_truncated_to_minute,

  sum(period_slot_ms) as period_slot_ms,
from
  <project-id>.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
where
  -- Avoid duplicate byte counting in parent and children jobs.
  statement_type != 'SCRIPT'
  or statement_type is null
group by
  project_id
  , reservation_id
  , period_start_truncated_to_minute

)

select
  date(reservation_timeline_by_minute.period_start) as _date_kst,
  reservation_timeline_by_minute.project_id,
  reservation_timeline_by_minute.reservation_id,
  reservation_timeline_by_minute.period_start,
  reservation_timeline_by_minute.autoscale.current_slots as slots,
  job_timeline_by_minute.period_slot_ms / (60 * 1000) as slots_used,
from
  <project-id>.`region-us`.INFORMATION_SCHEMA.RESERVATION_TIMELINE as reservation_timeline_by_minute
left join job_timeline_by_minute on reservation_timeline_by_minute.project_id = job_timeline_by_minute.project_id
  and reservation_timeline_by_minute.reservation_id = job_timeline_by_minute.reservation_id
  and reservation_timeline_by_minute.period_start = job_timeline_by_minute.period_start_truncated_to_minute