간단히 말해서:Slurm 클러스터에서는 업무 시간 동안 각 소유자가 사용할 수 있고 응답할 수 있는 일부 컴퓨터가 필요합니다.
질문:저는 약 10개 노드로 구성된 작지만 성장하고 있는 이기종 클러스터를 관리하고 있는데 그 중 일부는 전용이 아닙니다. 이는 응답형 컴퓨터에서 작업하는 것을 선호하는 동일한 네트워크의 동료가 업무 시간 동안 사용하는 데스크톱 컴퓨터입니다. 그러나 저녁과 주말에는 일괄 작업을 위해 모든 머신과 몇 개의 전용 노드를 함께 풀링합니다.
최근에 HT Condor에서 Slurm으로 전환한 이유는 클러스터와 관련이 없는 기계 소유자의 정규 작업 우선 순위를 지정하는 것 외에 모든 면에서 우리 요구 사항에 더 적합했기 때문입니다. Condor에서는 다음 조건에 따라 작업을 일시 중지, 선점 또는 종료하도록 노드를 구성할 수 있습니다.
- 시간대 또는 평일(평일 낮 시간에 기계를 사용함)
- 키보드 활동(일부 사용자는 늦게까지 일할 수 있음)
- 클러스터에서 생성된 프로세스 이외의 프로세스에서 CPU 활동(사용자는 자신의 프로세스 중 일부를 밤새 실행되도록 둘 수 있으며 이러한 프로세스는 간섭 없이 실행되어야 함)
Slurm을 사용할 때 이러한 동작을 에뮬레이션하거나 이를 사용하는 컴퓨터 소유자를 방해하지 않는 방법을 찾고 싶습니다.
추가 정보:모든 노드는 Ubuntu 18.04-19.04를 사용하고 버전 18+인 apt에서 slurm을 찾습니다. 클러스터는 cgroup을 사용하여 제한을 적용하고 아래와 같이 코어를 소비 가능한 리소스로 사용하도록 구성됩니다.
SelectType=select/cons_res
SelectTypeParameters=CR_Core
대부분의 데스크톱 컴퓨터에는 sudo 권한이 없으므로 "설정하고 잊어버리는" 솔루션(동료의 PC를 구성하는 동안)이나 sudo가 있는 헤드 노드에서 수행할 수 있는 작업이 필요합니다.
노력하다:다음 옵션을 고려했지만 여전히 만족스럽지 않습니다.
- 시간/주중의 경우 crontab 또는 systemd와 slurmd.service의 OnCalendar 이벤트를 사용하여 다음을 수행합니다.
- 데몬 프로세스를 시작/중지합니다. 이것은 아마도 가장 쉬운 방법일 것이지만, 불결한 방법으로 작업을 죽일 것입니다.
- 스크립트를 시작하고 scontrol을 사용하여 노드 상태를 down/resume/drain/etc(헤드 노드일 수도 있음)로 설정합니다. scontrol 대화형 모드 외부에서 수행하는 방법을 모르기 때문에 아직 이것을 시도하지 않았습니다.
- 응답성을 높이려면 "systemd edit slurmd.service"를 사용하여 [Service]에서 CpuWeight=5를 설정하여 리소스 제어를 추가하세요. 이는 다른 모든 프로세스의 우선순위를 정하기로 되어 있지만 어쨌든 해당 작업으로 인해 컴퓨터 속도가 느려지기 때문에 예상한 대로 작동하지 않는 것 같습니다. 나는 그 작업이 slurmd의 하위 프로세스이고 동일한 CpuWeight의 영향을 받을 것이라고 생각했습니다. 이것이 실제로 작동한다면 전체 문제를 해결할 수 있습니다.
내가 원하는 것을 달성하려면 더 좋은 방법이 있어야 한다고 생각합니다. 도움을 주시면 감사하겠습니다.
답변1
며칠 후 나는 내 질문에 답할 수 있었습니다. 돌이켜보면 쉬웠다.
민감도:
slurmd 데몬 은 slurmd -h
. slurmd -n 19
데스크탑 컴퓨터에서는 그냥
- 편집 후 에
/etc/systemd/system/slurmd.service
추가합니다 . 즉,-n 19
ExecStart
ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS -n 19
- systemd 데몬을 다시 로드하세요.
systemctl daemon-reload
- slurmd 데몬을 다시 시작합니다.
systemctl restart slurmd.service
메모리 예약:
일부 메모리는 시스템용으로 예약될 수 있습니다. MemSpecLimit=8000
노드 사양을 추가하여 소유자에게 8GB를 남겨 두었 습니다 slurmd.conf
. 실제로 메모리 제한을 적용하려면 몇 가지 추가 단계가 필요합니다.
SelectTypeParameters=CR_Core_Memory
Core와 Memory를 에서 설정하여 소비되는 리소스로 선택합니다slurmd.conf
.TaskPlugin=task/affinity,task/cgroup
설정 을 통해 cgroups 작업 플러그인을 추가한slurmd.conf
다음 .ConstrainRAMSpace=yes
cgroup.conf
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Ubuntu를 사용하고 있으므로 다음 줄을 추가하여 메모리 및 스왑 cgroup을 활성화합니다./etc/default/grub
평일 근무시간
내 동료 중 일부는 근무 시간 동안 방해 요소가 전혀 없기를 원합니다. 이는 scontrol
헤드 노드에서 쉽게 수행할 수 있으며, 작업 시간 동안 노드 상태를 "끄기"로 설정하고 작업 시간 후에 "재개"로 설정합니다. 나는 이것을 자동화하기 위해 systemd 타이머를 사용합니다.
- 먼저 다음 명령을 사용하여 관련 데스크톱의 노드 상태를 업데이트하는 실행 가능한 스크립트를 만듭니다
scontrol
.
#!/bin/bash
# slurm-update.sh - Updates the state on nodes belonging to the work-hour desktops partition.
systemctl start slurmd
for node in $(sinfo -h --partition=WHdesktops --format="%n"); do
state=$(sinfo -h --node=$node --format="%T")
echo "Setting node $node to state=$1 with reason=$2"
scontrol update NodeName=$node state=$1 reason="$2" || echo "State on $node is already $(sinfo -h --node=$node --format=\"%T\")"
done
여기에는 새 상태와 해당 이유라는 두 가지 매개변수가 필요합니다.
/etc/systemd/system
특정 시간에 위 스크립트를 실행하려면 디렉터리에 서비스/타이머 파일 쌍을 만듭니다 . 설정하려는 각 상태에 대해 쌍을 만듭니다(예를 들어 설정, 배수 및 복구를 위해 3개의 쌍을 만들었습니다). "아래"로 설정된 쌍은 다음과 같습니다.
# /etc/systemd/system/slurm-down.service:
[Unit]
Description=Shut down all SLURM desktop nodes
[Service]
Type=simple
ExecStart=/bin/bash /mnt/nfs/slurm_fs/systemd/slurm-update.sh down afterhours
StandardError=journal
그리고
# /etc/systemd/system/slurm-down.timer:
[Unit]
Description=Timer for shutting down slurm on desktop nodes on weekdays
[Timer]
Unit=slurm-down.service
OnBootSec=10min
# Run hourly on weekdays between 8:05 to 18:05
OnCalendar=Mon..Fri *-*-* 8..18:05:00
[Install]
WantedBy=multi-user.target
다시 로드 데몬을 사용한
systemctl daemon-reload
다음 서비스가 아닌 타이머만 활성화하고 시작합니다systemctl enable --now slurm-down.timer
.몇 시간 후에 상태를 복원하는 단계를 반복하고 선택적으로 가동 중지 시간 1시간 정도 전에 배수 상태를 반복합니다.