Raspberry Pi 3 B+をシールドボックスでベンチマーク

3.14159265..なπの日の夜、スイッチサイエンスさんにいきなり電話をしまして、電波法に抵触しない適法上でのテストを行うためにシールドボックスをお借りしてベンチマークを実施しました。外に対してはUSBのポートがでていて、このポートと内部にあるUSBがブリッジのような形になっており、このUSBからRaspberry Pi 3B+と接続ができるようになっております。

で実際のテストはといえば中に閉じ込めて行わねばいけなくて、外部のインターネットと直接接続できる何かがでているわけでもないため、テストはおなじみのUnixbenchぐらいがやっとなのが事実です。なので、いつもながらおなじみで申し訳ないのですが、Unixbenchをとってみました。



   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

------------------------------------------------------------------------------
   Use directories for:
      * File I/O tests (named fs***) = /home/pi/byte-unixbench/UnixBench/tmp
      * Results                      = /home/pi/byte-unixbench/UnixBench/results
------------------------------------------------------------------------------


1 x Dhrystone 2 using register variables  1

1 x Double-Precision Whetstone  1

1 x Execl Throughput  1

1 x File Copy 1024 bufsize 2000 maxblocks  1

1 x File Copy 256 bufsize 500 maxblocks  1

1 x File Copy 4096 bufsize 8000 maxblocks  1

1 x Pipe Throughput  1

1 x Pipe-based Context Switching  1

1 x Process Creation  1

1 x System Call Overhead  1

1 x Shell Scripts (1 concurrent)  1

1 x Shell Scripts (8 concurrent)  1

4 x Dhrystone 2 using register variables  1

4 x Double-Precision Whetstone  1

4 x Execl Throughput  1

4 x File Copy 1024 bufsize 2000 maxblocks  1

4 x File Copy 256 bufsize 500 maxblocks  1

4 x File Copy 4096 bufsize 8000 maxblocks  1

4 x Pipe Throughput  1

4 x Pipe-based Context Switching  1

4 x Process Creation  1

4 x System Call Overhead  1

4 x Shell Scripts (1 concurrent)  1

4 x Shell Scripts (8 concurrent)  1

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: raspberrypi: GNU/Linux
   OS: GNU/Linux -- 4.9.80-v7+ -- #1098 SMP Fri Mar 9 19:11:42 GMT 2018
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 1: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 2: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 3: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   12:20:45 up 2 min,  3 users,  load average: 0.09, 0.08, 0.03; runlevel 2018-03-14

