diff options
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | doc/coreutils.texi | 9 | ||||
-rw-r--r-- | src/sort.c | 17 | ||||
-rwxr-xr-x | tests/misc/sort-spinlock-abuse | 3 | ||||
-rwxr-xr-x | tests/misc/sort-stale-thread-mem | 3 | ||||
-rwxr-xr-x | tests/misc/sort-unique-segv | 3 |
6 files changed, 28 insertions, 13 deletions
@@ -27,6 +27,12 @@ GNU coreutils NEWS -*- outline -*- sort -m -o f f ... f no longer dumps core when file descriptors are limited. +** Changes in behavior + + sort will not create more than 8 threads by default due to diminishing + performance gains. Also the --parallel option is no longer restricted + to the number of available processors. + ** New features split accepts the --number option to generate a specific number of files. diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 00a557578..a74f64599 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -4190,10 +4190,11 @@ disks and controllers. @item --parallel=@var{n} @opindex --parallel @cindex multithreaded sort -Limit the number of sorts run in parallel to @var{n}. By default, -@var{n} is set to the number of available processors, and values -greater than that are reduced to that limit. Also see -@ref{nproc invocation}. +Set the number of sorts run in parallel to @var{n}. By default, +@var{n} is set to the number of available processors, but limited +to 8, as there are diminishing performance gains after that. +Note also that using @var{n} threads increases the memory usage by +a factor of log @var{n}. Also see @ref{nproc invocation}. @item -u @itemx --unique diff --git a/src/sort.c b/src/sort.c index 54dd81528..6cc058896 100644 --- a/src/sort.c +++ b/src/sort.c @@ -116,6 +116,10 @@ struct rlimit { size_t rlim_cur; }; this number has any practical effect. */ enum { SUBTHREAD_LINES_HEURISTIC = 4 }; +/* The number of threads after which there are + diminishing performance gains. */ +enum { DEFAULT_MAX_THREADS = 8 }; + /* Exit statuses. */ enum { @@ -455,7 +459,7 @@ Other options:\n\ -t, --field-separator=SEP use SEP instead of non-blank to blank transition\n\ -T, --temporary-directory=DIR use DIR for temporaries, not $TMPDIR or %s;\n\ multiple options specify multiple directories\n\ - --parallel=N limit the number of sorts run concurrently to N\n\ + --parallel=N change the number sorts run concurrently to N\n\ -u, --unique with -c, check for strict ordering;\n\ without -c, output only the first of an equal run\n\ "), DEFAULT_TMPDIR); @@ -4595,14 +4599,15 @@ main (int argc, char **argv) } else { - unsigned long int np2 = num_processors (NPROC_CURRENT_OVERRIDABLE); - if (!nthreads || nthreads > np2) - nthreads = np2; + if (!nthreads) + { + nthreads = MIN (DEFAULT_MAX_THREADS, + num_processors (NPROC_CURRENT_OVERRIDABLE)); + } /* Avoid integer overflow later. */ size_t nthreads_max = SIZE_MAX / (2 * sizeof (struct merge_node)); - if (nthreads_max < nthreads) - nthreads = nthreads_max; + nthreads = MIN (nthreads, nthreads_max); sort (files, nfiles, outfile, nthreads); } diff --git a/tests/misc/sort-spinlock-abuse b/tests/misc/sort-spinlock-abuse index bbf57534b..67ea89582 100755 --- a/tests/misc/sort-spinlock-abuse +++ b/tests/misc/sort-spinlock-abuse @@ -20,7 +20,8 @@ . "${srcdir=.}/init.sh"; path_prepend_ ../src print_ver_ sort -test "$(nproc)" = 1 && skip_ "requires a multi-core system" +grep '^#define HAVE_PTHREAD_T 1' "$CONFIG_HEADER" > /dev/null || + skip_test_ 'requires pthreads' seq 100000 > in || framework_failure_ mkfifo fifo || framework_failure_ diff --git a/tests/misc/sort-stale-thread-mem b/tests/misc/sort-stale-thread-mem index 2955e22c5..1f408d4c7 100755 --- a/tests/misc/sort-stale-thread-mem +++ b/tests/misc/sort-stale-thread-mem @@ -24,7 +24,8 @@ print_ver_ sort very_expensive_ valgrind --help >/dev/null || skip_ "requires valgrind" -test "$(nproc)" = 1 && skip_ "requires a multi-core system" +grep '^#define HAVE_PTHREAD_T 1' "$CONFIG_HEADER" > /dev/null || + skip_test_ 'requires pthreads' # gensort output seems to trigger the failure more often, # so prefer gensort if it is available. diff --git a/tests/misc/sort-unique-segv b/tests/misc/sort-unique-segv index 55a74147f..c4854f903 100755 --- a/tests/misc/sort-unique-segv +++ b/tests/misc/sort-unique-segv @@ -19,7 +19,8 @@ . "${srcdir=.}/init.sh"; path_prepend_ ../src print_ver_ sort -test "$(nproc)" = 1 && skip_ "requires a multi-core system" +grep '^#define HAVE_PTHREAD_T 1' "$CONFIG_HEADER" > /dev/null || + skip_test_ 'requires pthreads' cat <<\EOF > in || framework_failure_ |