### SGE 고급 스케줄러 정책 적용 방법 ####
작성일 : 2009년 2월 3일
작성자 : 서진우
SGE 설치 후 기본 스케줄러 정책 대신 사용자가 정의한 세부적인 정책 적용 방법
에 대해 알아보자
본 문서는 실제 사이트에서 요구하는 정책을 기준으로 구성 적용에 대한 방법을
설명한다.
1. 스케줄러 요구 정책
초기 도입된 5대 서버와 이후 도입된 11대 서버를 하나의 클러스터 그룹으로
묶고, 사용자 및 사용자 그룹별로 해당 서버의 자원에 접근할 수 있는 정책을
요구함.
초기 도입된 서버
node01 ~ node05
추가 도입된 서버
node06 ~ node16
사이트에서 사용하는 그룹 및 사용자 정보 및 자원 접근 권한
그룹 계정 접권권한 최대가용slot
————————————————————-
snutt snutt01~ 전체노드 60(40+20)
propeller propeller01~ 전체노드 60(40+20)
casper casper01~ node06~node16 20
asdal asdal01~ node06~node16 20
csl csl01~ node06~node16 20
snovil snovil01~ node06~node16 20
camsdam camsdam01~ node06~node16 20
uwal uwal01~ node06~node16 20
insdel insdel01~ node06~node16 20
csml csml01~ node06~node16 20
caditlab caditlab01~ node06~node16 20
oceanpow oceanpow01~ node06~node16 20
mhl mhl01~ node06~node16 20
guests guest01~ node06~node16 40
snutt, propeller 그룹의 경우 모든 서버에 접근 가능하고, 초기 도입된
node01~node05의 전체 core 40개와 node06 ~node16 노드에서 20개 core를
사용하면 된다.
나머지 그룹은 추가 도입된 node06~node16서버의 자원에만 접근 가능해야
하고 각 20 core를 사용하면 된다.
2. 스케줄러 구성
스케줄러 구성에 대한 대락적인 단계를 설명하면 아래와 같다.
먼저 기본 제공되는 all.q 를 제거하고, lab.q 와 sub.q 두개의 queue를 생성한다.
lab.q 는 초기 도입된 노드(1~5)으로 구성되고, sub.q는 추가 도입된 노드(6~16)
로 구성된다.
그런 후 각 queue 에 접근 가능한 hosts 와 userset을 구성하여 해당 queue에
활당한다.
그런 후 SGE 의 RQS 의 기능을 이용하여 사용자 및 그룹 별 쿼터 지정을 한다.
그럼 실제 적용 단계별 과정을 살펴 보자
– queue 생성
# qconf -sq all.q > lab.q.txt
# qconf -sq all.q > sub.q.txt
lab.q 설정을 변경한다.
# vi lab.q.txt
————————————————————————-
qname lab.q
.
pe_list make mpich fluent_pe
.
slots 1,[node01=8],[node02=8],[node04=8],[node03=8], \
[node05=8]
;; slots 은 각 대기열별 slot 수 제한을 주고 싶을때 설정을 조정한다.
————————————————————————-
# vi sub.q.txt
————————————————————————-
qname sub.q
.
pe_list make mpich fluent_pe
.
slots 1,[node06=8],[node07=8],[node08=8],[node09=8], \
[node10=8],[node11=8],[node12=8],[node13=8],[node14=8], \
[node15=8],[node16=8]
————————————————————————-
– hostlist 생성
# qconf -ahgrp labhosts
group_name @labhosts
hostlist node01 node02 node04 node03 node05
# qconf -ahgrp subhosts
group_name @subhosts
hostlist node06 node07 node08 node09 node10 node11 node12 node13 node14 node15 \
node16
– userset 생성
# vi labusers.txt
————————————————————————–
name labusers
type ACL
fshare 0
oticket 0
entries @snutt,@propeller,admin
# vi subusers.txt
————————————————————————–
name subusers
type ACL
fshare 0
oticket 0
entries @casper,@asdal,@csl,@snovil,@camsdam,@uwal,@insdel,@csml,@aditlab, \
@oceanpow,@mhl,@guests,admin,@snutt,@propeller
————————————————————————–
# qconf -Au labusers.txt
# qconf -Au subusers.txt
– queue 설정에 hostlist 와 userset 적용하기
# qconf -mq lab.q
—————————————————————————
qname lab.q
hostlist @labhosts
.
user_lists labusers
—————————————————————————
# qconf -mq sub.q
—————————————————————————
qname sub.q
hostlist @subhosts
.
user_lists subusers
—————————————————————————
# qstat -f
해당 대기열 별 구성 노드 정보를 확인할 수 있다.
– 그룹/사용자 별 자원 Quota 지정하기
# qconf -arqs
—————————————————————————-
{
name labmaxjobs
description NONE
enabled TRUE
limit users snutt*,shr,LeeHeeBum,bumjinpark queues lab.q to slots=40
limit users propeller* queues lab.q to slots=40
}
{
name submaxjobs
description NONE
enabled TRUE
limit users casper* queues sub.q to slots=20
limit users asdal* queues sub.q to slots=20
limit users csl* queues sub.q to slots=20
limit users snovil* queues sub.q to slots=20
limit users camsdam* queues sub.q to slots=20
limit users uwal* queues sub.q to slots=20
limit users insdel* queues sub.q to slots=20
limit users csml* queues sub.q to slots=20
limit users caditlab* queues sub.q to slots=20
limit users oceanpow* queues sub.q to slots=20
limit users mhl* queues sub.q to slots=20
limit users guest* queues sub.q to slots=40
limit users snutt*,shr,LeeHeeBum,bumjinpark queues sub.q to slots=20
limit users propeller* queues sub.q to slots=20
}
—————————————————————————
– 사용자 계정/그룹 생성 방법
먼저 사용자 그룹을 생성한다.
# groupadd -g <gid> <name>
그런 후 사용자 계정을 생성한다.
# adduser <name> -g <gid>
이제 생성되는 사용자 계정으로 접속하면, 소속된 그룹에 활당된 자원만큼만 이용이
가능하다.
– 전반적인 정책 구현 내부 동작 방식
queue :
사용가능한 slot 수 지정
소속 node 구성 – hostlist
사용가능한 사용자/그룹 지정 – userset
pe_list 저의
hostlist :
queue 에 정의되는 hostlist 에 포함되는 노드 구성
userset :
queue 에 정의되는 access users 에 포함되는 사용자/그룹 구성
rqs :
사용자별/queue별 사용가능한 slot 수 제한
해당 대기열 설정에서 대기열에 소속된 노드와 대기열을 사용할 수 있는 사용자/그룹 설정이
가능하다. 해당 대기열을 사용할 수 있는 권한의 사용자는 해당 대기열에 소속된 노드와
대기열 차원에서 정의된 slot 수만큼의 자원을 이용가능하다.
두개 이상의 대기열을 사용하고자 하는 사용자/그룹은 각 대기열별 userset 에 모두 포함
해 두면 해당 사용자는 두개 이상의 대기열을 사용할 수 있다.
사용자별로 특정 대기열에서 slot 수를 제한하고 싶을 경우 RQS 설정을 이용하여 세부적인
자원 제한을 줄수 있다.
3. 스케줄러 강제 사용 정책
스케줄러를 구성할 경우 전체 컴퓨터의 자원을 가장 이상적으로 관리하기 위해서는 모든
작업을 스케줄러를 통해 제출되시고, 실행되어야 한다. 하지만 서버에 직접 터미널 접속을
할 수 있는 환경에서는 쉘 상태에서 직접적으로 전달되는 작업을 통제하긴 힘들다.
그렇다고 일반 작업 환경 구성을 위해 터미널 접속은 필수적으로 허용해야 한다고 하면,
작업을 스케줄러를 통해서만 전달하도록 강제하는것이 힘들게 된다.
조직의 운영 정책을 통해 수동적인 강제가 될 수 있지만, 이 방법에 선택하는 조직은 많지
않을 것이다. 아래는 시스템 구성 및 설계 상에서 근원적으로 모든 작업 실행이 스케줄러
를 통해야만 실행 가능토록 구성하는 방법이다.
– 마스터 노드와 계산 노드를 분리한다.
– 마스터 노드에서는 실행이 가능한 어플리케이션을 설치 하지 않는다.
a. 어플리케이션을 삭제하거나 퍼미션 권한을 일반 유저에게 허용하지 않는다.
b. make, compiler, 등 주요 운영체제 유틸리티의 퍼미션을 조정한다.
– 마스터 노드에서는 스케줄러 작업 제출이 가능하게 구성한다.
– 모든 사용자는 마스터 노드로만 터미널 접근이 가능하게 한다.
a. 계산노드를 사용자 네트워크 환경과 다른 사설 대역으로 구성한다.
b. 계산노드에서 마스터 노드와 계산 노드군을 제외한 나머지 대역에서의 접근을 차단한다. (iptables)
– 마스트 노드를 통해 계산 서버로 접근하는 터미널 접속을 모두 막는다.
a. 계산노드에 마스터노드에서 들어오는 rlogin 허용은 차단한다. 단 rsh 권한은 허용
( iptables -A INPUT -p tcp -s <master_node_ip> –dport 513 -j DROP )
b. 마스터노드에서 ssh 클라이언트 명령의 퍼미션을 일반 사용자에게 허용하지 않는다.
( chmod 750 /usr/bin/ssh ) -> chgrp wheel /usr/bin/ssh -> 후 관리자 계정은 wheel 그룹에 등록
– 마스트 노드에서의 운영체제 차원에서 resource 사용 범위를 최소화 한다.
/etc/security/limit.conf 조정
———————————————————————-
@snutt – maxlogins 2
@snutt hard nproc 20
@snutt hard rss 100000
/etc/fstab -> /home 파티션 권한 조정
———————————————————————-
LABEL=/home /home ext3 defaults,rw,nosuid,nodev,noexec /dev/sdb1 /home
– 기타 명령어,디렉토리 권한 조정
chmod 711 /
chmod 711 /home
chmod 711 /var
chmod 711 /var/log
chmod 711 /etc
chmod 700 /root
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/nslookup
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/cc
chmod 700 /engrid/enhpc/intel/cc/bin/icc
chmod 700 /engrid/enhpc/intel/cc/bin/icpc
chmod 700 /engrid/enhpc/intel/fc/bin/ifort
chmod 700 /usr/bin/whereis
chmod 700 /usr/bin/c++
chmod 700 /usr/bin/make
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/pstree
chmod 700 /bin/mail
chmod 700 /bin/ps
chmod 700 /bin/mount
chmod 700 /bin/umount
chmod 750 /bin/ps
chmod 750 /bin/netstat
chmod 750 /bin/dmesg
chmod 750 /bin/df
chmod 750 /usr/bin/w
chmod 750 /usr/bin/who
chmod 750 /usr/bin/last
chmod 750 /usr/bin/top
chmod 750 /usr/sbin/lsof
chmod 700 /sbin/pam_timestamp_check
chmod 700 /sbin/netreport
chmod 700 /usr/kerberos/bin/ksu
chmod 700 /usr/lib/vte/gnome-pty-helper
chmod 700 /usr/sbin/ccreds_validate
chmod 700 /usr/sbin/gnome-pty-helper
chmod 700 /usr/sbin/userisdnctl
chmod 700 /usr/sbin/lockdev
chmod 700 /usr/sbin/usernetctl
chmod 700 /usr/sbin/utempter
chmod 700 /usr/sbin/userhelper
chmod 700 /usr/bin/sg
chmod 700 /usr/bin/kgrantpty
chmod 700 /usr/bin/lockfile
chmod 700 /usr/bin/crontab
chmod 700 /usr/bin/kpac_dhcp_helper
chmod 700 /usr/bin/ssh-agent
chmod 700 /usr/bin/chfn
chmod 700 /usr/bin/chsh
chmod 700 /usr/bin/slocate
chmod 700 /usr/bin/at
chmod 700 /usr/bin/lppasswd
chmod 700 /usr/bin/rcp
chmod 700 /usr/bin/write
chmod 700 /usr/bin/wall
chmod 700 /usr/bin/chage
chmod 700 /usr/lib64/vte/gnome-pty-helper
chmod 700 /usr/lib64/mc/cons.saver
chmod 700 /usr/libexec/openssh/ssh-keysign
chmod 700 /usr/libexec/pt_chown
chmod 700 /bin/traceroute
chmod 700 /bin/ping
chmod 700 /bin/ping6
chmod 700 /bin/traceroute6
chgrp wheel /bin/ps
chgrp wheel /bin/netstat
chgrp wheel /bin/dmesg
chgrp wheel /bin/df
chgrp wheel /usr/bin/w
chgrp wheel /usr/bin/who
chgrp wheel /usr/bin/last
chgrp wheel /usr/bin/top
chgrp wheel /usr/sbin/lsof
chgrp wheel /bin/su
chmod 4750 /bin/su
chmod 4750 /usr/sbin/sendmail.sendmail
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?