
Estoy usando una herramienta llamada Starcluster.http://star.mit.edu/clusterpara iniciar un clúster configurado con SGE en la nube de Amazon. El problema es que no parece estar configurado con ningún recurso consumible preestablecido, excepto SLOTS, que parece que no puedo solicitar directamente con un archivo qsub -l slots=X
. Cada vez que inicio un clúster, puedo solicitar un tipo diferente de nodo EC2, por lo que el hecho de que este recurso de ranura esté preconfigurado es realmente bueno. Puedo solicitar una cierta cantidad de ranuras usando un entorno paralelo preconfigurado, pero el problema es que fue configurado para MPI, por lo que solicitar ranuras usando ese entorno paralelo a veces otorga ranuras de trabajo distribuidas en varios nodos de cómputo.
¿Hay alguna manera de 1) crear un entorno paralelo que aproveche las configuraciones de ranuras HOST=X preconfiguradas existentes que Starcluster configura cuando solicita ranuras en un solo nodo, o 2) utiliza algún tipo de recurso que SGE ¿Se da cuenta automáticamente? Ejecutar qhost
me hace pensar que, aunque NCPU
y MEMTOT
no están definidos en ningún lugar que pueda ver, SGE de alguna manera conoce esos recursos, ¿existen configuraciones en las que puedo hacer que esos recursos sean solicitables sin definir explícitamente cuánto de cada uno está disponible?
¡Gracias por tu tiempo!
qhost
producción:
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
producción:
#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
salida (uno de los nodos como ejemplo):
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
producción:
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
producción:
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
Respuesta1
La solución que encontré es crear un nuevo entorno paralelo que tenga la $pe_slots
regla de asignación (ver man sge_pe
). Configuré la cantidad de ranuras disponibles para ese entorno paralelo para que sea igual al máximo, ya que $pe_slots
limita el uso de ranuras por nodo. Dado que starcluster configura las ranuras en el momento del arranque del clúster, esto parece funcionar muy bien. También debe agregar el nuevo entorno paralelo a la cola. Entonces, para hacer esto muy simple:
qconf -ap by_node
y aquí está el contenido después de editar el archivo:
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 también la cola (llamada all.q
por starcluster) para agregar este nuevo entorno paralelo a la lista.
qconf -mq all.q
y cambia esta línea:
pe_list make orte
a esto:
pe_list make orte by_node
Me preocupaba que los trabajos generados a partir de un trabajo determinado se limitaran a un solo nodo, pero este no parece ser el caso. Tengo un clúster con dos nodos y dos ranuras cada uno.
Hice un archivo de prueba que se ve así:
#!/bin/bash
qsub -b y -pe by_node 2 -cwd sleep 100
sleep 100
y lo ejecuté así:
qsub -V -pe by_node 2 test.sh
Después de un rato, qstat
se muestran ambos trabajos ejecutándose en diferentes nodos:
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
También probé el envío de 3 trabajos a la vez solicitando la misma cantidad de espacios en un solo nodo, y solo se ejecutan dos a la vez, uno por nodo. ¡Así que esto parece estar configurado correctamente!