francesco.prelz@mi.infn.it
https://htcondor-wiki.cs.wisc.edu/index.cgi/wiki?p=HowToHaveExecuteMachines
![]() Original picture bitmap source:www.publicdomainpictures.net. License: CC0 Public domain |
|
![]() |
|
Here is a reference configuration: using this with partitionable slots required a few patches related to the 'dollar-dollar' expansion. These went into Condor v8.7.5 and later.
NegotiatorName = "whatever-pool" NEGOTIATOR_MATCH_EXPRS = NegotiatorName SUPER_COLLECTOR = superpool-cm.fisica.unimi.it LOCAL_COLLECTOR = $(CONDOR_HOST) # the local negotiator should only ever report to the local collector NEGOTIATOR.COLLECTOR_HOST = $(LOCAL_COLLECTOR) # startds should report to both collectors STARTD.COLLECTOR_HOST = $(LOCAL_COLLECTOR),$(SUPER_COLLECTOR) # trust both negotiators #ALLOW_NEGOTIATOR=$(COLLECTOR_HOST) ALLOW_NEGOTIATOR = $(LOCAL_COLLECTOR),$(SUPER_COLLECTOR) # Flocking to super-pool FLOCK_TO = $(SUPER_COLLECTOR)
# Advertise in the machine ad the name of the pool ClusterName = $(NegotiatorName) STARTD_ATTRS = $(STARTD_ATTRS) ClusterName # Advertise in the machine ad the name of the negotiator that made the match # for the job that is currently running. We need this in SUPER_START. CurJobPool = "$$(NegotiatorMatchExprNegotiatorName)" SUBMIT_EXPRS = $(SUBMIT_EXPRS) CurJobPool STARTD_JOB_EXPRS = $(STARTD_JOB_EXPRS) CurJobPool # Turn PREEMPT on only for jobs coming from an external pool PREEMPT = ($(PREEMPT)) && (MY.CurJobPool =!= $(NegotiatorName)) # We do not want the super-negotiator to preempt local-negotiator matches. # Therefore, only match jobs if: # 1. the new match is from the local pool # OR 2. the existing match is not from the local pool SUPER_START = NegotiatorMatchExprNegotiatorName =?= $(NegotiatorName) || \ MY.CurJobPool =!= $(NegotiatorName) START = ($(START)) && ($(SUPER_START))
condor_examples/condor_config.generic
):
AcceptableJob = ((TotalCPUs - TotalLoadAvg) >= TARGET.RequestCpus) RemoteJob = (MY.CurJobPool =!= $(NegotiatorName)) WANT_SUSPEND = ( ( $(SUSPEND) ) && (TARGET.AvoidSuspend =!= True) ) WANT_VACATE = ( $(ActivationTimer) > 10 * $(MINUTE) || $(IsVanilla) ) START = (DynamicSlot == True) || ( $(AcceptableJob) || \ (State != "Unclaimed" && State != "Owner") ) SUSPEND = ( (CpuBusyTime > 2 * $(MINUTE)) && $(ActivationTimer) > 180 ) && \ ($(RemoteJob) == True) CONTINUE = $(CPUIdle) && ($(ActivityTimer) > 10)
HasDocker
).HasCVMFS
attribute).Roughly half of our reference users do use MPI, with little a priori or a posteriori awareness of the actual degree of paralellism in the code. To gain a better ability to serve their needs we selected three cases:
mpirun
our local MPI
applications.WantParallelScheduling = true
knob....
![]() |
Main issues:
|
'docker'
command in the DOCKER
config variable. These take care of:
docker create/start
command has to return a valid container ID, waiting/sleeping
containers are created.sshd
will be started, and its
access data reported via condor_chirp
, like
in the old version of the MPI support scripts.WantParallelScheduling = true
, which here and there
doesn't get the same treatment of historic 'parallel' universe jobs.WantParallelScheduling = true Universe = docker Requestmemory = 1024M Docker_image = dr.mi.infn.it/run-crystal17-openmpi Executable = mpirun-exec-stats Arguments = /path/to/MPPcrystal Should_Transfer_Files = YES When_To_Transfer_Output = ON_EXIT_OR_EVICT Transfer_Input_Files = INPUT,condor_chirp.x,\ wait-for-head-node Output = run_crystal_stdout.$(Process).#pArAlLeLnOdE# Error = run_crystal_stderr.$(Process).#pArAlLeLnOdE# Log = run_docker_log |
#Enable chirp! +WantIOProxy = true +JobRequiresSandbox = true +ParallelShutdownPolicy = \ "WAIT_FOR_ALL" machine_count = XXX requirements = RXXX queue machine_count = YYY requirements = RYYY queue |
![]() ![]() |
Black-box characterization of the CRYSTAL code with end-user-provided input and run conditions. |
We then studied the execution of the CRYSTAL code by submitting 'paddock' execution on X slots on one physical node 'A' and Y slots on another physical node 'B' (with the MPI master is always on node 'B') - these are all preliminary results: |
![]() |
![]() |
![]() |
![]() |
|
![]() |
|
![]() |
|
![]() |