mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-26 07:57:58 +00:00
parallel: implemented --noswap
This commit is contained in:
parent
a1b3eebb98
commit
2db11bf3f2
71
src/parallel
71
src/parallel
|
@ -329,6 +329,7 @@ sub get_options_from_array {
|
||||||
"seqreplace=s" => \$::opt_seqreplace,
|
"seqreplace=s" => \$::opt_seqreplace,
|
||||||
"jobs|j=s" => \$::opt_P,
|
"jobs|j=s" => \$::opt_P,
|
||||||
"load=f" => \$::opt_load,
|
"load=f" => \$::opt_load,
|
||||||
|
"noswap" => \$::opt_noswap,
|
||||||
"max-line-length-allowed" => \$::opt_max_line_length_allowed,
|
"max-line-length-allowed" => \$::opt_max_line_length_allowed,
|
||||||
"number-of-cpus" => \$::opt_number_of_cpus,
|
"number-of-cpus" => \$::opt_number_of_cpus,
|
||||||
"number-of-cores" => \$::opt_number_of_cores,
|
"number-of-cores" => \$::opt_number_of_cores,
|
||||||
|
@ -1186,6 +1187,10 @@ sub start_more_jobs {
|
||||||
# The load is too high or unknown
|
# The load is too high or unknown
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
if($::opt_noswap and $sshlogin->swapping()) {
|
||||||
|
# The server is swapping
|
||||||
|
next;
|
||||||
|
}
|
||||||
while ($sshlogin->jobs_running() < $sshlogin->max_jobs_running()) {
|
while ($sshlogin->jobs_running() < $sshlogin->max_jobs_running()) {
|
||||||
if($Global::JobQueue->empty() and not $::opt_pipe) {
|
if($Global::JobQueue->empty() and not $::opt_pipe) {
|
||||||
last;
|
last;
|
||||||
|
@ -1708,12 +1713,22 @@ sub new {
|
||||||
'serverlogin' => undef,
|
'serverlogin' => undef,
|
||||||
'control_path_dir' => undef,
|
'control_path_dir' => undef,
|
||||||
'control_path' => undef,
|
'control_path' => undef,
|
||||||
'loadavg_file' => $ENV{'HOME'} . "/.parallel/tmp/" .
|
'loadavg_file' => $ENV{'HOME'} . "/.parallel/tmp/loadavg-" .
|
||||||
$$."-".$string,
|
$$."-".$string,
|
||||||
'loadavg' => undef,
|
'loadavg' => undef,
|
||||||
|
'swap_activity_file' => $ENV{'HOME'} . "/.parallel/tmp/swap_activity-" .
|
||||||
|
$$."-".$string,
|
||||||
|
'swap_activity' => undef,
|
||||||
}, ref($class) || $class;
|
}, ref($class) || $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub DESTROY {
|
||||||
|
my $self = shift;
|
||||||
|
# Remove temporary files if they are created.
|
||||||
|
unlink $self->{'loadavg_file'};
|
||||||
|
unlink $self->{'swap_activity_file'};
|
||||||
|
}
|
||||||
|
|
||||||
sub string {
|
sub string {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return $self->{'string'};
|
return $self->{'string'};
|
||||||
|
@ -1772,6 +1787,60 @@ sub set_max_jobs_running {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub swapping {
|
||||||
|
my $self = shift;
|
||||||
|
my $swapping = $self->swap_activity();
|
||||||
|
return (not defined $swapping or $swapping)
|
||||||
|
}
|
||||||
|
|
||||||
|
sub swap_activity {
|
||||||
|
# If the currently known swap activity is too old:
|
||||||
|
# Recompute a new one in the background
|
||||||
|
# Returns:
|
||||||
|
# last load average computed
|
||||||
|
my $self = shift;
|
||||||
|
# Should we update the swap_activity file?
|
||||||
|
my $update_swap_activity_file = 0;
|
||||||
|
if(-r $self->{'swap_activity_file'}) {
|
||||||
|
open(SWAP,"<".$self->{'swap_activity_file'}) || ::die_bug("swap_activity_file-r");
|
||||||
|
my $swap_out = <SWAP>;
|
||||||
|
close SWAP;
|
||||||
|
if($swap_out =~ /^(\d+)$/) {
|
||||||
|
$self->{'swap_activity'} = $1;
|
||||||
|
::debug("New swap_activity: ".$self->{'swap_activity'});
|
||||||
|
}
|
||||||
|
::debug("Last update: ".$self->{'last_swap_activity_update'});
|
||||||
|
if(time - $self->{'last_swap_activity_update'} > 10) {
|
||||||
|
# last loadavg was started 10 seconds ago
|
||||||
|
::debug("Older than 10 sec: ".$self->{'swap_activity_file'});
|
||||||
|
$update_swap_activity_file = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
::debug("No swap_activity file: ".$self->{'swap_activity_file'});
|
||||||
|
$self->{'swap_activity'} = undef;
|
||||||
|
$update_swap_activity_file = 1;
|
||||||
|
}
|
||||||
|
if($update_swap_activity_file) {
|
||||||
|
::debug("Updating swap_activity file".$self->{'swap_activity_file'});
|
||||||
|
$self->{'last_swap_activity_update'} = time;
|
||||||
|
-e $ENV{'HOME'}."/.parallel" or mkdir $ENV{'HOME'}."/.parallel";
|
||||||
|
-e $ENV{'HOME'}."/.parallel/tmp" or mkdir $ENV{'HOME'}."/.parallel/tmp";
|
||||||
|
my $swap_activity;
|
||||||
|
$swap_activity = "vmstat 1 2 | tail -n1 | awk '{print \$7*\$8}'";
|
||||||
|
if($self->{'string'} ne ":") {
|
||||||
|
$swap_activity = $self->sshcommand() . " " . $self->serverlogin() . " " .
|
||||||
|
::shell_quote_scalar($swap_activity);
|
||||||
|
}
|
||||||
|
# Run swap_activity measuring.
|
||||||
|
# As the command can take long to run if run remote
|
||||||
|
# save it to a tmp file before moving it to the correct file
|
||||||
|
my $file = $self->{'swap_activity_file'};
|
||||||
|
my $tmpfile = $self->{'swap_activity_file'}.$$;
|
||||||
|
qx{ ($swap_activity > $tmpfile; mv $tmpfile $file) & };
|
||||||
|
}
|
||||||
|
return $self->{'swap_activity'};
|
||||||
|
}
|
||||||
|
|
||||||
sub loadavg_too_high {
|
sub loadavg_too_high {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $loadavg = $self->loadavg();
|
my $loadavg = $self->loadavg();
|
||||||
|
|
|
@ -987,6 +987,19 @@ The sshloginfile '..' is special, it read sshlogins from
|
||||||
~/.parallel/sshloginfile
|
~/.parallel/sshloginfile
|
||||||
|
|
||||||
|
|
||||||
|
=item B<--noswap> (alpha testing)
|
||||||
|
|
||||||
|
Do not start new jobs on a given computer if there is both swap-in and
|
||||||
|
swap-out activity.
|
||||||
|
|
||||||
|
The swap activity is only sampled every 10 seconds as the sampling
|
||||||
|
takes 1 second to do.
|
||||||
|
|
||||||
|
Swap activity is computed as (swap-in)*(swap-out) which in practice is
|
||||||
|
a good value: swapping out is not a problem, swapping in is not a
|
||||||
|
problem, but both swapping in and out usually indicates a problem.
|
||||||
|
|
||||||
|
|
||||||
=item B<--silent>
|
=item B<--silent>
|
||||||
|
|
||||||
Silent. The job to be run will not be printed. This is the default.
|
Silent. The job to be run will not be printed. This is the default.
|
||||||
|
|
Loading…
Reference in a new issue