------------------------------------------------------------------------
Benchmark Run: Wed Mar 14 2018 12:20:45 - 12:27:30
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        5064713.2 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     1224.3 MWIPS (9.9 s, 1 samples)
Execl Throughput                                507.1 lps   (29.9 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        159405.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks           47023.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks        403956.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                              353550.8 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                  63697.5 lps   (10.0 s, 1 samples)
Process Creation                               2420.9 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   2202.1 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                    668.7 lpm   (60.0 s, 1 samples)
System Call Overhead                         687831.7 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    5064713.2    434.0
Double-Precision Whetstone                       55.0       1224.3    222.6
Execl Throughput                                 43.0        507.1    117.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     159405.0    402.5
File Copy 256 bufsize 500 maxblocks            1655.0      47023.0    284.1
File Copy 4096 bufsize 8000 maxblocks          5800.0     403956.0    696.5
Pipe Throughput                               12440.0     353550.8    284.2
Pipe-based Context Switching                   4000.0      63697.5    159.2
Process Creation                                126.0       2420.9    192.1
Shell Scripts (1 concurrent)                     42.4       2202.1    519.4
Shell Scripts (8 concurrent)                      6.0        668.7   1114.5
System Call Overhead                          15000.0     687831.7    458.6
                                                                   ========
System Benchmarks Index Score                                         336.3

------------------------------------------------------------------------
Benchmark Run: Wed Mar 14 2018 12:27:30 - 12:34:21
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       20174506.0 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     4936.7 MWIPS (9.9 s, 1 samples)
Execl Throughput                               2474.9 lps   (29.9 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        263690.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks           70797.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks        647637.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             1431414.8 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                 221854.5 lps   (10.0 s, 1 samples)
Process Creation                               5696.9 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   4949.5 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                    644.5 lpm   (60.2 s, 1 samples)
System Call Overhead                        2640381.9 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   20174506.0   1728.7
Double-Precision Whetstone                       55.0       4936.7    897.6
Execl Throughput                                 43.0       2474.9    575.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     263690.0    665.9
File Copy 256 bufsize 500 maxblocks            1655.0      70797.0    427.8
File Copy 4096 bufsize 8000 maxblocks          5800.0     647637.0   1116.6
Pipe Throughput                               12440.0    1431414.8   1150.7
Pipe-based Context Switching                   4000.0     221854.5    554.6
Process Creation                                126.0       5696.9    452.1
Shell Scripts (1 concurrent)                     42.4       4949.5   1167.3
Shell Scripts (8 concurrent)                      6.0        644.5   1074.2
System Call Overhead                          15000.0    2640381.9   1760.3
                                                                   ========
System Benchmarks Index Score                                         867.2

ほんと、技適の問題でおおっぴらに電源をいれられないのは口惜しい限りですが、ご参考ください。また深夜だというのに押しかけでシールドボックスをお貸しいただきましたスイッチサイエンス様に御礼申し上げます。


Raspberry Pi 3とPi DriveでUSB HDDブートをしてみよう

Raspberry Pi 3向けに、SDカード以外のブート方法を提供するための機能が追加されています。現在はベータ版の扱いなので、不具合があるかもしれませんが、試す手順なども掲載されています。

現在はUSBブート、PXEブートの2種類が紹介されています。

https://www.raspberrypi.org/blog/pi-3-booting-part-i-usb-mass-storage-boot/

https://www.raspberrypi.org/blog/pi-3-booting-part-ii-ethernet-all-the-awesome/

PXEブートに関しては私の個人ブログでも紹介していますので、興味がありましたらこちらも見てみてください。

さて、本記事ではPi Driveを使用してUSBブートをしてみたいと思います。

Pi Drive

Pi Driveとは?

Pi Driveは、Western DigialがRaspberry Pi向けにリリースした2.5インチハードディスクです。容量はPi==πにかけて314GBになっています(フォーマットすると……314GBではなくなります)。特徴的なのはインターフェイスで、SATAではなくUSBポートが搭載されています。なので、USBケーブル1本でRaspberry Piと接続できるわけです。

http://store.wdc.com/promo/97047600

正規の購入経路としてはWestern Digitalの通販サイトがあるものの、日本への輸入には対応していないようです。しかし、おおたさんがなぜか入手されたのをお借りしたので、ぺろぺろなめまわしています(なめまわしていません)。

その他謎の入手経路としては、dx.com(中国のガジェット系通販サイト)がありました。ぶっちゃけ容量単価的にはおいしくないですけども。

http://www.dx.com/p/2-5-314gb-usb-hard-drive-for-raspberry-pi-3b-2b-b-silver-black-437594

パッケージはこのような感じです。

IMG_4921

側面には円周率も……!

IMG_4922

Pi Driveはberrybootを使用したHDDブートモードが用意されています。ただ、berrybootがMicroSDカードから起動するようなので完全にSDカードレスにできるわけではないようです。また、Raspberry Pi3リリース前にリリースされたパッケージでしたので、そもそもRaspberry Pi 3には対応していないようでした。

IMG_4923

USBブートをしてみよう

USBブートをするためには以下の手順が必要になります。

Raspberry Pi側の準備

  • MicroSDカードでブートする
  • rpi-updateで最新のファームウェアにアップデート
  • USBブートを有効にする設定を記述して再起動
  • USBブートが有効になったことを確認してシャットダウン

HDDの用意

  • パーティションを切る
  • 切ったパーティションをそれぞれフォーマット
  • Raspberry PiのOSイメージからファイルコピー
  • SDカードからbootcode.binとstart.elfをコピー

作業は以下のページを参考に進めました。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md

Raspberry Pi側の準備

USBブートを有効にするには、最新のファームウェアにアップデートした環境で特定のオプションを有効にした状態でブートする必要があります。この作業は1度実行すれば、以降は不要のようです。

MicroSDカードに最新のRaspbianを用意して起動した後、以下のコマンドを実行します。

sudo BRANCH=next rpi-update

/boot/config.txtをエディターで開き、以下の一文を追記します。

program_usb_boot_mode=1

Raspbianを再起動したら以下のコマンドを実行して、出力が「17:3020000a」であることを確認します。

$ vcgencmd otp_dump | grep 17:
17:3020000a

HDDの用意

Raspberry PiにPi Driveを接続します。まずはpartedコマンドでパーティションを作成します。

$ sudo parted /dev/sda

(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: WD My Passport 07BA (scsi)
Disk /dev/sda: 314GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary fat32 lba
2 99.6MB 314GB 314GB primary ext4 lba
(parted) quit

パーティションをそれぞれmkfsコマンドでフォーマットします。

sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2

フォーマットしたパーティションをそれぞれ以下のようにマウントします。

sudo mount /dev/sda2 /mnt
sudo mkdir /mnt/boot
sudo mount /dev/sda1 /mnt/boot/

SDカードの中のRaspbianを、rsyncコマンドでHDDにコピーします。rsyncコマンドは別途インストールする必要があります。

sudo apt-get install rsync
sudo rsync -ax / /boot /mnt

コピーしたあとは、HDD内のいくつかのファイルでブート用のパラメータをHDD用に書き換えます。SDカードのデバイス名はmmcblk0ですが、HDDの場合はデバイス名がsdaになるためです。参考ページのようにコマンドで実行すると、一括で置き換えてくれます。

$ sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/boot/cmdline.txt
$ sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/etc/fstab

最後にSSHホスト鍵を再生成します。こちらも基本的には参考ページの通り実行します。

cd /mnt
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot /mnt
rm /etc/ssh/ssh_host*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc

最後にRaspberry Piをシャットダウンします。

$ sudo poweroff

HDDブート!

Raspberry Piの電源ケーブルを抜いたら、MicroSDカードを抜き取り、HDDは接続したまま電源を再投入します。少しするとHDDがスピンアップして、(一度スピンダウンしながら)Raspberry Piが起動します。

HDDから起動していることを確認するには以下のようなコマンドを実行してみると良いでしょう。


pi@raspberrypi:~ $ cat /proc/partitions
major minor #blocks name

(中略)
8 0 306677760 sda
8 1 96256 sda1
8 2 306580480 sda2
pi@raspberrypi:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 288G 1.2G 272G 1% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6.2M 457M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/sda1 93M 20M 73M 22% /boot
pi@raspberrypi:~ $ mount | grep sda
/dev/sda2 on / type ext4 (rw,noatime,data=ordered)
/dev/sda1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

まとめ

Pi Driveを使用して、Raspberry Pi 3でUSB-HDDブートする方法を紹介しました。MicroSDカードが不要になるので、書き換え寿命を気にする必要がなくなるのは便利かもしれません。

あと、Pi Driveについて、一つ気なるところをあげるとすると、アクセスランプの白色LEDがまぶしすぎる点でしょうか……。目に跡が残るくらい明るいんですよね……w