본문 바로가기
HPC/Slurm

[Slurm]Slurm 환경에서 Abaqus 작업 프로세스가 잔존하는 문제 해결

by Yoon_estar 2024. 12. 23.
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