Wednesday, 12 November 2014

Banana Pi SATA 2.0 disk throughput test

Hardware Configuration:

Banana Pi 1024MiB RAM, no overclocking
Inbuilt 10/100/1000 NIC is connected.
Top USB port is empty.
Bottom USB port is empty.
SATA disk connected via SATA cable to SATA port on BPi.
Harddisk is power from an external supply (R-Driver III).
No keyboard and no mouse.

The HDD that I'm using has an Internal write rate of about 100MiB/sec, so it is not a great disk for SATA performance testing, but it is the same make and model that I used for testing the Raspberry Pi USB disk throughput test.

 

Prerequisites:

apt-get install dosfstools
apt-get install expect expect-dev tcl8.6 tk8.6



ext2, ext3, ext4, vfat file system write tests 


I split a 2 TB disk into four equal sized partitions.

root@bananapi ~ # fdisk -l /dev/sda

Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x5d3d4ef6

Device     Boot      Start        End   Sectors   Size Id Type
/dev/sda1             2048  976758783 976756736 465.8G 83 Linux
/dev/sda2        976758784 1953515519 976756736 465.8G 83 Linux
/dev/sda3       1953515520 2930272255 976756736 465.8G 83 Linux
/dev/sda4       2930272256 3907028991 976756736 465.8G  c W95 FAT32 (LBA)

root@bananapi ~ # mkfs.ext2 -L ext2 /dev/sda1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 122094592 4k blocks and 30531584 inodes
Filesystem UUID: 35d529af-5e67-4f17-8c78-5af67a4f85f8
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

mkfs.ext2 -L ext2 /dev/sda1  0.65s user 31.41s system 12% cpu 4:18.17 total
root@bananapi ~ # mkfs.ext3 -L ext3 /dev/sda2
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 122094592 4k blocks and 30531584 inodes
Filesystem UUID: d0fe6f90-cc02-4d98-ba62-a704692edaf3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

mkfs.ext3 -L ext2 /dev/sda2  0.81s user 33.67s system 13% cpu 4:20.11 total
root@bananapi ~ # mkfs.ext4 -L ext4 /dev/sda3
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 122094592 4k blocks and 30531584 inodes
Filesystem UUID: 02029d9e-70e3-4012-a217-fff6754fe0b8
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

root@bananapi ~ # mkfs.vfat -n VFAT /dev/sda4
mkfs.fat 3.0.26 (2014-03-07)
root@bananapi ~ # cd /media
root@bananapi /media # mkdir ext2 ext3 ext4 vfat
root@bananapi /media # cd
 






root@bananapi ~ # cat write-throughputtest.exp
#!/usr/bin/expect -f

set force_conservative 0  ;# set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}


set timeout -1
spawn $env(SHELL)
match_max 100000
expect "root@bananapi"
send -- "script /root/output.txt\r"
expect "Script started, file is /root/output.txt\r"
send -- "mount /dev/sda1 /media/ext2\r"
expect "root@bananapi"
send -- "mount /dev/sda2 /media/ext3\r"
expect "root@bananapi"
send -- "mount /dev/sda3 /media/ext4\r"
expect "root@bananapi"
send -- "mount /dev/sda4 /media/vfat\r"
expect "root@bananapi"
send -- "/root/write-throughputtest.sh /media/ext2\r"
expect "root@bananapi"
send -- "/root/write-throughputtest.sh /media/ext3\r"
expect "root@bananapi"
send -- "/root/write-throughputtest.sh /media/ext4\r"
expect "root@bananapi"
send -- "/root/write-throughputtest.sh /media/vfat\r"
expect "root@bananapi"
send -- "exit\r"
expect "Script done, file is /root/output.txt\r"
send -- "exit\r"
expect eof
root@bananapi ~ #










root@bananapi ~ # cat write-throughputtest.sh
#!/bin/sh
DEST=$1

# 18 x 1GiB = 18GiB
# assuming maximum write SATA2 286MiB/sec this should take more than a minute
# assuming poor write speed of 5 MiB/sec this should take more than a hour
# either way one pass should happen within 12 hours
echo touch $DEST/testbegin-write-starttime
touch $DEST/testbegin-write-starttime
date
echo sync
sync
date

for BS in 8 16 32 64 128 256 \
        512 1024 2048 4096 8192 16384 \
        32768 65536 131072 262144 524288 1048576

do
 COUNT=`expr 1073741824 / $BS`
echo touch $DEST/${BS}b-write-starttime
 touch $DEST/${BS}b-write-starttime
