信頼できる発行元

百均とジャンクコーナーと時々中華通販

Raspberry Pi Zeroを高速化

f:id:darekasan_net:20210726104004j:plain

Raspbery Pi Zeroのサイズや使い捨て感覚で買える値段の安さは何者にも代え難い最大の魅力だ。しかし、1GHzシングルコアなので、性能はオーバークロックした初代ラズパイとそう大差ない。その低い性能ゆえ、不便に感じることもしばしば。

  • OSの起動に時間がかかる
  • ソフトウェアのパッケージのインストールに時間がかかる
  • うっかりTab補完押しちゃって候補の表示に十数秒待たされる

ラズパイ4など買ったところでどうせやるのはLEDの点滅程度なんだからゼロでいいじゃん。

今回はそんなラズパイゼロを少しでも早く/速くするために行ったことをメモ的に残しておく。

前提

筆者のラズパイゼロの使い方はこうだ。

  • USB経由の有線LAN接続
  • SSH接続
  • ヘッドレス運用(モニターやキーボードは接続しない)
  • Pythonで書いたプログラムでGPIOを制御してあれこれする

なので、カメラを使ったり、無線LANを使ったりと条件が違う場合は一部読み替えながら進める必要がある。

やっていく

実行にあたってこちらのサイトを参考にした。こちらはラズパイ3かつネットワークは使用しないという条件のよう。

himeshp.blogspot.com

OSのインストール

microSDにOSを焼く。デスクトップ環境は使用しないのでRaspberry Pi OS Liteを選択。軽量を謳うDistroは他にもあるが、Web上の情報やパッケージの多さから最も標準的なOSを使うことにした。

WindowsMacからやるときはRaspberry Pi Imagerでお手軽にやるのがおすすめ。

起動にかかる時間を短縮したいので当然NOOBSは使わない。

初回起動と設定

初回起動時だけモニターとキーボードを接続して初期設定を行った。

raspberry pi headless setupとかでググればヘッドレスでやる方法は出てくる。今回は有線LAN接続だし標準でSSHもmDNSも吹いてるので特に何も準備しなくても接続できるはず。でも起動までの時間を測りたいのでモニターを接続した。

設定後と比較するために起動にかかる時間をsystemd-analyzeで調べる。

Startup finished in 5.304s (kernel) + 45.792s (userspace) = 51.096s 
graphical.target reached after 45.500s in userspace

電源投入からログインプロンプトが出るまでの時間をストップウォッチで測ったら57秒だった。

raspi-config

sudo raspi-config で

  • パスワードの変更
  • ホスト名の変更
  • ネットワーク接続確立を待つかどうか

あたりをやっておく。それ以外の設定は後で/boot/config.txtを直接いじるので今はやらない。

また、IPアドレスを固定するならそれも設定しておく。

無線LANで複数のアクセスポイントを切り替えて使ったりするなら起動は少し遅くなるがNetworkManagerを使うのがベター。

/etc/apt/sources.listの編集

deb http://ftp.jaist.ac.jp/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

日本のサーバーに変更することでパッケージのダウンロードが速くなる。全ラズパイ共通というかLinuxディストリ全般そう。

不要なサービスの停止

sudo systemctl disable [NAME]

とすることでシステム起動時にそのサービスを自動で立ち上げなくなる。どれを停止してどれを残すべきかは用途や環境によって変わる。何の機能に使われるサービスなのかを調べてから行うこと。

また、起動に時間を要するサービスはsystemd-analyze blameやsystemd-analyze critical-chainで見つけることができる。

  • triggerhappy.service ホットキー関連
  • wpa_supplicant.service 無線LAN関連
  • wifi-country.service 無線LAN関連
  • keyboard-setup.service キーボード配列の設定 ヘッドレスなら不要
  • hciuart.service Bluetooth関連
  • bluetooth.service Bluetooth関連
  • rpi-eeprom-update.service ラズパイ4しか関係ないっぽい?
  • dphys-swapfile.service スワップを有効にする
  • raspi-config.service
  • avahi-daemon.service mDNS ホスト名.localでアクセスするために必要

