cpnr / computing

0 stars 0 forks source link

slurm job 모니터링 telegraf 플러그인 제작 #34

Closed jhgoh closed 7 months ago

jhgoh commented 7 months ago

slurm job 모니터링을 위한 telegraf 플러그인이 필요함.

경북대 KCMS tier3 사이트에서는 telegraf플러그인을 이용해 condor job모니터링중임. 파이썬을 이용해 제작해도 된다고 함.

jhgoh commented 7 months ago

inputs.exec 플러그인을 이용하는 편이 가장 간편할 것으로 보임. https://github.com/influxdata/telegraf/blob/master/plugins/inputs/exec/README.md

[[inputs.exec]] 섹션에서 commands 항목에 실행할 스크립트를 하나 추가하고, 각 설정들을 조정해 주면 될 것으로 보임.

output의 형식은 위 설정의 data_format = "influx"로 설정한다면, 아래의 influx line protocol을 따르면 됨. https://docs.influxdata.com/influxdb/v2/reference/syntax/line-protocol/

즉, 아래 예시와 같은 방식이면 간단할 것으로 보임

myMeasurement,tag1=value1,tag2=value2 fieldKey="fieldValue" 1556813561098000000
jhgoh commented 7 months ago

스크립트 작성 완료, influx에 잘 입력되고 grafana에서 influxQL로 불러올 수 있음을 확인함.

#!/bin/bash

#/usr/bin/squeue --noheader -o 'squeue,user=%u,status=%T,runtime=%M,partition=%P,host=%R' | sort | uniq -c | awk '{print $2" count="$1"i"}'
/usr/bin/squeue --noheader -o 'squeue,user=%u,status=%T,partition=%P,host=%R' | sort | uniq -c | awk '{print $2" count="$1"i"}'
jhgoh commented 7 months ago

패널 추가 완료. 현재 구현한 flux문법에서는 서로 다른 group이 서로 섞여 있을 때 sum() 하는 방법이 잘못되어 있는 듯 해서 수정해야 함. 예를 들어, 한 유저가 서로 다른 partition에 job을 submit한 경우 여러 결과 중 하나만 나오거나, 한 유저의 job이 여러 노드에 분산되는 경우 특정 노드의 job수만 나타날 수 있음.

image
jhgoh commented 7 months ago

column을 drop하지 않고 가능한 정보를 모두 표시하는 방식으로 일단 바꿔 문제를 회피함. slurm jobs by node는 아직 문제 해결되지 않음.

image
jhgoh commented 7 months ago

스크립트 작성 완료, influx에 잘 입력되고 grafana에서 influxDB flux로 불러올 수 있음을 확인함.

#!/bin/bash

#/usr/bin/squeue --noheader -o 'squeue,user=%u,status=%T,runtime=%M,partition=%P,host=%R' | sort | uniq -c | awk '{print $2" count="$1"i"}'
/usr/bin/squeue --noheader -o 'squeue,user=%u,status=%T,partition=%P,host=%R' | sort | uniq -c | awk '{print $2" count="$1"i"}'

output은 이런식으로 나오게 됨:

jhgoh@lugia:~$ squeue_stat.sh 
squeue,user=XXX,status=PENDING,partition=normal,host=(Resources) count=1i
squeue,user=XXX,status=RUNNING,partition=normal,host=entei count=128i
squeue,user=XXX,status=RUNNING,partition=normal,host=ho-oh count=64i
squeue,user=XXX,status=RUNNING,partition=normal,host=raikou count=128i
squeue,user=XXX,status=RUNNING,partition=normal,host=suicune count=128i
squeue,user=YYY,status=PENDING,partition=gpu2,host=(JobHeldAdmin) count=4i
squeue,user=YYY,status=RUNNING,partition=gpu2,host=mewtwo count=1i
jhgoh commented 7 months ago

현재 세팅에서는 job monitoring을 1분에 한번씩 하도록 했기 때문에 아주 짧은 시간 동안 변화는 모니터링에서 빠짐. 어차피 job monitoring은 오랜 시간동안 점유하는 job들에 대해서 보는 것이 더 중요할 것이기 때문에 수 분 정도 간격에서의 변화는 중요하지 않을 것으로 생각함.

jhgoh commented 7 months ago

현재 사용중인 flux 구문:

from(bucket: "HEP-KHU")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._name == "squeue_slurm")
  |> drop(columns: ["runtime", "partition", "user", "status"])
  |> drop(columns: ["_start", "_stop"])

running job만 확인하는 flux:

from(bucket: "HEP-KHU")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._name == "squeue_slurm")
  |> filter(fn: (r) => r["status"] == "RUNNING")
  |> drop(columns: ["runtime", "status"])
  |> drop(columns: ["_start", "_stop"])
jhgoh commented 7 months ago

버그 수정 완료. 아래와 같이 구현:

  1. 시간, 유저(또는 필요한 다른 컬럼)별로 합쳐질 대상들로 group 지정
  2. group으로 묶여진대로 맞춰 _value를 sum()함
  3. group()으로 그룹 해제
  4. pivot()으로 time, value를 재지정 해 time series형태로 재변환
from(bucket: "HEP-KHU")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._name == "squeue_slurm")
  |> filter(fn: (r) => r["status"] == "RUNNING")
  |> group(columns: ["_time", "user", "partition"])
  |> sum()
  |> group()
  |> pivot(rowKey: ["_time"], columnKey: ["user", "partition"], valueColumn: "_value")
  |> drop(columns: ["runtime", "status"])
  |> drop(columns: ["_start", "_stop"])