date
echo dd if=/dev/zero of=$DEST/${BS}b-data bs=${BS} count=${COUNT}
 dd if=/dev/zero of=$DEST/${BS}b-data bs=${BS} count=${COUNT}
date
echo touch $DEST/${BS}b-write-endtime
 touch $DEST/${BS}b-write-endtime
date
echo sync
 sync
date
# any delay caused by sync will show up on next starttime
done

echo touch $DEST/testover-write-endtime
touch $DEST/testover-write-endtime
date

root@bananapi ~ #











root@bananapi ~ # cat read-throughputtest.sh
#!/bin/sh

SRCE=$1


# 18 x 1GiB = 18GiB
# assuming maximum read SATA2 286MB/sec this whould take just over a minute
# assuming poor read speed of 5 MiB/sec this should take just over a hour
# This script assumes that write-throughputtest.sh was run
# previously to generate the data files.

date
echo sync
sync
date

for BS in 8 16 32 64 128 256 \
        512 1024 2048 4096 8192 16384 \
        32768 65536 131072 262144 524288 1048576
do
 COUNT=`expr 1073741824 / $BS`
date

echo dd of=/dev/null if=$SRCE/${BS}b-data bs=${BS} count=${COUNT}
 dd of=/dev/null if=$SRCE/${BS}b-data bs=${BS} count=${COUNT}
date
echo sync
 sync
date
done


date
root@bananapi ~ #





I'm converting the results so that I can display them in MiB/sec instead of dd's default of MB/sec. Because I'm copying a Gigabyte of data with each block size all I need to do is divide 1024 by the number of seconds that it took to get the result in MiB/second.



root@bananapi ~ # grep bytes output.txt | grep copied | head -18
1073741824 bytes (1.1 GB) copied, 775.481 s, 1.4 MB/s
1073741824 bytes (1.1 GB) copied, 428.811 s, 2.5 MB/s
1073741824 bytes (1.1 GB) copied, 222.595 s, 4.8 MB/s
1073741824 bytes (1.1 GB) copied, 115.167 s, 9.3 MB/s
1073741824 bytes (1.1 GB) copied, 67.9903 s, 15.8 MB/s
1073741824 bytes (1.1 GB) copied, 43.2929 s, 24.8 MB/s
1073741824 bytes (1.1 GB) copied, 28.109 s, 38.2 MB/s
1073741824 bytes (1.1 GB) copied, 24.2247 s, 44.3 MB/s
1073741824 bytes (1.1 GB) copied, 23.847 s, 45.0 MB/s
1073741824 bytes (1.1 GB) copied, 23.8354 s, 45.0 MB/s
1073741824 bytes (1.1 GB) copied, 23.7234 s, 45.3 MB/s
1073741824 bytes (1.1 GB) copied, 23.8386 s, 45.0 MB/s
1073741824 bytes (1.1 GB) copied, 23.6681 s, 45.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.1159 s, 44.5 MB/s
1073741824 bytes (1.1 GB) copied, 24.3767 s, 44.0 MB/s
1073741824 bytes (1.1 GB) copied, 24.477 s, 43.9 MB/s
1073741824 bytes (1.1 GB) copied, 24.8436 s, 43.2 MB/s
1073741824 bytes (1.1 GB) copied, 24.3786 s, 44.0 MB/s
root@bananapi ~ # grep bytes output.txt | grep copied |  awk '{printf "%3.1f\n", 1024/$6}' | head -18
1.3
2.4
4.6
8.9
15.1
23.7
36.4
42.3
42.9
43.0
43.2
43.0
43.3
42.5
42.0
41.8
41.2
42.0
root@bananapi ~ #


 Results

SATA disk performance check on Banana Pi SATA port.


Banana Pi SATA disk write results (spinning rust)
-----------------------------------------------------------
block             filesystem type
size   -------------------------------------------            
(bytes)ext2       ext3       ext4       vfat
8       1.3 MiB/s  0.6 MiB/s  0.6 MiB/s  1.1 MiB/s
16      2.4 MiB/s  1.1 MiB/s  1.1 MiB/s  2.1 MiB/s
32      4.6 MiB/s  2.1 MiB/s  2.1 MiB/s  3.9 MiB/s
64      8.9 MiB/s  4.0 MiB/s  4.1 MiB/s  7.3 MiB/s
128    15.1 MiB/s  7.6 MiB/s  7.9 MiB/s 11.9 MiB/s
256    23.7 MiB/s 13.0 MiB/s 12.5 MiB/s 16.7 MiB/s
512    36.4 MiB/s 21.3 MiB/s 23.2 MiB/s 23.0 MiB/s
1k     42.3 MiB/s 30.9 MiB/s 36.0 MiB/s 26.4 MiB/s
2k     42.9 MiB/s 36.2 MiB/s 43.8 MiB/s 28.7 MiB/s
4k     43.0 MiB/s 40.3 MiB/s 44.5 MiB/s 29.7 MiB/s
8k     43.2 MiB/s 41.0 MiB/s 44.2 MiB/s 30.6 MiB/s
16k    43.0 MiB/s 40.6 MiB/s 44.0 MiB/s 31.0 MiB/s
32k    43.3 MiB/s
37.5 MiB/s 44.0 MiB/s 30.2 MiB/s
64k    42.5 MiB/s 39.9 MiB/s 43.4 MiB/s 30.4 MiB/s
128k   42.0 MiB/s 39.9 MiB/s 42.3 MiB/s 30.1 MiB/s
256k   41.8 MiB/s 39.1 MiB/s 43.3 MiB/s 29.8 MiB/s
512k   41.2 MiB/s 38.9 MiB/s 43.0 MiB/s 30.6 MiB/s

1M     42.0
MiB/s 39.6 MiB/s 43.5 MiB/s 30.0 MiB/s


Banana Pi SATA disk read results (spinning rust)
-----------------------------------------------------------
block             filesystem type
size   -------------------------------------------           
(bytes)ext2       ext3       ext4       vfat
8        2.1MiB/s   2.1MiB/s   2.0MiB/s   2.0MiB/s
16       4.0MiB/s   4.1MiB/s   4.1MiB/s   4.0MiB/s
32       8.7MiB/s   8.6MiB/s  
8.5MiB/s   8.6MiB/s
64     
17.0MiB/s  16.9MiB/s  17.0MiB/s  16.9MiB/s
128     31.3MiB/s  31.2MiB/s 
31.5MiB/s  30.5MiB/s
256     54.8MiB/s  54.2MiB/s 
55.1MiB/s  52.4MiB/s
512     84.6MiB/s 100.4MiB/s 
83.9MiB/s  72.8MiB/s
1k     108.7MiB/s
100.4MiB/s  86.5MiB/s  74.2MiB/s
2k     107.7MiB/s  99.6
MiB/s  87.2MiB/s  73.8MiB/s
4k     109.7MiB/s 100.4
MiB/s  86.3MiB/s  72.6MiB/s
8k     109.7MiB/s 100.8
MiB/s  87.7MiB/s  73.1MiB/s
16k    109.8MiB/s
100.4MiB/s  86.6MiB/s  74.1MiB/s
32k    108.8MiB/s  98.0
MiB/s  87.6MiB/s  73.5MiB/s
64k    109.2MiB/s 100.4
MiB/s  86.0MiB/s  72.7MiB/s
128k   109.3MiB/s
100.7MiB/s  85.7MiB/s  73.2MiB/s
256k   108.7MiB/s
100.5MiB/s  86.8MiB/s  74.1MiB/s
512k   108.9MiB/s 
99.6MiB/s  88.1MiB/s  73.3MiB/s
1M     109.1MiB/s  99.2MiB/s 
86.7MiB/s  72.9MiB/s




I decided to run the tests again with an old 128GB SSD (write performance will be OKish because it is used, but read performance should be better than spinning rust). But to avoid killing it (small writes cause SSD's to fail prematurely) I started the write testing at 4K block size.The read test block size does not matter at all, SSD's always fail due to running out of writes (3000-5000 per block) long before any wear due to reads can happen. The reason I ran the tests again with a SSD was because I felt that the limiting factor was the Harddisk's poor read/write performance and not any limit of the Banana Pi's SATA 2.0 port.











Banana Pi SATA disk write results (SSD)
-----------------------------------------------------------
block             filesystem type
size   -------------------------------------------            
(bytes)ext2       ext3       ext4       vfat
4k     44.9 MiB/s 40.0 MiB/s 42.5 MiB/s 29.0 MiB/s
8k     45.3 MiB/s 41.0 MiB/s 42.5 MiB/s 29.8 MiB/s
16k    44.2 MiB/s 41.0 MiB/s 42.7 MiB/s 29.5 MiB/s
32k    43.9 MiB/s
41.7 MiB/s 42.4 MiB/s 29.3 MiB/s
64k    43.6 MiB/s 40.4 MiB/s 41.9 MiB/s 29.0 MiB/s
128k   42.5 MiB/s 39.5 MiB/s 42.1 MiB/s 28.3 MiB/s
256k   42.6 MiB/s 39.9 MiB/s 41.7 MiB/s 28.9 MiB/s
512k   43.8 MiB/s 39.7 MiB/s 
43.0 MiB/s 30.9 MiB/s
1M     43.7
MiB/s 40.3 MiB/s 41.7 MiB/s 32.0 MiB/s

Banana Pi SATA disk read results (SSD)
-----------------------------------------------------------
block             filesystem type
size   -------------------------------------------           
(bytes)ext2       ext3       ext4       vfat
8        2.0MiB/s   2.0MiB/s   2.1MiB/s   2.1MiB/s
16       4.2MiB/s   4.2MiB/s   4.2MiB/s   4.2MiB/s
32       9.0MiB/s   8.9MiB/s  
9.1MiB/s   8.9MiB/s
64     
17.2MiB/s  17.1MiB/s  17.0MiB/s  17.0MiB/s
128     31.4MiB/s  31.6MiB/s 
31.5MiB/s  31.1MiB/s
256     53.7MiB/s  54.7MiB/s 
55.0MiB/s  55.0MiB/s
512     83.6MiB/s  85.8MiB/s 
86.6MiB/s  85.8MiB/s
1k     115.6MiB/s
126.0MiB/s 123.6MiB/s 121.9MiB/s
2k     139.4MiB/s 1
51.5MiB/s 154.0MiB/s 152.5MiB/s
4k     160.3MiB/s 181.1
MiB/s 175.1MiB/s 180.8MiB/s
8k     185.1MiB/s 1
86.0MiB/s 180.4MiB/s 183.9MiB/s
16k    182.8MiB/s
183.9MiB/s 176.4MiB/s 184.5MiB/s
32k    173.2MiB/s 161.3
MiB/s 168.8MiB/s 171.2MiB/s
64k    163.0MiB/s 151.4
MiB/s 158.6MiB/s 161.3MiB/s
128k   159.0MiB/s
147.2MiB/s 154.0MiB/s 156.5MiB/s
256k   156.0MiB/s
147.3MiB/s 152.0MiB/s 155.4MiB/s
512k   156.6MiB/s
145.2MiB/s 153.0MiB/s 156.3MiB/s
1M     157.9MiB/s 148.1MiB/s
154.8MiB/s 156.4MiB/s


Since the throughput is more than 150MB/sec, it does confirm that the SATA port in the Banana Pi is SATA 2.0. And I suspect that it could get closer to the SATA 2.0 limit of 300MB/sec if I used a brand new SSD. I have to admit that I am so much more impressed by a Banana Pi especially when compared to a Raspberry Pi. Especially for pushing large amounts of data about fast, it is brilliant hardware.

5 comments:

  1. very cool test . www.banana-pi.org BPI team tech support forum

    ReplyDelete
  2. Hi,
    impressive test! What OS did you use? And which Kernel is it?

    ReplyDelete
    Replies
    1. I don't know what kernel I had installed at the time of the test, but this is the current one. Not much would have changed in terms on SATA performance on the BananaPi-M1 (Performance would be much lower on the BananaPi-M3 that uses a USB-SATA bridge controller chip).

      http://www.banana-pi.org/m1.html <<---- this is the board that I did my tests on.
      http://www.banana-pi.org/m3.html <<---- this is their new 8 core board.

      $ cat /etc/os-release
      PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
      NAME="Debian GNU/Linux"
      VERSION_ID="8"
      VERSION="8 (jessie)"
      ID=debian
      HOME_URL="http://www.debian.org/"
      SUPPORT_URL="http://www.debian.org/support/"
      BUG_REPORT_URL="https://bugs.debian.org/"
      $ uname -a
      Linux bananapi 3.4.108-bananian #2 SMP PREEMPT Thu Aug 13 06:08:25 UTC 2015 armv7l GNU/Linux
      $

      Delete
    2. Be-ware the Banana Pi M2 and M3 doesn't have a native SATA connector! The M3 has a SATA connector, but it's a USB-SATA-bridge bleeh. The Banana Pi Pro does have a native SATA connector again. The forum also snub the multi-core chip:

      http://forum.banana-pi.org/t/banana-pi-bpi-m3-2nd-giveaway-enter-for-a-chance-to-win/491/31

      I also think the Banana Pi is much better to be used as a NAS server vs the Rasp which lacks the SATA port.

      Delete