Hlavní navigace

Raspberry Pi 4B a Raspbian Buster: první zkušenosti a řešení problémů

4. 7. 2019
Doba čtení: 9 minut

Sdílet

 Autor: Raspberry Pi Foundation
Nedávno mi domů přišla nová Raspberry Pi 4B se 4 GB RAM a zároveň byl vydán nový Raspbian Buster, který je k chodu Raspberry Pi 4 vyžadován. V článku naleznete první dojmy a problémy, na které jsem narazil.

Problém s 5 GHz WiFi při instalaci

Při instalaci nového Raspbianu Buster jsou nově nedostupné 5GHz kanály na WiFi. Nevím, jestli jde o legislativní problém, nebo proč tomu tak je. Každopádně je to popsané již v poznámkách k vydání. Pokud chcete použít 5GHz WiFi, je možné spustit v příkazovém řádku  rfkill unblock wifi, nebo trvale nastavit zemi v sudo raspi-config (4. Localisation Options  I4. Change WiFi Country).

Podívejte se, jak nové RPi 4B vypadá:

Chyba v jádře?

Pokud jste ve výchozím jádře 4.19.50 v dmesg  objevili podezřelou chybu, která se týká vc4_crtc_atomic_flush a drm_vblank_put, tak nepanikařte. Tuto chybu tam mají všichni a vývojáři o ní vědí. Projeví se při spuštění spořiče obrazovky, ale zřejmě to nebude mít na funkci vliv.

[45927.237526] ------------[ cut here ]------------
[45927.237612] WARNING: CPU: 2 PID: 514 at drivers/gpu/drm/vc4/vc4_firmware_kms.c:869 vc4_crtc_atomic_flush+0x98/0x9c [vc4]
[45927.237622] Modules linked in: rfcomm bnep hci_uart btbcm serdev bluetooth ecdh_generic fuse 8021q garp stp llc vc4 joydev drm_kms_helper evdev v3d gpu_sched
brcmfmac brcmutil snd_soc_core sha256_generic snd_compress snd_pcm_dmaengine syscopyarea drm snd_bcm2835(C) raspberrypi_hwmon drm_panel_orientation_quirks hwmon
snd_pcm sysfillrect sysimgblt snd_timer fb_sys_fops cfg80211 snd rfkill bcm2835_codec(C) bcm2835_v4l2(C) v4l2_mem2mem bcm2835_mmal_vchiq(C) videobuf2_dma_contig
v4l2_common videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_common videodev media argon_mem uio_pdrv_genirq uio fixed i2c_dev ip_tables x_tables
ipv6
[45927.238154] CPU: 2 PID: 514 Comm: Xorg Tainted: G         C        4.19.50-v7l+ #895
[45927.238162] Hardware name: BCM2835
[45927.238193] [<c0212c80>] (unwind_backtrace) from [<c020d49c>] (show_stack+0x20/0x24)
[45927.238215] [<c020d49c>] (show_stack) from [<c0978f60>] (dump_stack+0xd4/0x118)
[45927.238236] [<c0978f60>] (dump_stack) from [<c0222270>] (__warn+0x104/0x11c)
[45927.238253] [<c0222270>] (__warn) from [<c02223c0>] (warn_slowpath_null+0x50/0x58)
[45927.238315] [<c02223c0>] (warn_slowpath_null) from [<bf8f1aa4>] (vc4_crtc_atomic_flush+0x98/0x9c [vc4])
[45927.238469] [<bf8f1aa4>] (vc4_crtc_atomic_flush [vc4]) from [<bf8a57f0>] (drm_atomic_helper_commit_planes+0x1a4/0x298 [drm_kms_helper])
[45927.238605] [<bf8a57f0>] (drm_atomic_helper_commit_planes [drm_kms_helper]) from [<bf8f317c>] (vc4_atomic_complete_commit+0x60/0x33c [vc4])
[45927.238702] [<bf8f317c>] (vc4_atomic_complete_commit [vc4]) from [<bf8f3538>] (vc4_atomic_commit+0xe0/0x194 [vc4])
[45927.238933] [<bf8f3538>] (vc4_atomic_commit [vc4]) from [<bf5ae37c>] (drm_atomic_commit+0x5c/0x60 [drm])
[45927.239290] [<bf5ae37c>] (drm_atomic_commit [drm]) from [<bf5b0474>] (drm_mode_atomic_ioctl+0x98c/0xb78 [drm])
[45927.239632] [<bf5b0474>] (drm_mode_atomic_ioctl [drm]) from [<bf59bbc4>] (drm_ioctl_kernel+0xb4/0xf0 [drm])
[45927.239967] [<bf59bbc4>] (drm_ioctl_kernel [drm]) from [<bf59bff8>] (drm_ioctl+0x230/0x3cc [drm])
[45927.240147] [<bf59bff8>] (drm_ioctl [drm]) from [<c03c3e3c>] (do_vfs_ioctl+0xbc/0x804)
[45927.240168] [<c03c3e3c>] (do_vfs_ioctl) from [<c03c45c8>] (ksys_ioctl+0x44/0x6c)
[45927.240186] [<c03c45c8>] (ksys_ioctl) from [<c03c4608>] (sys_ioctl+0x18/0x1c)
[45927.240203] [<c03c4608>] (sys_ioctl) from [<c0201000>] (ret_fast_syscall+0x0/0x28)
[45927.240212] Exception stack(0xce68bfa8 to 0xce68bff0)
[45927.240224] bfa0:                   01a65358 bec54a78 0000000c c03864bc bec54a78 00000000
[45927.240238] bfc0: 01a65358 bec54a78 c03864bc 00000036 01c751b0 01a179e0 013935b0 0000002d
[45927.240247] bfe0: b6d8108c bec54a44 b6d68594 b69f451c
[45927.240257] ---[ end trace 8dc5586bf6e05874 ]---

Rpi-update

Ačkoliv příkaz rpi-update pro aktualizaci jádra a firmware je součástí nového Raspbianu, nově vypíše varování, že je lépe jej nepoužívat a čekat, až se jádro a firmware aktualizuje pomocí  apt.

#############################################################
WARNING: 'rpi-update' updates to pre-releases of the linux kernel tree and Videocore firmware. 'rpi-update' should only be used if there is a specific reason to do so - for example, a request by a Raspberry Pi engineer. DO NOT use 'rpi-update' as part of a regular update process. ##############################################################

Hardwarový generátor náhodných čísel

Již první Raspberry Pi měla hardwarový generátor náhodných čísel, bylo však potřeba několik kroků k jeho zprovoznění. V posledním Raspbianu již není potřeba zavádět modul bcm2708-rng, je v jádře. Také není potřeba instalovat rng-tools, jsou již nainstalované a puštěné, vše funguje jak má. Vyzkoušet si to můžeme třebas pomocí  dd.

dmesg | grep rng
[    0.000000] random: get_random_bytes called from start_kernel+0xc0/0x4e8 with crng_init=0
[    0.321069] iproc-rng200 fe104000.rng: hwrng registered

dd if=/dev/random of=/dev/null status=progress

Obsah /dev/random nám na Raspberry Pi 4 dává 38,3 kB/s. Na Raspberry Pi 3b+ dostaneme 24,4 kB/s. Při použití méně náhodného /dev/urandom pak máme rychlosti 25,5 MB/s (RPi 4), 38,1 MB/s (RPi 3+).

Watchdog

Opět již první Raspberry Pi mělo watchdog. Toto zařízení má při „zatuhnutí“ počítače problém vyřešit jeho restartem. V novém Raspbianu už nepotřebujeme modul  bcm2835-wdt, opět již je součástí jádra.

dmesg | grep watchdog
[    0.839399] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer

Také se se systemd obejdeme bez balíčku watchdog a /dev/watchdog může být „krmen“ přímo systemd. Je potřeba odkomentovat v souboru /etc/systemd/system.conf řádek s  RuntimeWatchdogSec=10. „Krmení“ watchdogu bude probíhat zhruba každých 5 sekund (polovina 10), přitom výchozí a zároveň nejdelší možný HW timeout je 15 sekund.

Zkrátit by šel parametrem jádra  bcm2835_wdt.heartbeat=10, ale asi k tomu není důvod. Pokud máte watchdog aktivní, můžete jej otestovat třeba klasickou fork-bombou  :(){ :|:& };:. Bez použití watchdogu dojde k „zatuhnutí“, s ním k restartu.

K čemu všemu lze RPi použít:

Teplota

Teplota nového Raspberry Pi 4B je trochu vyšší, než tomu bylo u předchozího modelu 3B+. V klidu s běžným centimetrovým hliníkovým chladičem a bez krabičky je teplota u 4B 55°C a u 3B+ 45°C. Limit pro thermal throttling je u 4B 85°C a u 3B+ 60°C, jde ale bezpečně zvýšit na 70°C pomocí  temp_soft_limit=70 v /boot/config.txt. Teplotu a frekvenci CPU lze pěkně a barevně sledovat například pomocí bcmstat.sh, který již Raspberry Pi 4 umí.


Nedávno se objevil nový firmware pro řadič VLI USB3 v Raspberry Pi 4, který zapne ASPM (ano, Raspberry Pi 4 má PCI a na něm právě řadič USB3) a to by mělo nové Raspberry ochladit o 3 až 5 stupňů. Bude ale asi dobré ještě chvíli počkat, protože se objevily problémy s rychlostí sběrnice USB3.

Dekódování HEVC H.265

Raspberry Pi 4 by mělo umět dekódovat hardwarově HEVC H.265, ale zatím neumí. Zřejmě to bude vyřešeno v nějaké další aktualizaci. Nicméně jsem zkoušel, jestli zvládne alespoň softwarově něco zobrazit. Využil jsem pěkné půlminutové vzorky medůz HEVC 1080p o různém datovém toku.

VLC v Raspberry Pi 4 zvládne plynule přehrát 3 a 5 Mb/s, 10 Mb/s už ne. Kupodivu Kodi je na tom lépe a přehraje vše plynule až do 45 Mb/s. V obou případech jsou vytížena všechna jádra a bez přídavného větrání dojde celkem rychle k přehřátí (když je půlminutový klip ve smyčce). Oproti tomu Raspberry Pi 3 nepřehrála plynule ani 3 Mb/s a to ani ve VLC ani v Kodi.

Rychlost SD karty

Zkoušel jsem kartu SanDisk MicroSDXC 64GB Extreme A2 (tvrdí se, že levnější A1 je rychlejší) jak v Raspberry 3 tak v Raspberry 4. Testoval jsem skriptem microsd-benchmarks.sh a k tomu ještě IOPS při čtení pomocí  ioping -R.

Raspberry Pi rychlost SD karty
sekvenční čtení MB/s sekvenční zápis MB/s náhodné čtení MB/s náhodný zápis MB/s náhodné čtení IOPS
RPi 4 45.2 31.6 6.12 3.32 1890
RPi 3 21.6 17.8 5.42 3.01 1340
RPi 3
přetaktovaná
31.5 23.3 5.97 3.04 1490

Raspberry Pi 4 má skutečně patrně dvakrát rychlejší přístup na SD kartu, to lze na Raspberry Pi 3 a starších kompenzovat „přetaktováním“ SD karty pomocí řádku dtparam=sd_overclock=100 (výchozí hodnota je 50) v /boot/config.txt. Potom v dmesg | grep mmc  naleznete  [    1.326073] mmc0: overclocking to 100000000Hz . U Raspberry Pi 4 se mi SD kartu „přetaktovat“ nepodařilo.

Raspberry Pi Foundation otevřela nedávno první obchod:

Linpack

Podle testu high performance linpack (HPL) se tradičně posuzuje rychlost největších počítačů. Raspberry Pi Foundation zveřejnilo také výsledky Linpacku, ale jsou dosti nízké. Teoreticky by Cortex-A53 na 1,2 GHz (1,4 GHz je spíš turbo a ne pro stálou zátěž) v Raspberry Pi 3+ měl dosahovat 10 GFLOPS a Cortex-A72 na 1,5 GHz v Raspberry Pi 4 dokonce 24 GFLOPS v DP. Výsledky Raspberry Pi Foundation však ukazují jen 0,5 GFLOPS a 2,0 GFLOPS v SP s použitím instrukcí NEON. 

Tady asi něco nesouhlasí. Zkusíme si HPL zkompilovat sami a test pustit. Nejprve je potřeba knihovna MPI (Message Passing Interface) pro víceprocesorové a vícepočítačové výpočty, vezmeme třeba OpenMPI.

# apt install libopenmpi-dev

Dále budeme potřebovat optimalizovanou knihovnu BLAS (Basic Linear Algebra Subprograms). Na této knihovně závisí rychlost nejvíce. V současnosti je asi nejlepší volbou OpenBLAS. Tato knihovna již v Raspbianu je ( apt install libopenblas-dev), ale není optimální (7,8 GFLOPS na RPi 4). Zkompilujeme si ji tedy sami. Vezmeme aktuální verzi 0.3.6 a jen pustíme make -j4, což je ekvivalent make -j4 TARGET=ARMv7. Bohužel přímo pro ARMv8 a Cortex-A53 případně Cortex-A72 optimalizovat nemůžeme, jelikož to vyžaduje 64bitové prostředí a Raspbian je hlavně kvůli zpětné kompatibilitě s Raspberry Pi 1 stále 32bitový. Po asi 13 minutách by mělo být hotovo. Výsledné knihovny dáme do libovolného adresáře, třeba do  ~/openblas.

# make PREFIX=/home/pi/openblas install

V adresáři~/openblas/lib odstraníme soubory .so, pak se nám totiž OpenBLAS přilinkuje do HPL staticky a nám odpadnou problémy s dynamickými knihovnami. Dále si stáhneme hpl-2.3 a uděláme

UX DAy - tip 2

# LDFLAGS='-L/home/pi/openblas/lib' ./configure
# make -j4

Toto již tak dlouho netrvá a v adresáři testing by se měl objevit spustitelný soubor xhpl. Ještě je potřeba doplnit vstupní soubor HPL.dat, ve kterém je popsáno, co budeme řešit. Můžeme vzít například tento HPL.dat. Pro Raspberry Pi 3 je Ns 10000 už na hranici volné paměti RAM a Raspberry může začít swapovat. Proto můžete Ns snížit na 8000 a pro test také snížit video RAM na minimum, tedy 16 MB ( gpu_mem=16/boot/config.txt).

Nyní jen pustíte ./xhpl a počkáte asi minutu na výsledek. Pokud budete test pouštět vícekrát za sebou, je potřeba dostatečně chladit, aby nedocházelo ke snížení frekvence CPU. Ve výsledku je výkon Raspberry Pi 4 celých 11,0 GFLOPS a Raspberry Pi 3+ dosáhne na 6,7 GFLOPS. Což jsou sice hodnoty na polovině teoretických, ale je možné, že s 64bitovým operačním systémem a s pro ARMv8 optimalizovanou knihovnou OpenBLAS by byly ještě o něco vyšší.

--------------------------------------------------------------------------------

- The matrix A is randomly generated for each test.
- The following scaled residual check will be computed:
      ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
- The relative machine precision (eps) is taken to be               1.110223e-16
- Computational tests pass if scaled residuals are less than                16.0

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR02R2L2       10000   256     1     1              60.71             1.0983e+01
HPL_pdgesv() start time Sun Jun 30 01:06:56 2019

HPL_pdgesv() end time   Sun Jun 30 01:07:56 2019

--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   2.30447375e-03 ...... PASSED
================================================================================

Byl pro vás článek přínosný?

Autor článku

První linux nainstaloval kolem roku 1994 a u něj zůstal. Později vystudoval fyziku a získal doktorát.