parallel: Fixed bug #45414: Use setpriority for --nice.

This commit is contained in:
Ole Tange 2015-06-27 00:29:28 +02:00
parent 5a8df2075d
commit dcc18d38f5
3 changed files with 23 additions and 26 deletions

View file

@ -907,6 +907,7 @@ sub parse_options {
if(defined $opt::max_args) { $Global::max_number_of_args = $opt::max_args; } if(defined $opt::max_args) { $Global::max_number_of_args = $opt::max_args; }
if(defined $opt::timeout) { $Global::timeoutq = TimeoutQueue->new($opt::timeout); } if(defined $opt::timeout) { $Global::timeoutq = TimeoutQueue->new($opt::timeout); }
if(defined $opt::tmpdir) { $ENV{'TMPDIR'} = $opt::tmpdir; } if(defined $opt::tmpdir) { $ENV{'TMPDIR'} = $opt::tmpdir; }
$opt::nice ||= 0;
if(defined $opt::help) { die_usage(); } if(defined $opt::help) { die_usage(); }
if(defined $opt::colsep) { $Global::trim = 'lr'; } if(defined $opt::colsep) { $Global::trim = 'lr'; }
if(defined $opt::header) { $opt::colsep = defined $opt::colsep ? $opt::colsep : "\t"; } if(defined $opt::header) { $opt::colsep = defined $opt::colsep ? $opt::colsep : "\t"; }
@ -6387,24 +6388,6 @@ sub wrapped {
$command = "echo " . $command = "echo " .
::shell_quote_scalar(::shell_quote_scalar($command)); ::shell_quote_scalar(::shell_quote_scalar($command));
} }
if($opt::nice) {
# Prepend \nice -n19 $SHELL -c
# and quote.
# The '\' before nice is needed to avoid tcsh's built-in
my $sshlogin = $self->sshlogin();
my $serverlogin = $sshlogin->serverlogin();
if($serverlogin eq ":") {
# Local use $Global::shell
$command = '\nice'. " -n". $opt::nice. " ".
$Global::shell. " -c ".
::shell_quote_scalar($command);
} else {
# Remote systems use $SHELL
$command = '\nice'. " -n". $opt::nice.
' $SHELL -c '.
::shell_quote_scalar($command);
}
}
if($opt::cat) { if($opt::cat) {
# In '--cat' and '--fifo' {} == $PARALLEL_TMP. # In '--cat' and '--fifo' {} == $PARALLEL_TMP.
# This is to make it possible to compute $PARALLEL_TMP on # This is to make it possible to compute $PARALLEL_TMP on
@ -6562,6 +6545,7 @@ sub sshlogin_wrap {
# This will be packed in ', so only use " # This will be packed in ', so only use "
::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'. ::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'.
'$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'. '$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'.
'$nice = '.$opt::nice.';'.
q{ q{
# Set $PARALLEL_TMP to a non-existent file name in $TMPDIR # Set $PARALLEL_TMP to a non-existent file name in $TMPDIR
do { do {
@ -6573,6 +6557,7 @@ sub sshlogin_wrap {
unless($pid) { unless($pid) {
# Make own process group to be able to kill HUP it later # Make own process group to be able to kill HUP it later
setpgrp; setpgrp;
setpriority(0,0,$nice);
exec $shell, "-c", ($bashfunc."@ARGV"); exec $shell, "-c", ($bashfunc."@ARGV");
die "exec: $!\n"; die "exec: $!\n";
} }
@ -7016,7 +7001,7 @@ sub start {
open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!"); open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!");
my $pid; my $pid;
my @setpgrp_wrap = ('perl','-e',"setpgrp\;exec '$Global::shell', '-c', \@ARGV"); my @setpgrp_wrap = ('perl','-e',"setpgrp\;setpriority\(0,0,$opt::nice\)\;exec '$Global::shell', '-c', \@ARGV");
# The eval is needed to catch exception from open3 # The eval is needed to catch exception from open3
eval { eval {
$pid = ::open3($stdin_fh, ">&OUT", ">&ERR", @setpgrp_wrap, $command) $pid = ::open3($stdin_fh, ">&OUT", ">&ERR", @setpgrp_wrap, $command)
@ -7094,7 +7079,7 @@ sub start {
open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!"); open ERR, '>&', $stderr_fh or ::die_bug("Can't dup STDERR: $!");
*IN = *STDIN; *IN = *STDIN;
# The eval is needed to catch exception from open3 # The eval is needed to catch exception from open3
my @setpgrp_wrap = ('perl','-e',"setpgrp\;exec '$Global::shell', '-c', \@ARGV"); my @setpgrp_wrap = ('perl','-e',"setpgrp\;setpriority\(0,0,$opt::nice\)\;exec '$Global::shell', '-c', \@ARGV");
eval { eval {
$pid = ::open3("<&IN", ">&OUT", ">&ERR", @setpgrp_wrap, $command) $pid = ::open3("<&IN", ">&OUT", ">&ERR", @setpgrp_wrap, $command)
|| ::die_bug("open3-<IN"); || ::die_bug("open3-<IN");

View file

@ -488,14 +488,17 @@ should feel free to use B<--will-cite>.
=item B<--block-size> I<size> =item B<--block-size> I<size>
Size of block in bytes. The I<size> can be postfixed with K, M, G, T, P, Size of block in bytes to read at a time. The I<size> can be postfixed
k, m, g, t, or p which would multiply the size with 1024, 1048576, with K, M, G, T, P, k, m, g, t, or p which would multiply the size
1073741824, 1099511627776, 1125899906842624, 1000, 1000000, with 1024, 1048576, 1073741824, 1099511627776, 1125899906842624, 1000,
1000000000, 1000000000000, or 1000000000000000 respectively. 1000000, 1000000000, 1000000000000, or 1000000000000000 respectively.
GNU B<parallel> tries to meet the block size but can be off by the GNU B<parallel> tries to meet the block size but can be off by the
length of one record. For performance reasons I<size> should be bigger length of one record. For performance reasons I<size> should be bigger
than a single record. than a two records. GNU B<parallel> will warn you and automatically
increase the size if you choose a I<size> that is too small.
If you use B<-N>, B<--block-size> should be bigger than N+1 records.
I<size> defaults to 1M. I<size> defaults to 1M.

View file

@ -282,6 +282,15 @@ B<--block-size> it increases the block size by 30%. A small
B<--block-size> gives very poor performance; by exponentially B<--block-size> gives very poor performance; by exponentially
increasing the block size performance will not suffer. increasing the block size performance will not suffer.
GNU B<parallel> will waste CPU power if B<--block-size> does not
contain a full record, because it tries to find a full record and will
fail to do so. The recommendation is therefore to use a
B<--block-size> > 2 records, so you always get at least one full
record when you read one block.
If you use B<-N> then B<--block-size> should be big enough to contain
N+1 records.
=head2 Convenience options --nice --basefile --transfer --return =head2 Convenience options --nice --basefile --transfer --return
--cleanup --tmux --group --compress --cat --fifo --workdir --cleanup --tmux --group --compress --cat --fifo --workdir
@ -317,7 +326,7 @@ up the tmpfile and keep the exit code of the command.
The real killer comes when you try to combine several of these: Doing The real killer comes when you try to combine several of these: Doing
that correctly for all corner cases is next to impossible to do by that correctly for all corner cases is next to impossible to do by
hard. hand.
=head2 Shell shock =head2 Shell shock