X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/70ab42cb727b6a1bd1a8b26e2481de7caa0853d5..8e4ed0edeadc4dfcc85666ef5c36619815dca8e2:/sdk/cli/bin/crunch-job diff --git a/sdk/cli/bin/crunch-job b/sdk/cli/bin/crunch-job index 294696cdcf..a6ccebcd91 100755 --- a/sdk/cli/bin/crunch-job +++ b/sdk/cli/bin/crunch-job @@ -376,7 +376,7 @@ if (!defined $no_clear_tmp) { # If this job requires a Docker image, install that. my $docker_bin = "/usr/bin/docker.io"; -my ($docker_locator, $docker_stream, $docker_hash); +my ($docker_locator, $docker_stream, $docker_hash, $docker_limitmem); if ($docker_locator = $Job->{docker_image_locator}) { ($docker_stream, $docker_hash) = find_docker_image($docker_locator); if (!$docker_hash) @@ -408,6 +408,12 @@ fi .exit_status_s($?)); } + # Determine whether this version of Docker supports memory+swap limits. + srun(["srun", "--nodelist=" . $node[0]], + ["/bin/sh", "-ec", "$docker_bin run --help | grep -qe --memory-swap="], + {fork => 1}); + $docker_limitmem = ($? == 0); + if ($Job->{arvados_sdk_version}) { # The job also specifies an Arvados SDK version. Add the SDKs to the # tar file for the build script to install. @@ -653,6 +659,10 @@ update_progress_stats(); THISROUND: +my $tasks_this_level = 0; +foreach my $id (@jobstep_todo) { + $tasks_this_level++ if ($jobstep[$id]->{level} == $level); +} for (my $todo_ptr = 0; $todo_ptr <= $#jobstep_todo; $todo_ptr ++) { my $id = $jobstep_todo[$todo_ptr]; @@ -710,6 +720,11 @@ for (my $todo_ptr = 0; $todo_ptr <= $#jobstep_todo; $todo_ptr ++) $ENV{"GZIP"} = "-n"; + my $max_node_concurrent_tasks = $ENV{CRUNCH_NODE_SLOTS}; + if ($tasks_this_level < $max_node_concurrent_tasks) { + $max_node_concurrent_tasks = $tasks_this_level; + } + my @srunargs = ( "srun", "--nodelist=".$childnode->{name}, @@ -720,14 +735,25 @@ for (my $todo_ptr = 0; $todo_ptr <= $#jobstep_todo; $todo_ptr ++) "if [ -e $ENV{TASK_WORK} ]; then rm -rf $ENV{TASK_WORK}; fi; " ."mkdir -p $ENV{CRUNCH_TMP} $ENV{JOB_WORK} $ENV{TASK_WORK} $ENV{TASK_KEEPMOUNT} " ."&& cd $ENV{CRUNCH_TMP} " - ."&& MEM=\$(cat /proc/meminfo | grep MemTotal | sed 's/\\s\\s*/ /g' |cut -d' ' -f2) " - ."&& MEMLIMIT=\$(( (\$MEM * 95) / ($ENV{CRUNCH_NODE_SLOTS} * 100) )) "; + # These environment variables get used explicitly later in + # $command. No tool is expected to read these values directly. + .q{&& MEM=$(awk '($1 == "MemTotal:"){print $2}'