Skip to content

slurm 작업 oversubscribe 활성화, max job 수 증가 #138

Description

@jhgoh

유저 잡이 전체 노드를 사용하지 않고 있는 것으로 확인하여 최대 노드 수를 사용하도록 설정함.
HPC에서는 일반적으로 최대 performance를 위해 물리 CPU를 서로 다른 task간 공유하지 않는 것을 기본으로 하지만, 현재 실행하는 대부분의 job들은 HPC잡보다는 HTC잡에 가까우므로 SMT에서 잡 두 개씩 돌도록 할 것임.

아래는 claude가 정리한 내용:

배경

normal 파티션(raikou, entei, suicune, ho-oh, 총 448 CPU)에서 유저들이 제출한 단일 코어 잡이 논리 CPU의 절반밖에 못 쓰는 현상 발견. sinfo상으로는 CPU가 여유 있는데도 새 잡이 Resources로 대기하는 경우가 반복됨.

원인 분석

  • SLURM_HINT=nomultithread가 기본값이라 기본적으로 SMT(하이퍼스레딩) 절반을 안 씀 → SLURM_HINT=multithread를 /etc/profile.d/로 클러스터 기본값으로 배포, 유저별 override는 가능하게 유지.
  • 위 조치 이후에도 여전히 코어 활용이 반쪽: Slurm은 기본적으로 서로 다른 잡(job) 간에는 물리 코어를 공유하지 않음 (SchedMD FAQ 확인). 즉 독립적인 1-cpu 잡들을 여러 개 돌려도 각 잡이 물리 코어 하나씩(형제 스레드 포함)을 통째로 점유해버려서, 전체 논리 CPU의 절반만 실제로 채워짐.
  • 이 클러스터는 Condor/PBS 스타일(독립적인 단일 스레드 잡들이 아무 논리 CPU나 자유롭게 채움)을 기대하는 워크로드가 대부분이라, Slurm의 기본 코어-배타 정책과 안 맞음.

해결 방법

파티션의 OverSubscribe 파라미터로 코어 공유를 강제 허용:

  • OverSubscribe=FORCE:2 : 물리 코어당 2개 스레드(ThreadsPerCore=2)까지 서로 다른 잡이 나눠 쓰도록 강제. 유저 스크립트 수정 불필요하지만 --exclusive 옵션은 거부됨(opt-out 불가).
  • OverSubscribe=YES:N : 유저가 --oversubscribe로 opt-in해야 공유됨 (기본은 배타).

테스트 (gpu1/lapras에서 검증)

  • Threadripper 3990X, 128 threads. OverSubscribe=FORCE:2 적용 후 256-array 잡 제출 시 정확히 128개 RUNNING, 나머지 PENDING → 스레드 단위로 꽉 채워짐 확인.
  • SLURM_CPU_BIND mask 직접 디코딩으로 서로 다른 두 잡이 같은 물리 코어의 형제 스레드를 나눠 쓰는 것을 실증.
  • AMD 계열 CPU들의 SMT 형제 스레드 번호 규칙(“split-half”: CPU N ↔ CPU N+총스레드수/2) 확인:
    • raikou (EPYC 9334, 128 threads): N ↔ N+64
    • entei, suicune: 동일
    • ho-oh (EPYC 7302, 64 threads): N ↔ N+32
    • lapras (Threadripper 3990X, 128 threads): N ↔ N+64

적용 내역

  • normal 파티션: OverSubscribe=FORCE:2 적용 (기본 공유 모드).
  • 전용 코어가 필요한 유저를 위한 normal_excl 파티션 신설 (같은 4개 노드, OverSubscribe=NO, Default=NO). 필요 시 -p normal_excl로 명시 제출.
  • /etc/slurm/slurm.conf를 hep에서 수정 후 slurmd가 도는 전 노드(raikou, entei, suicune, ho-oh, lapras, naong)에 배포 → scontrol reconfigure.
    • 이 클러스터는 configless 모드(enable_configless) 미사용 → config 변경 시 매번 전체 노드에 수동 배포 필요.
    • 배포 중 normal/normal_excl 둘 다 Default=YES로 겹치는 실수 발견 → normal_excl을 Default=NO로 정정.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    adminServer administration

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions