先週作ったRaspberry Piを利用したポータブルNAS(PiNAS)だが、USB3.0ポートに接続したSSDからファイルを読み出そうとすると非常に遅くて実用にならなかった。
「遅い」というよりもSSDからの読み出しか、あるいはsambaの転送がストールして止まっているような感じだ。
最初は Pi4へ電源を供給している USB ACアダプタを疑った。
5.1V/5Aを要求する Pi5ほどではないが、Pi4も 5.1V/3Aの電源が必要とされている。
Ankerの PowerPort Atom PD 1(出力 5V/3A)を使っていたが、やはり足りなかったのだろうか?
()
¥2,580
()
¥998
かくなるうえはバスパワー給電ではなく、補助給電端子付きのUSBケーブルにした方がいいのかもしれないな。
()
¥749
でも電源以外の設定についても疑っておくべきかもしれない。
設定を3つ変えることで、サンバの速度とパフォーマンスが大幅に改善しました : r/OpenMediaVault
スループットがかなり安定するようになって、ほとんどのイメージバックアップは回線スピードにかなり近いところまで出た。ネットワークグラフの“突然のピーク/谷”ももうなくなった。テストでどれだけ違いが出たか、正直言って大げさじゃない。
この記事を読んで、/etc/samba/smb.confを以下のように変更してみた。
変更したのは「getwd cache = true」から下。
PiNAS:~ $ sudo vi /etc/samba/smb.conf
[global]
min protocol = SMB2
max protocol = SMB3
dos charset = CP932
unix charset = UTF-8
server signing = mandatory
log level = 0
getwd cache = true
write cache size = 2097152
min receivefile size = 16384
acl allow execute always = true
acl map full control = yes
deadtime = 60
strict sync = no
sync always = no
use sendfile = true
# interface names are normally preferred
interfaces = 127.0.0.0/8 eth0
bind interfaces only = yes
確かにこれで転送開始からの初速は改善されたのだが、ストールするのは直らなかった。
Raspberry Pi 4でUSB3.0接続のSSDがとても遅い
USB3.0ではUASPというプロトコルを使うと転送速度が上がります。しかしLinuxのドライバはまだこの規格を完全に実装できていいないようです。使用するUSBアダプタに依って相性問題が発生するようです。
この相性問題を解消するにはUASPを使わなければよいそうです。その代わり転送速度は少し落ちます。UASPを使わないようにするにはUSBアダプタをブラックリストへ登録すれば良いそうです。
ラズパイの場合はbootパーティションにあるカーネルコマンドラインにquirksを追加します。
どうやらこれがビンゴっぽい。
まず SSDがどのドライバで動いているか確認する。
PiNAS:~ $ lsusb -t -v
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
ID 1d6b:0002 Linux Foundation 2.0 root hub
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
ID 2109:3431 VIA Labs, Inc. Hub
|__ Port 002: Dev 003, If 0, Class=Mass Storage, Driver=uas, 480M
ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
/: Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 5000M
ID 1d6b:0003 Linux Foundation 3.0 root hub
|__ Port 001: Dev 003, If 0, Class=Mass Storage, Driver=uas, 5000M
ID 152e:7003 LG (HLDS)
2つの SSDともに「Driver=uas」になっているな。
SSDの VIDと PIDは ASMediaが174c:55aa、LGが152e:7003か。
モジュール設定ファイル(/etc/modprobe.d/)に書く方法を試したが、なぜかUASを無効化できなかったので
/boot/firmware/cmdline.txtの行頭に挿入する方法でやった。
PiNAS:~ $ sudo vi /boot/firmware/cmdline.txt
usb-storage.quirks=174c:55aa:u,152e:7003:u console=serial0,115200 console=tty1 root=PARTUUID=c4606c90-02 rootfstype=ext4 fsck.repair=yes rootwait ds=nocloud;i=rpi-imager-1794229642049 cfg80211.ieee80211_regdom=JP
UASを無効にするデバイスが複数あるときは、カンマで区切って羅列する。
initramfsを更新してリブートする。
PiNAS:~ $ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.18.60+rpt-rpi-v8
'/boot/initrd.img-6.18.60+rpt-rpi-v8' -> '/boot/firmware/initramfs8'
update-initramfs: Generating /boot/initrd.img-6.18.60+rpt-rpi-2712
'/boot/initrd.img-6.18.60+rpt-rpi-2712' -> '/boot/firmware/initramfs_2712'
PiNAS:~ $ sudo reboot
再起動したら、ちゃんと UASが無効になっているか確認する。
@PiNAS:~ $ lsusb -t
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 002: Dev 003, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/: Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 5000M
|__ Port 001: Dev 003, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
「Driver=usb-storage」になっているので大丈夫そうだ。

自宅のファイルサーバーだと 50MB/secくらいの転送速度だが、平均 20MB/sec出てくれるなら問題はない。
ひとまずはこれで実用になりそうだ。


