728x90
문제 상황
1. Job Kill 후 프로세스 잔존
Slurm 스케줄러를 사용해 Abaqus 작업을 수행하던 중, 작업이 Kill 되더라도 관련 프로세스가 남아 있는 문제가 발생했습니다. 이로 인해 시스템 자원이 낭비되고, Abaqus 라이선스가 반환되지 않는 상황이 발생했습니다.
2. Abaqus Standard 프로세스 종료 문제
일부 경우에서 작업이 정상적으로 종료되었음에도 불구하고, Abaqus Standard 프로세스(standard.exe)가 종료되지 않아 추가적인 문제가 발생했습니다.
해결 접근 방식(trap & Signal 활용)
1. Signal 처리(SIGTERM)
작업 종료 시 cleanup 함수를 호출하여 잔여 프로세스와 관련된 라이선스를 강제로 정리하도록 설정했습니다.
2. 프로세스 추적 및 강제 종료
pkill 명령어를 사용해 특정 PID를 기반으로 자식 프로세스를 종료하며, .pid 파일을 활용해 추적을 용이하게 했습니다.
리눅스 Signal List
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
주로 사용하는 Signal List
케이스 1 : 비정상 종료 시 잔여 프로세스 처리
주요 해결 포인트
- trap 사용: SIGTERM 시그널 발생 시 cleanup 함수 호출.
- 잔여 프로세스 정리: pkill로 .pid 파일 기반 자식 프로세스 종료.
- 라이선스 반환: 작업 종료 후 Abaqus 라이선스가 자동 반환되도록 설정.
#!/bin/sh
#SBATCH --job-name=e4_crash_m1
#SBATCH --account=prj_alang
#SBATCH --chdir=/home/alang/0.poc_work/abaqus
#SBATCH --output=/home/alang/0.poc_work/abaqus/e4_crash_m1_log.out
#SBATCH --get-user-env
#SBATCH --nodes=1
#SBATCH --tasks-per-node=8
#SBATCH --ntasks=8
#SBATCH --partition=poc_common.q
#SBATCH --licenses=abaqus@slurmdb:12
## abaqus_v6.env 생성
unset SLURM_GTIDS
envFile=abaqus_v6.env
echo "import os" > $envFile
echo "os.environ['ABA_BATCH_OVERRIDE'] = '1'" >> $envFile
NODELIST=$(/engrid/ensched/bin/srun -n $SLURM_NTASKS /bin/hostname | sort -n | uniq -c | awk '{print "[\""$2"\","$1"]"}' | tr '\n' ',' | sed 's/,*$//g')
echo "mp_host_list=[$NODELIST]" >> $envFile
# Signal 처리 (SIGTERM)
trap 'cleanup' SIGTERM
cleanup() {
echo "Cleaning up before exit on node $(hostname)..."
pkill -TERM -P $(cat /tmp/${SLURM_JOB_ID}-${job_name}-${USER}.pid) # 자식 프로세스 종료
exit 0
}
/APP/CAE/abaqus/DassaultSystemes/SIMULIA/Commands/abq2023 job="e4" cpus=$SLURM_NTASKS int &
# 프로세스 추적을 위한 PID 저장
echo $! > /tmp/${SLURM_JOB_ID}-${job_name}-${USER}.pid
wait
케이스 2 : Abaqus Standard 프로세스 잔존 문제 해결
주요 해결 포인트
- STA_FILE 확인 루프: 상태 파일에서 특정 텍스트("THE ANALYSIS HAS")를 검색해 작업 종료 여부를 판단.
- 잔여 프로세스 종료: .pid 기반으로 pkill을 통해 프로세스 강제 종료.
- 추가 안정성: .pid 파일 제거와 Slurm scancel 호출.
#!/bin/sh
#SBATCH --job-name=JOB-241129181735
#SBATCH --output=.gc/JOB-241129181735_log.out
#SBATCH --chdir=/home/clxuser1-hhi/hpc_test_example/abq9
#SBATCH --account=prj_clxuser1-hhi
#SBATCH --nice=500
#SBATCH --get-user-env
#SBATCH --export-file=/home/clxuser1-hhi/hpc_test_example/abq9/.gc/JOB-241129181735_envfile
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --time=365-00:00:00
#SBATCH --partition=hhi_com.n
#SBATCH --licenses=hhi-abaqus@slurmdb:8
export ABAQUSLM_LICENSE_FILE=27000@HHI-abalm01:27000@HHI-abalm02:27000@HHI-abalm03
unset SLURM_GTIDS
envFile=abaqus_v6.env
echo "import os" > $envFile
echo "os.environ['ABA_BATCH_OVERRIDE'] = '1'" >> $envFile
echo "mp_host_list=[$NODELIST]" >> $envFile
# Signal 처리 (SIGTERM)
cleanup() {
echo "Cleaning up before exit on node $(hostname)..."
pkill -TERM -P $(cat /tmp/${SLURM_JOB_ID}-JOB-241129181735-${USER}.pid) # 자식 프로세스 종료
rm -f /tmp/${SLURM_JOB_ID}-JOB-241129181735-${USER}.pid # PID 파일 제거
/APP/enhpc/stools/bin/scancel.abaqus ${SLURM_JOB_ID} # 추가 작업 취소
exit 0
}
/APP/SIMULIA/abaqus/Commands/abq2022 job=s4b cpus=$SLURM_NTASKS int &
# PID 추적
ABAQUS_PID=$!
echo $ABAQUS_PID > /tmp/${SLURM_JOB_ID}-JOB-241129181735-${USER}.pid
# Status 파일 모니터링
STA_FILE="s4b.sta"
while [ -f "${STA_FILE}" ]; do
if grep -q "THE ANALYSIS HAS" "$STA_FILE"; then
echo "Found ' THE ANALYSIS HAS..' in ${STA_FILE}. Terminating Abaqus process..."
pkill -TERM -P $(cat /tmp/${SLURM_JOB_ID}-JOB-241129181735-${USER}.pid) # 작업 강제 종료
/APP/SIMULIA/abaqus/Commands/abq2022 job=s4b terminate
break
fi
sleep 10 # 주기적으로 확인
done
echo "Abaqus job has terminated."
wait
'HPC > Slurm' 카테고리의 다른 글
[Slurm] slurm.conf에서 SelectTypeParameters와 하이퍼 스레딩의 연관성 (0) | 2025.02.02 |
---|---|
[HPC] 하이퍼스레딩(Hyper-Threading) & Slurm 관계 (1) | 2025.01.22 |
[SLURM] SBATCH(2) (0) | 2024.09.09 |
[SLURM] SBATCH(1) (0) | 2024.09.06 |
[SLURM] SRUN 명령어 (1) | 2024.09.05 |