[HPC] SGE와 FlexLM 라이센스 서버 연동하기
Howto integrate SGE and Flexlm License Management
작성자 : 서진우 / 시스존
작성일 : 2009년 4월 8일
1. 개요
SGE를 통해 통합 해석 환경을 구축할 경우, 기본적으로 통합 서버들의 Core 자원을
기준으로 작업을 스케줄링(제출, 대기)하게 된다.
즉 통합 시스템의 전체 사용 가능 Core 수가 64개라고 하면 작업 제출 시 64 Core자원의
사용 가능 유무를 기준으로 Core 사용이 가능한 서버로 작업을 제출하거나, 가용 자원이
없을 경우 “대기” 상태로 큐에 저장하여 관리하게 된다.
하지만 실제 고성능 통합 해석 시스템에 동작되는 어플리케이션의 경우 고가의 라이센스
구매가 필요하고, 도입되는 시스템의 Core 수(제출 작업 가능수)와 같이 S/W 라이센스를
모두 구매할 수는 없는 것이 일반 기업 조직의 현실이다.
때문에 통합 해석 환경의 작업 스케줄링 시스템의 경우 이런 라이센스의 가용 현황을
기준으로 제출된 작업을 관리할 필요가 존재한다.
– 상황 예제 –
통합 해석 환경의 보유 core 수 : 64개
통합 해석 환경의 Fluent 라이센스 수 : 12개
위와 같은 환경에서 A 사용자가 8개의 core와 라이센스를 이용한 해석 작업을 실행했다.
그럼 이제 통합 해석 환경에서 사용가능한 core 수는 56개이고, 사용 가능한 fluent
라이센스 수는 4개가 남아 있다.
이런 상황에서 B 사용자가 8개의 core와 8개의 fluent 라이센스가 필요한 해석 작업을
실행하였다.
그럼 스케줄러 상에서는 56개의 core가 남아 있기 때문에 해당 작업을 실행시키게 된다.
하지만 작업이 실행되면서 core 할당은 정상적으로 이루어 지지만, fluent 실행 시
라이센스 4개가 부족하여, 작업이 종료 되어 진다. B 사용자는 이러한 사실을 모르거나
알더라도 언제 회수 될지 모르는 4개의 라이센스가 회수 될때 까지 시스템 앞에서
대기를 해야하는 상황이 벌어진다.
제출된 작업에서 요청한 core 가 현재 통합 시스템 상황에서 처리하기 부족한 경우에
스케줄러에서 자동으로 필요한 core가 회수 될때까지 작업을 실행하지 않고, 대기 상태
로 기다리게 한다. 라이센스의 경우에도 이와 같은 큐잉 기능이 있다면, 위와 같은 상황
은 해결될 것이다.
위 문제를 해결하기 위해 SGE에서 기본 제공하는 기능이 [Complex Configration] 이다.
Complex를 이용한 Floating 라이센스 관리 방법은 이전의 SGE 문서에 설명한적이 있다.
Complex 설정에서 임의의 소비가능한 자원을 지정하고, 자원의 소비 한계값을 지정할 수 있다.
소비 한계값을 초과하는 작업에 대해서는 자동으로 대기상태로 유지된다.
이 기능을 이용하여 Floating 방식의 네트워크 라이센스 관리가 가능하다.
하지만 이 기능을 이용하기 위해서는 전제 조건이 있다.
– 모든 S/W 라이센스 요청은 SGE로 통합된 서버에서만 이루어져야 한다.
– S/W 라이센스 정책이 core 1개 당 license 1개 할당되어야 한다.
;; abaqus 의 경우 token 형태의 라이센스를 관리하고, job이 실행된면 4개이 token이
발급되고, 그 후 core 1개를 이용하면 1개의 token이 추가로 발급된다.
또한 parallel 기능을 이용하게 되면, 부가적인 token 이 발급된다.
즉 정형화된 라이센스 소비 형태가 이루어 지지 않는 경우 적용이 힘들다.
위 방식의 경우 실제 flexlm 라이센스 서버에서 발급 가능한 라이센스가 10개일 경우,
통합 해석 환경의 SGE에서 10의 license resource를 가상적으로 complex 설정에 등록
하게 된다. 그런 후 사용자가 작업을 제출할때 해당 라이센스를 몇개 사용한다는 정보를
같이 제출한다. ( qsub -l license=2 run.sh )
그럼 SGE 에서는 10개의 소비 가능한 license 자원 중 2개를 소비했다고 생각한다.
위와 같은 방법으로 라이센스를 관리하기 때문에 실제 라이센스 서버의 소비 현황을
반영하는 것은 아니다.
만일 SGE로 구축된 통합 시스템이외의 다른 서버에서 flexlm의 license 자원을 사용한다면,
SGE에서는 이런 현황을 반영할 방법이 없게 된다.
이러한 문제로 SGE에서 실제 Flexlm 의 라이센스 소비 현황을 실시간으로 complex 의 소비 자원의
현황에 반영을 해야하는 필요가 있다.
본문에서는 이와 같은 문제를 해결하는 방법에 대해 설명하고자 한다.
2. SGE 와 FlexLM 연동하기
개요에 설명했듯이 해당 문제를 해결하기 위해서는 SGE와 FlexLM 을 연동할 필요가 있다.
이런한 문제를 해결하기 위해 qlicserver 라는 perl script가 제공된다.
qlicserver 가 해주는 역할은 실제 FlexLM 서버의 라이센스 현황을 lmstat 로 확인한 후,
현재 Flexlm에서의 라이센스 소비 현황을 SGE Complex 항목의 value에 실시간으로 반영하는
것이다.
qlicserver에 대한 자료는 아래 링크를 이용하길 바란다.
http://wiki.gridengine.info/wiki/index.php/Olesen-FLEXlm-Integration
http://wiki.gridengine.info/wiki/index.php/Olesen-FLEXlm-Configuration
qlicserver 관련 자료의 다운로드는 아래 사이트에서 가능하다.
http://gridengine.sunsource.net/servlets/ProjectDocumentList
qlicserver의 초기 버전은 설정 부분이 복잡하고, 추가 설정되는 항목에 대해 비효율적
인 요소가 많았다. 하지만 1.44 버전 이후 부터 XML 형태의 설정방식을 이용함으로 보다
편리한 설정 변경 및 관리가 가능하다. 본문에서 1.44 버전을 이용하여 구축을 한다.
– qlicserver 설치
기본적으로 SGE가 /engrid/ensge 밑에 설치가 되었다고 가정한다.
# mkdir /engrid/ensge/qlicserver
# cp qlicserver-1.44.tar.gz /engrid/ensge/qlicserver/
# cd /engrid/ensge/qlicserver
# tar xzvf qlicserver-1.44.tar.gz
# cd flex-grid/site/
# vi qlic
——————————————————————————
.
my $admin = “clunix”;
my $root = “ensge”; # sge_root
.
$ENV{SGE_ROOT} ||= “/engrid/$root”; # sge_root
$ENV{SGE_CELL} ||= “default”; # sge_cell
.
my $config = {
-cache => ( $siteLocation || ” ) . “/engrid/ensge/qlicserver/flex-grid/site/etc/” . “qlicserver.cache”,
-limits => ( $siteLocation || ” ) . “/engrid/ensge/qlicserver/flex-grid/site/” . “qlicserver.limits”,
};
.
——————————————————————————
# vi qlicserver.config
——————————————————————————
<?xml version=”1.0″?>
<qlicserverConfig>
<parameters type=”overwrite”>
<param name=”dir”>/engrid/ensge/qlicserver/flex-grid/site/etc</param>
<param name=”output”>qlicserver.cache</param>
<param name=”LM_LICENSE_FILE”>27000@grid000:17000@grid000</param>
<param name=”qhost”>qhost.cache</param>
<param name=”qstat”>qstat.cache</param>
<param name=”lmutil”>/usr/abaqus/License/lmutil</param>
<param name=”limits”>qlicserver.limits</param>
<param name=”delay”>10</param>
<param name=”timeout”>5</param>
</parameters>
<resources>
<resource name=”abq_exp” served=”explicit”/>
<resource name=”abq_imp” served=”standard”/>
<resource name=”nastran” served=”NASTRAN”/>
<resource name=”patran” served=”PATRAN” type=”track”/>
<resource name=”abq_cae” served=”cae”/>
<resource name=”abq_viewer” served=”viewer”/>
<resource name=”abq_adams” served=”adams” note=”abaqus postprocess tool”/>
<resource name=”ansys” served=”ansys”/>
<resource name=”ansyshpc” served=”mechhpc”/>
<resource name=”cfx” served=”acfx_solver”/>
<resource name=”cfxhpc” served=”acfx_par_proc”/>
</resources>
</qlicserverConfig>
——————————————————————————-
qlicserver.config 의 주요 항목 설명 ..
<parameters>
<param name=”dir”> : flexlm 의 상태를 체크한 정보를 파일로 저장할 위치
<param name=”output”> : flexlm 현황 정보 저장 파일
<param name=”LM_LICENSE_FILE”> : Flexlm 라이센스 서버 정보 -> 27000@grid000:1055@grid000
<param name=”lmutil”> : lmutil 위치
<param name=”limits”> : qlicserver.limits 파일 명
<param name=”delay”> : flexlm 정보 갱신 주기
<resource>
name : qlic 시 출력되는 S/W 명, SGE Complex name과 일치해야함.
served : flexlm 상에 인식되는 라이센스 명
type=”track” : flexlm 의 현황을 체크하여 반영하지만 SGE_complex와는 연동하지 않음
note : 부가 설명
flexlm 에서 표현하는 라이센스항목의 표기명이 일반 사용자가 흔히 아는 S/W대표명
이 아닌 경우가 많다. abaqus의 explicit solver 의 경우 Flexlm 에서 정의하는 라이
센스명은 “explicit”이다 하지만 사용자는 explicit의 라이센스 현황을 보여 주면,
이것이 abaqus의 explicit 인지 lsdyna의 explicit 인지 알기 힘들다.
그래서 qlicserver.config 설정에서는 사용자가 일반적으로 알수 있는 명칭과 실제
flexlm 에서 정의하는 명칭을 별도의 항목으로 설정하게 된다.
resource 설정 항목의 name 은 일반 사용자가 알고 있는 명으로 설정하고, served
는 flexlm 에서 정의된 라이센스명을 지정하면 된다.
이후 SGE와 Flexlm을 연동하기 위해서는 qlicserver.config 설정의 resource 항목의
name설정 값이 SGE complex name 설정 값과 동일해야 한다.
qlic 에서 flexlm 의 현재 라이센스 사용 현황을 자동으로 체크를 하는데, 이 정보를
SGE에 실시간 반영할때, resource 의 name 값에 대한 라이센스 현황을 SGE complex
의 name 에 대한 value 값에 유동적으로 적용된다.
아래는 위 qlicserver.config 설정된 내용을 SGE Complex 상에서 연동하는 방법이다.
# qmon
[Complex Configuration] 선택
상위에 Attributes 추가 폼에
——————————————————————————-
Name Shortcut Type Relation Requestable Consumable Default Urgency
——————————————————————————-
[abq_exp] [explicit] [INT] [<=] [YES] [YES] [0] [0]
[abq_imp] [standard] [INT] [<=] [YES] [YES] [0] [0]
[nastran] [NASTRAN ] [INT] [<=] [YES] [YES] [0] [0]
[ansys ] [ansys ] [INT] [<=] [YES] [YES] [0] [0]
[ansyshpc] [mechhpc] [INT] [<=] [YES] [YES] [0] [0]
[cfx ] [acfx_solver] [INT] [<=] [YES] [YES] [0] [0]
.
.
와 같이 적용 [Add], 후 [Commit] 선택
[Host Configuration] 선택 -> [Execution Host]
“Hosts” 항목의 “global” 선택 후 “Modify” 선택
[Consumables/Fixed Attribute] 탭의 [Name] 항목을 클릭하면 위에서 추가한 complex
를 추가할 수 있다.
[Value] 값은 0 으로 지정해 둔다. 이후 qlicserver 데몬이 동작하면, 해당 값을 Flexlm
에서 체크하여 유동적으로 반영된다.
# vi qlicserver
——————————————————————————
.
-defaultConfig => qq{
<?xml version=”1.0″?>
<qlicserverConfig>
<!–
<parameters type=”overwrite”>
여기의 설정된 내용을 모두 삭제한다.
</parameters>
–>
<!–
<resources type=”overwrite”>
여기의 설정된 내용을 모두 삭제한다.
</resources>
——————————————————————————-
qlicserver가 실행될때 qlicserver.config 의 설정 내용을 반영하지만, 해당 설정에
없는 내용중 기본설정을 qlicserver 실행 파일 내에 포함한다. 관련 내용을 삭제하길
바란다.
마지막으로 flexlm 의 라이센스 정보를 검색하는 lmutil, lmstat 실행 파일을 시스템
기본 PATH 에 등록해 둔다.
이제 qlicserver 를 실행한다.
# ./qlicserver
아무런 에러가 발생하지 않으면, /engrid/ensge/qlicserver/flex-grid/site/etc 폴더
밑에 아래 파일이 존재하는지를 확인한다.
# cd /engrid/ensge/qlicserver/flex-grid/site/etc
# ls
qhost.cache qlicserver.cache qstat.cache
# cat qlicserver.cache
—————————————————————————–
<?xml version=”1.0″?>
<qlicserver release=”1.44″ releaseDate=”2008-02-29″>
<!– adjustment:
qconf -mattr exechost complex_values NONE global
–>
<query>
<host>grid000</host>
<user>root</user>
<time epoch=”1239183715″>2009-04-08T18:41:55</time>
</query>
<parameters>
<env name=”SGE_ROOT”>/engrid/ensge</env>
<env name=”SGE_CELL”>default</env>
<param name=”LM_LICENSE_FILE”>27000@grid000</param>
<param name=”delay”>10</param>
<param name=”dir”>/engrid/ensge/qlicserver/flex-grid/site/etc</param>
<param name=”limits”>qlicserver.limits</param>
<param name=”lmutil”>/usr/abaqus/License/lmutil</param>
<param name=”output”>qlicserver.cache</param>
<param name=”qhost”>qhost.cache</param>
<param name=”qstat”>qstat.cache</param>
<param name=”timeout”>5</param>
</parameters>
<resources>
<resource name=”NASTRAN” served=”NASTRAN” total=”0″/>
<resource name=”PATRAN” served=”PATRAN” total=”0″/>
<resource name=”abq_adams” served=”adams” total=”99″ free=”99″/>
<resource name=”abq_cae” served=”cae” total=”99″ free=”99″/>
<resource name=”abq_exp” served=”explicit” total=”99″ free=”99″/>
<resource name=”abq_imp” served=”standard” total=”99″ free=”99″/>
<resource name=”abq_viewer” served=”viewer” total=”99″ free=”99″/>
<resource name=”pamcrash” total=”10″ free=”10″ type=”intern”/>
</resources>
</qlicserver>
—————————————————————————–
이제 실제 운영이 되도록 qlicserver 를 데몬 방식으로 실행한다.
단순히 qlicserver를 실행하면, 실행 당시에 flexlm의 정보를 1회만 체크하여 반영한다.
실제 운영할때는 주기적으로 flexlm 정보를 자동 체크해야함으로 데몬 방식으로
실행해야 한다.
# ./qlicserver -d
qlicserver 데몬을 off 하는 방법은 아래와 같다.
# ./qlicserver -k
이제 정상적으로 반영이 되는지를 확인한다.
# ./qlic
——————————————————————————
host = grid000
age = 0:00:05
resource total limit extern intern wait free
——– —– —– —— —— —- —-
NASTRAN ? . . . . .
PATRAN ? . . . . .
abq_adams 99 . . . . 99
abq_cae 99 . . . . 99
abq_exp 99 . . . . 99
abq_imp 99 . . . . 99
abq_viewer 99 . . . . 99
——————————————————————————-
실제 CAE S/W를 실행하여 라이센스 현황이 반영되는지를 확인한다.
SGE의 [Host Configuration] -> [Execution Host] 의 “consumables/Fixed Attributes”
이 값이 Flexlm 값에 의해 반영되는지를 확인한다.
정상적으로 작동이 되어지면, 실제 SGE를 통해 해석 작업을 제출할 경우 -l 옵션을 이용
하여 작업을 제출한다.
# qsub -l explicit=0 /home/admin/abaqus.sh
SGE와 Flexlm이 연동된 상태에서는 작업 제출 시 -l 옵션뒤에 explicit 자원의 요청
값을 0으로 해주어야 한다. 만일 -l explicit=1 이라고 해서 제출하면..
flexlm 상에서 해석 S/W가 실행되면서 소비되는 라이센스가 자동으로 적용되고, 또..
-l 옵션 뒤에 붙는 count 만큼 추가로 소비되는 문제가 발생한다.
만약 관리하고자 하는 라이센스가 flexlm 방식이 아닌 다른 방식이여서, SGE의 Complex
상에서만 관리하되, qlic 에는 라이센스 사용현황이 출력되길 원할 경우 아래와 같이
설정을 한다.
# vi qlicserver.config
——————————————————————————-
.
.
<resource name=”pamcrash”/>
.
——————————————————————————-
qlicserver.config 설정에서 resource 의 name 항목에 해당 S/W이름만 적는다.
그런 후 qlicserver.limits 설정에서 해당 S/W의 limit 값을 입력한다.
# vi qlicserver.limits
——————————————————————————-
<?xml version=”1.0″?>
<qlicserverLimits>
<limits>
<limit name=”pamcrash” limit=”10″/>
</limits>
</qlicserverLimits>
——————————————————————————-
limit 값에 입력된 count를 qlicserver 에서 자동으로 sge_complex에 values 값으로
적용시켜 주게 된다. sge_complex에도 해당 S/W 설정을 하도록 한다.
SGE Complex 관련 설정에 pamcrash 설정 추가 , Host Configuration 설정에도 추가
# ./qlic
——————————————————————————
resource total limit extern intern wait free
——– —– —– —— —— —- —-
NASTRAN ? . . . . .
PATRAN ? . . . . .
abq_adams 99 . . . . 99
abq_cae 99 . . . . 99
abq_exp 99 . . . . 99
abq_imp 99 . . . . 99
abq_viewer 99 . . . . 99
pamcrash 10 . * . . 10
————————————————–
위의 경우 SGE에서 작업 제출 시 qsub -l pamcrash=1 같이 -l 옵션으로 제출할 경우
총 10개의 라이센스에서 해당 count 만큼 소비되어 진다.
아래와 같이 pamcrash 자원을 총 4개을 요청하는 작업을 제출한다.
# qsub -l pamcrash=1 /home/admin/tt
# qsub -l pamcrash=1 /home/admin/tt
# qsub -l pamcrash=1 /home/admin/tt
# qsub -l pamcrash=1 /home/admin/tt
# ./qlic
——————————————————————————
resource total limit extern intern wait free
——– —– —– —— —— —- —-
NASTRAN ? . . . . .
PATRAN ? . . . . .
abq_adams 99 . . . . 99
abq_cae 99 . . . . 99
abq_exp 99 . . . . 99
abq_imp 99 . . . . 99
abq_viewer 99 . . . . 99
fluent 10 . * . . 10
pamcrash 10 . * . 4 10
——————————————————————————
10개 중 4개의 라이센스 요청이 현재 대기 중이다
——————————————————————————
resource total limit extern intern wait free
——– —– —– —— —— —- —-
NASTRAN ? . . . . .
PATRAN ? . . . . .
abq_adams 99 . . . . 99
abq_cae 99 . . . . 99
abq_exp 99 . . . . 99
abq_imp 99 . . . . 99
abq_viewer 99 . . . . 99
fluent 10 . * . . 10
pamcrash 10 . * 4 . 6
——————————————————————————-
10개 중 4개가 소비되고, 6개가 남아 있다.
참고로 SGE에서 -l 옵션 사용 시 count 가 적용되는 원칙에 대해 간단히 설명하면,
qsub -l pamcrash=1 job.sh 일 경우 최종 적용되는 count 는 job.sh 속의 pe count 와
complex shutcut 에 지정된 count 가 곱해진다.
즉 ..
job.sh 작업 제출 스크립터에 -pe 옵션 뒤에 정의된 parallel core 수와 -l pamcrash=<num>
의 count 가 곱해 지는 것이다.
# cat job.sh
——————————————————————————-
#$ -pe pamcrash_pe 4
——————————————————————————-
# qsub -l pamcrash=1
와 같이 작업이 제출될 경우 SGE complex 상에 소비되는 pamcrash 라이센스 수는
4×1 로 4개가 된다.
만일 -l pamcrash=2 로 제출된다면, 4×2로 8개가 소비된다.
이것으로 SGE와 FlexLM 연동 방법에 대한 설명을 마치겠다.