¿Recurso consumible configurado automáticamente por SGE?

¿Recurso consumible configurado automáticamente por SGE?

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 qhostme hace pensar que, aunque NCPUy MEMTOTno 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!

qhostproducció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 -mcproducció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 mastersalida (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 -msconfproducció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.qproducció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_slotsregla 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_slotslimita 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.qpor 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, qstatse 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!

información relacionada