
Ich verwende ein Tool namens Starclusterhttp://star.mit.edu/clusterum einen SGE-konfigurierten Cluster in der Amazon-Cloud hochzufahren. Das Problem ist, dass er anscheinend nicht mit voreingestellten verbrauchbaren Ressourcen konfiguriert ist, außer SLOTS, die ich anscheinend nicht direkt mit einem anfordern kann qsub -l slots=X
. Jedes Mal, wenn ich einen Cluster hochfahre, fordere ich möglicherweise einen anderen EC2-Knotentyp an, daher ist die Tatsache, dass diese Slot-Ressource vorkonfiguriert ist, wirklich nett. Ich kann eine bestimmte Anzahl von Slots mithilfe einer vorkonfigurierten parallelen Umgebung anfordern, aber das Problem ist, dass sie für MPI eingerichtet wurde, sodass das Anfordern von Slots mithilfe dieser parallelen Umgebung manchmal dazu führt, dass die Job-Slots auf mehrere Rechenknoten verteilt werden.
Gibt es eine Möglichkeit, entweder 1) eine parallele Umgebung zu erstellen, die die vorhandenen vorkonfigurierten HOST=X-Sloteinstellungen nutzt, die Starcluster einrichtet, wenn Sie Slots auf einem einzelnen Knoten anfordern, oder 2) eine Art Ressource zu verwenden, die SGE automatisch erkennt? Beim Ausführen qhost
denke ich, dass SGE diese Ressourcen irgendwie erkennt, obwohl NCPU
und MEMTOT
nirgends definiert sind, soweit ich sehen kann. Gibt es Einstellungen, mit denen ich diese Ressourcen anforderbar machen kann, ohne explizit zu definieren, wie viel von jeder verfügbar ist?
Vielen Dank für Ihre Zeit!
qhost
Ausgabe:
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
Ausgabe:
#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
Ausgabe (einer der Knoten als Beispiel):
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
Ausgabe:
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
Ausgabe:
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
Antwort1
Die Lösung, die ich gefunden habe, besteht darin, eine neue parallele Umgebung zu erstellen, die die $pe_slots
Zuweisungsregel (siehe man sge_pe
) hat. Ich habe die Anzahl der für diese parallele Umgebung verfügbaren Slots auf das Maximum gesetzt, da $pe_slots
die Slot-Nutzung auf pro Knoten begrenzt ist. Da Starcluster die Slots beim Booten des Clusters einrichtet, scheint dies gut zu funktionieren. Sie müssen auch die neue parallele Umgebung zur Warteschlange hinzufügen. Um es ganz einfach zu machen:
qconf -ap by_node
und hier ist der Inhalt, nachdem ich die Datei bearbeitet habe:
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
Ändern Sie auch die Warteschlange (aufgerufen all.q
von Starcluster), um diese neue parallele Umgebung zur Liste hinzuzufügen.
qconf -mq all.q
und ändern Sie diese Zeile:
pe_list make orte
dazu:
pe_list make orte by_node
Ich war besorgt, dass aus einem bestimmten Job generierte Jobs auf einen einzigen Knoten beschränkt wären, aber das scheint nicht der Fall zu sein. Ich habe einen Cluster mit zwei Knoten und jeweils zwei Slots.
Ich habe eine Testdatei erstellt, die so aussieht:
#!/bin/bash
qsub -b y -pe by_node 2 -cwd sleep 100
sleep 100
und habe es folgendermaßen ausgeführt:
qsub -V -pe by_node 2 test.sh
Nach kurzer Zeit qstat
wird angezeigt, dass beide Jobs auf unterschiedlichen Knoten ausgeführt werden:
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
Ich habe auch getestet, 3 Jobs gleichzeitig zu übermitteln, die dieselbe Anzahl von Slots auf einem einzelnen Knoten anfordern, und es werden immer nur zwei gleichzeitig ausgeführt, einer pro Knoten. Das scheint also richtig eingerichtet zu sein!