config.txtの編集とオーバークロック

config.txt - Raspberry Pi Documentation

処理速度が上がって起動が3秒ほど早くなる。10%のオーバークロックでも体感できるほど速くなるのでおすすめ。

半導体に詳しい偉い人が性能と消費電力 発熱 寿命のバランスを考えて導き出したベストな値を捨ててまでやることなので覚悟が必要。故障の危険性こそないが、極端な値では起動しないし、起動したとしてもすぐハングアップしてしまう。

個体ごとに適切な値が変わってくるので、高クロックで安定動作させるには設定を変えながら何度も試行錯誤する必要がある。1100MHzくらいで止めとくのが無難。

筆者の/boot/config.txt次の通りになった。細かい設定もついでに行った。

enable_uart=0
disable_overscan=1
start_x=0
gpu_mem=32
boot_delay=0
disable_splash=1

[pi0]

# SDカードのオーバークロック
dtoverlay=sdhost,overclock_50=100

# 常に高クロック
force_turbo=1

# SoCとメモリのオーバークロック
arm_freq=1150
over_voltage=8
core_freq=500
sdram_freq=530
over_voltage_sdram=1
over_voltage_sdram_c=7
over_voltage_sdram_i=7
over_voltage_sdram_p=8

SDカードオーバークロックはdmesgでmmc0: overclocking to 100000000Hzみたいなのが出ていれば成功。エラーが発生すると自動的に下げられてしまう。ラズパイ3などの設定例ではdtoverlay=sdtweak,overclock_50=100となっているが、ラズパイゼロの場合はsdhostでいい。

ウォッチドッグタイマーを使えばハングアップ時に自動でリセットをかけてくれるので必要なら設定しよう。

quietフラグ

console=console=tty1 root=PARTUUID=74f808e3-02 rootfstype=ext4 elevator=deadline fsck.repair=yes quiet rootwait

cmdline.txtにquietフラグを追加。起動時に画面にいろいろ表示されなくなるので早くなるらしい。

効果が薄い、全く無い設定

起動時fsckしない

/boot/cmdline.txt

console=console=tty1 root=PARTUUID=74f808e3-02 rootfstype=ext4 elevator=deadline fsck.repair=yes quiet rootwait

fsck.repair=no を追加することで、起動時fsckを実行しなくなる。

ファイルシステムの信頼性を欠くので非推奨。0.5秒くらいしか縮まらない。

rootfsの指定をUUIDじゃなくする

/boot/cmdline.txtと/etc/fstabに設定。全く効果なかった。

noarp

/etc/dhcpcd.confにnoarpを追加。接続確立が若干早くなるかも。

/bootをマウントしない

/etc/fstabの"/boot"の行をコメントアウト

pi@raspberrypi ~ % cat /etc/fstab
proc            /proc           proc    defaults          0       0
#PARTUUID=74f808e3-01  /boot           vfat    defaults          0       2
PARTUUID=74f808e3-02  /               ext4    defaults,noatime  0       1
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

config.txtをいじりたいときにわざわざ手動でマウントしなくてはならないので面倒。一通り設定を終えたあとならやってもいいかも。

結果

電源投入から20秒もあればSSHで接続できるくらいになった。

pi@raspberrypi ~ % systemd-analyze
Startup finished in 3.205s (kernel) + 8.311s (userspace) = 11.517s
graphical.target reached after 7.864s in userspace

用途に合わせてカーネルコンパイルし直したり不要なモジュールを切ったりすればもう少し早くなるのかもしれない。

オーバークロックを行うことによって起動や体感速度は早くなったが、openssl speed -evp aes-ctrは早くならなかった。

SDカードはおよそ2倍速くなった。

pi@raspberrypi ~ % sudo hdparm -t /dev/mmcblk0

/dev/mmcblk0:
 HDIO_DRIVE_CMD(identify) failed: Invalid argument
 Timing buffered disk reads: 128 MB in  3.02 seconds =  42.32 MB/sec