
Estou usando uma ferramenta chamada starclusterhttp://star.mit.edu/clusterpara inicializar um cluster configurado SGE na nuvem Amazon. O problema é que ele não parece estar configurado com nenhum recurso consumível predefinido, exceto SLOTS, que não consigo solicitar diretamente com um arquivo qsub -l slots=X
. Cada vez que inicializo um cluster, posso solicitar um tipo diferente de nó EC2, então o fato desse recurso de slot ser pré-configurado é muito bom. Posso solicitar um certo número de slots usando um ambiente paralelo pré-configurado, mas o problema é que ele foi configurado para MPI, portanto, solicitar slots usando esse ambiente paralelo às vezes concede slots de trabalho espalhados por vários nós de computação.
Existe uma maneira de 1) criar um ambiente paralelo que aproveite as configurações de slots HOST = X pré-configuradas existentes que o starcluster configura onde você está solicitando slots em um único nó ou 2) usa algum tipo de recurso que o SGE está automaticamente ciente? A execução qhost
me faz pensar que, embora NCPU
e MEMTOT
não estejam definidos em nenhum lugar que eu possa ver, que o SGE esteja de alguma forma ciente desses recursos, existem configurações onde posso tornar esses recursos solicitáveis sem definir explicitamente quanto de cada um está disponível?
Obrigado pelo seu tempo!
qhost
saída:
HOSTNAME ARCH NCPU LOAD MEMTOT MEMUSE SWAPTO SWAPUS
-------------------------------------------------------------------------------
global - - - - - - -
master linux-x64 2 0.01 7.3G 167.4M 0.0 0.0
node001 linux-x64 2 0.01 7.3G 139.6M 0.0 0.0
qconf -mc
saída:
#name shortcut type relop requestable consumable default urgency
#----------------------------------------------------------------------------------------
arch a RESTRING == YES NO NONE 0
calendar c RESTRING == YES NO NONE 0
cpu cpu DOUBLE >= YES NO 0 0
display_win_gui dwg BOOL == YES NO 0 0
h_core h_core MEMORY <= YES NO 0 0
h_cpu h_cpu TIME <= YES NO 0:0:0 0
h_data h_data MEMORY <= YES NO 0 0
h_fsize h_fsize MEMORY <= YES NO 0 0
h_rss h_rss MEMORY <= YES NO 0 0
h_rt h_rt TIME <= YES NO 0:0:0 0
h_stack h_stack MEMORY <= YES NO 0 0
h_vmem h_vmem MEMORY <= YES NO 0 0
hostname h HOST == YES NO NONE 0
load_avg la DOUBLE >= NO NO 0 0
load_long ll DOUBLE >= NO NO 0 0
load_medium lm DOUBLE >= NO NO 0 0
load_short ls DOUBLE >= NO NO 0 0
m_core core INT <= YES NO 0 0
m_socket socket INT <= YES NO 0 0
m_topology topo RESTRING == YES NO NONE 0
m_topology_inuse utopo RESTRING == YES NO NONE 0
mem_free mf MEMORY <= YES NO 0 0
mem_total mt MEMORY <= YES NO 0 0
mem_used mu MEMORY >= YES NO 0 0
min_cpu_interval mci TIME <= NO NO 0:0:0 0
np_load_avg nla DOUBLE >= NO NO 0 0
np_load_long nll DOUBLE >= NO NO 0 0
np_load_medium nlm DOUBLE >= NO NO 0 0
np_load_short nls DOUBLE >= NO NO 0 0
num_proc p INT == YES NO 0 0
qname q RESTRING == YES NO NONE 0
rerun re BOOL == NO NO 0 0
s_core s_core MEMORY <= YES NO 0 0
s_cpu s_cpu TIME <= YES NO 0:0:0 0
s_data s_data MEMORY <= YES NO 0 0
s_fsize s_fsize MEMORY <= YES NO 0 0
s_rss s_rss MEMORY <= YES NO 0 0
s_rt s_rt TIME <= YES NO 0:0:0 0
s_stack s_stack MEMORY <= YES NO 0 0
s_vmem s_vmem MEMORY <= YES NO 0 0
seq_no seq INT == NO NO 0 0
slots s INT <= YES YES 1 1000
swap_free sf MEMORY <= YES NO 0 0
swap_rate sr MEMORY >= YES NO 0 0
swap_rsvd srsv MEMORY >= YES NO 0 0
qconf -me master
saída (um dos nós como exemplo):
hostname master
load_scaling NONE
complex_values NONE
user_lists NONE
xuser_lists NONE
projects NONE
xprojects NONE
usage_scaling NONE
report_variables NONE
qconf -msconf
saída:
algorithm default
schedule_interval 0:0:15
maxujobs 0
queue_sort_method load
job_load_adjustments np_load_avg=0.50
load_adjustment_decay_time 0:7:30
load_formula np_load_avg
schedd_job_info false
flush_submit_sec 0
flush_finish_sec 0
params none
reprioritize_interval 0:0:0
halftime 168
usage_weight_list cpu=1.000000,mem=0.000000,io=0.000000
compensation_factor 5.000000
weight_user 0.250000
weight_project 0.250000
weight_department 0.250000
weight_job 0.250000
weight_tickets_functional 0
weight_tickets_share 0
share_override_tickets TRUE
share_functional_shares TRUE
max_functional_jobs_to_schedule 200
report_pjob_tickets TRUE
max_pending_tasks_per_job 50
halflife_decay_list none
policy_hierarchy OFS
weight_ticket 0.010000
weight_waiting_time 0.000000
weight_deadline 3600000.000000
weight_urgency 0.100000
weight_priority 1.000000
max_reservation 0
default_duration INFINITY
qconf -mq all.q
saída:
qname all.q
hostlist @allhosts
seq_no 0
load_thresholds np_load_avg=1.75
suspend_thresholds NONE
nsuspend 1
suspend_interval 00:05:00
priority 0
min_cpu_interval 00:05:00
processors UNDEFINED
qtype BATCH INTERACTIVE
ckpt_list NONE
pe_list make orte
rerun FALSE
slots 1,[master=2],[node001=2]
tmpdir /tmp
shell /bin/bash
prolog NONE
epilog NONE
shell_start_mode posix_compliant
starter_method NONE
suspend_method NONE
resume_method NONE
terminate_method NONE
notify 00:00:60
owner_list NONE
user_lists NONE
xuser_lists NONE
subordinate_list NONE
complex_values NONE
projects NONE
xprojects NONE
calendar NONE
initial_state default
s_rt INFINITY
h_rt INFINITY
s_cpu INFINITY
h_cpu INFINITY
s_fsize INFINITY
h_fsize INFINITY
s_data INFINITY
h_data INFINITY
s_stack INFINITY
h_stack INFINITY
s_core INFINITY
h_core INFINITY
s_rss INFINITY
Responder1
A solução que encontrei é fazer um novo ambiente paralelo que possua a $pe_slots
regra de alocação (veja man sge_pe
). Defino o número de slots disponíveis para esse ambiente paralelo como igual ao máximo, pois $pe_slots
limita o uso do slot por nó. Como o starcluster configura os slots no momento da inicialização do cluster, isso parece funcionar muito bem. Você também precisa adicionar o novo ambiente paralelo à fila. Então, apenas para tornar isso muito simples:
qconf -ap by_node
e aqui está o conteúdo depois de editar o arquivo:
pe_name by_node
slots 9999999
user_lists NONE
xuser_lists NONE
start_proc_args /bin/true
stop_proc_args /bin/true
allocation_rule $pe_slots
control_slaves TRUE
job_is_first_task TRUE
urgency_slots min
accounting_summary FALSE
Modifique também a fila (chamada all.q
pelo starcluster) para adicionar este novo ambiente paralelo à lista.
qconf -mq all.q
e altere esta linha:
pe_list make orte
para isso:
pe_list make orte by_node
Fiquei preocupado que os trabalhos gerados a partir de um determinado trabalho fossem limitados a um único nó, mas não parece ser o caso. Eu tenho um cluster com dois nós e dois slots cada.
Fiz um arquivo de teste parecido com este:
#!/bin/bash
qsub -b y -pe by_node 2 -cwd sleep 100
sleep 100
e executei assim:
qsub -V -pe by_node 2 test.sh
Depois de um tempo, qstat
mostra os dois trabalhos em execução em nós diferentes:
job-ID prior name user state submit/start at queue slots ja-task-ID
-----------------------------------------------------------------------------------------------------------------
25 0.55500 test root r 10/17/2012 21:42:57 all.q@master 2
26 0.55500 sleep root r 10/17/2012 21:43:12 all.q@node001 2
Também testei o envio de três trabalhos de uma vez, solicitando o mesmo número de slots em um único nó, e apenas dois executados por vez, um por nó. Portanto, isso parece estar configurado corretamente!