1 /* I/O block size definitions for coreutils
2 Copyright (C) 1989-2013 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 /* Include this file _after_ system headers if possible. */
19 /* sys/stat.h will already have been included by system.h. */
20 #include "stat-size.h"
23 /* As of Jul 2011, 64KiB is determined to be the minimium
24 blksize to best minimize system call overhead.
25 This can be tested with this script:
27 for i in $(seq 0 10); do
30 timeout --foreground -sINT 2 \
31 dd bs=$bs if=/dev/zero of=/dev/null 2>&1 \
32 | sed -n 's/.* \([0-9.]* [GM]B\/s\)/\1/p'
35 With the results shown for these systems:
36 system-1 = 1.7GHz pentium-m with 400MHz DDR2 RAM, arch=i686
37 system-2 = 2.1GHz i3-2310M with 1333MHz DDR3 RAM, arch=x86_64
38 system-3 = 3.2GHz i7-970 with 1333MHz DDR3, arch=x86_64
40 blksize system-1 system-2 system-3
41 ---------------------------------------
42 1024 734 MB/s 1.7 GB/s 2.6 GB/s
43 2048 1.3 GB/s 3.0 GB/s 4.4 GB/s
44 4096 2.4 GB/s 5.1 GB/s 6.5 GB/s
45 8192 3.5 GB/s 7.3 GB/s 8.5 GB/s
46 16384 3.9 GB/s 9.4 GB/s 10.1 GB/s
47 32768 5.2 GB/s 9.9 GB/s 11.1 GB/s
48 65536 5.3 GB/s 11.2 GB/s 12.0 GB/s
49 131072 5.5 GB/s 11.8 GB/s 12.3 GB/s
50 262144 5.7 GB/s 11.6 GB/s 12.5 GB/s
51 524288 5.7 GB/s 11.4 GB/s 12.5 GB/s
52 1048576 5.8 GB/s 11.4 GB/s 12.6 GB/s
54 Note that this is to minimize system call overhead.
55 Other values may be appropriate to minimize file system
56 or disk overhead. For example on my current GNU/Linux system
57 the readahead setting is 128KiB which was read using:
60 device=$(df -P --local "$file" | tail -n1 | cut -d' ' -f1)
61 echo $(( $(blockdev --getra $device) * 512 ))
63 However there isn't a portable way to get the above.
64 In the future we could use the above method if available
65 and default to io_blksize() if not.
67 enum { IO_BUFSIZE
= 64*1024 };
69 io_blksize (struct stat sb
)
71 return MAX (IO_BUFSIZE
, ST_BLKSIZE (sb
));