cat,cp,mv,install,split: Set the minimum IO block size used to 64KiB
authorPádraig Brady <P@draigBrady.com>
Thu, 21 Jul 2011 07:25:49 +0000 (08:25 +0100)
committerPádraig Brady <P@draigBrady.com>
Mon, 30 Apr 2012 10:14:31 +0000 (11:14 +0100)
* NEWS: Mention the change in behavior.
* src/ioblksize.h: Add updated test results and
increase value from 32KiB to 64KiB.

NEWS
src/ioblksize.h

diff --git a/NEWS b/NEWS
index b7bfb8c..1c00d96 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,10 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Changes in behavior
 
+  cp,mv,install,cat,split: now read and write a minimum of 64KiB at a time.
+  This was previously 32KiB and increasing to 64KiB was seen to increase
+  throughput by about 10% when reading cached files on 64 bit GNU/Linux.
+
   cp --attributes-only no longer truncates any existing destination file,
   allowing for more general copying of attributes from one file to another.
 
index dc9eb63..ffd6ff3 100644 (file)
 #include "stat-size.h"
 
 
-/* As of Mar 2009, 32KiB is determined to be the minimium
+/* As of Jul 2011, 64KiB is determined to be the minimium
    blksize to best minimize system call overhead.
-   This can be tested with this script with the results
-   shown for a 1.7GHz pentium-m with 2GB of 400MHz DDR2 RAM:
+   This can be tested with this script:
 
    for i in $(seq 0 10); do
-     size=$((8*1024**3)) #ensure this is big enough
      bs=$((1024*2**$i))
      printf "%7s=" $bs
-     dd bs=$bs if=/dev/zero of=/dev/null count=$(($size/$bs)) 2>&1 |
-     sed -n 's/.* \([0-9.]* [GM]B\/s\)/\1/p'
+     timeout --foreground -sINT 2 \
+       dd bs=$bs if=/dev/zero of=/dev/null 2>&1 |
+        sed -n 's/.* \([0-9.]* [GM]B\/s\)/\1/p'
    done
 
-      1024=734 MB/s
-      2048=1.3 GB/s
-      4096=2.4 GB/s
-      8192=3.5 GB/s
-     16384=3.9 GB/s
-     32768=5.2 GB/s
-     65536=5.3 GB/s
-    131072=5.5 GB/s
-    262144=5.7 GB/s
-    524288=5.7 GB/s
-   1048576=5.8 GB/s
+   With the results shown for these systems:
+   system-1 = 1.7GHz pentium-m with 400MHz DDR2 RAM, arch=i686
+   system-2 = 2.1GHz i3-2310M with 1333MHz DDR3 RAM, arch=x86_64
+   system-3 = 3.2GHz i7-970 with 1333MHz DDR3, arch=x86_64
+
+   blksize  system-1   system-2   system-3
+   ---------------------------------------
+      1024  734 MB/s   1.7 GB/s   2.6 GB/s
+      2048  1.3 GB/s   3.0 GB/s   4.4 GB/s
+      4096  2.4 GB/s   5.1 GB/s   6.5 GB/s
+      8192  3.5 GB/s   7.3 GB/s   8.5 GB/s
+     16384  3.9 GB/s   9.4 GB/s  10.1 GB/s
+     32768  5.2 GB/s   9.9 GB/s  11.1 GB/s
+     65536  5.3 GB/s  11.2 GB/s  12.0 GB/s
+    131072  5.5 GB/s  11.8 GB/s  12.3 GB/s
+    262144  5.7 GB/s  11.6 GB/s  12.5 GB/s
+    524288  5.7 GB/s  11.4 GB/s  12.5 GB/s
+   1048576  5.8 GB/s  11.4 GB/s  12.6 GB/s
 
    Note that this is to minimize system call overhead.
    Other values may be appropriate to minimize file system
@@ -58,7 +64,7 @@
    In the future we could use the above method if available
    and default to io_blksize() if not.
  */
-enum { IO_BUFSIZE = 32*1024 };
+enum { IO_BUFSIZE = 64*1024 };
 static inline size_t
 io_blksize (struct stat sb)
 {