diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | src/ioblksize.h | 42 |
2 files changed, 28 insertions, 18 deletions
@@ -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. diff --git a/src/ioblksize.h b/src/ioblksize.h index dc9eb636b..ffd6ff37a 100644 --- a/src/ioblksize.h +++ b/src/ioblksize.h @@ -20,30 +20,36 @@ #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) { |