LabHub
배우기 러닝패스 코스

HPCとSlurm

ノードが抜けたとき読む順序

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

Slurm 장애 진단은 sinfo 로 범위를 좁히고 slurmctld.log 에서 이유를 읽는 것으로 대부분 끝난다.

概念マップ: sinfo 로 범위를 좁히고 slurmctld.log 에서 이유를 읽는 것・그 이유 문자열・자동 복귀 안 함・설정이 실제와 맞지 않음

왜 이게 필요했나

"작업이 안 돕니다" 라는 신고를 받으면 확인할 곳이 여럿이다. 작업이 큐에서 대기 중인가, 노드가 빠졌는가, 인증이 깨졌는가, 설정이 잘못됐는가. 그런데 순서가 있다.

어떻게 동작하나

1단계 — 전체 상태

sinfo
sinfo -R                        # DRAIN/DOWN 이유만
sinfo -N -l                     # 노드별 상세

sinfo -R 이 특히 유용하다. 빠진 노드와 그 이유 문자열만 보여 준다.

노드 상태의 의미.

상태
idle 정상, 작업 없음
alloc / mix 전체/일부 자원이 할당됨
drain 관리자 또는 시스템이 뺐다. 자동 복귀 안 함
down 응답 없음 또는 등록 실패
inval 설정이 실제와 맞지 않음
fail / failg 하드웨어 문제 보고

2단계 — 이유 읽기

scontrol show node gpu-node01 | grep -i reason
tail -100 /var/log/slurm/slurmctld.log
tail -100 /var/log/slurm/slurmd.log     # 해당 노드에서

로그에 나오는 대표 메시지와 원인.

메시지 원인
Low socket*core*thread count CPUs 가 소켓×코어×스레드와 불일치
Low RealMemory 설정한 메모리가 노드의 실제보다 큼
gres/gpu count reported lower than configured slurm.confgres.conf 개수 불일치
Munge decode failed: Expired credential 시계 불일치
Munge decode failed: Invalid credential 키 불일치
partition X has unknown node Y 정의되지 않은 노드를 파티션이 참조
Node unexpectedly rebooted 노드 재부팅 후 등록

munge 오류의 두 종류를 구분하는 것이 중요하다. Expired credential 은 시계 문제라 NTP 를 보고, Invalid credential 은 키 문제라 /etc/munge/munge.key 를 비교한다. 완전히 다른 대응이다.

3단계 — 작업이 안 도는 경우

노드는 멀쩡한데 작업이 대기만 한다면 squeue 의 REASON 열을 본다.

REASON 대응
Resources 요청한 자원이 아직 안 남았다. 정상 대기
Priority 우선순위가 높은 작업이 앞에 있다
Dependency 선행 작업 대기
PartitionTimeLimit --time 이 파티션 최대치를 넘었다
PartitionNodeLimit 요청 노드 수가 파티션 한도를 넘었다
ReqNodeNotAvail 지정한 노드가 사용 불가
QOSMax... QOS 제한에 걸렸다

PartitionTimeLimit 같은 것은 영원히 대기한다. 자원이 생겨도 절대 시작하지 않으므로, 사용자가 요청을 고쳐 다시 제출해야 한다.

4단계 — 복구

원인을 고쳤으면 노드를 명시적으로 복귀시킨다.

scontrol update NodeName=gpu-node01 State=RESUME
scontrol update NodeName=gpu-node[01-03] State=RESUME
scontrol reconfigure                     # 설정 변경 반영

설정 파일을 고쳤다면 모든 노드에 배포한 뒤 scontrol reconfigure 를 해야 한다. 한 노드만 다르면 그 노드가 다시 빠진다.

노드가 빠지는 것을 미리 잡기

슬럼 운영에서 시간을 가장 많이 잡아먹는 것은 작업 실패가 아니라 노드가 조용히 빠지는 것이다. 사용자는 "느려졌다" 고만 느끼고, 원인은 클러스터 절반이 놀고 있는 것이다.

빠진 이유는 언제나 기록된다.

sinfo -R --format="%50E %12U %19H %N"     # 사유, 지운 사람, 시각, 노드
scontrol show node <노드> | grep -E 'State|Reason|CfgTRES|AllocTRES'

노드가 drain 이 되는 흔한 이유 셋.

사유 실제 원인
Low RealMemory 설정의 메모리 값이 실제보다 크다. 커널이 조금 가져간다
gres/gpu count too low GPU 하나가 사라졌다(nvidia-smi 로 확인)
Kill task failed 작업 프로세스가 안 죽어 노드가 정리되지 않았다

첫 번째가 특히 자주 나온다. slurm.conf 에 물리 메모리 값을 그대로 적으면, 커널과 예약 영역 때문에 실제 가용량이 조금 적어 노드가 곧바로 빠진다. slurmd -C 가 출력하는 값을 쓰고 거기서 조금 더 낮춘다.

slurmd -C          # 이 노드가 보고하는 실제 값

설정을 바꿨으면 전파를 확인한다. slurm.conf 는 모든 노드가 같아야 하고, 바뀐 뒤에는 scontrol reconfigure 가 필요하다. 한 노드만 다르면 그 노드가 계속 빠지는데, 증상은 그 노드의 문제처럼 보인다.

정리 실패는 대개 프로세스가 안 죽어서다. epilog 가 끝나지 않으면 노드가 completing 에 갇힌다. UnkillableStepTimeout 을 넘기면 노드가 drain 된다. 자주 그렇다면 파일 시스템(특히 NFS) 대기로 프로세스가 D 상태에 있는 것이므로, 고칠 곳은 슬럼이 아니라 저장소다.

되살릴 때 사유를 지운다. 상태만 되돌리고 사유를 남기면 다음 헬스체크에서 다시 빠진다.

scontrol update NodeName=<노드> State=RESUME

현장에서 만나는 모습

시계 문제는 주기적으로 재발한다. NTP 가 죽어 있거나 방화벽이 123 포트를 막으면 며칠에 걸쳐 서서히 어긋나다가 어느 날 munge 가 거부하기 시작한다. 클러스터 모니터링에 시계 동기화 상태를 넣어 두는 것이 좋다.

DRAIN 이유 문자열을 지우지 않고 남겨 두는 습관. scontrol update ... State=RESUME 만 하면 이유가 사라진다. 조사 기록을 위해 사유를 어딘가에 남긴 뒤 복귀시키는 팀이 많다.

다음 실습에서 할 것

깨진 설정과 로그가 담긴 픽스처를 받아 원인 네 개를 각각 특정하고, 수정본을 만들고, 복구 절차를 작성하고, RCA 보고서를 남긴다.