NanoPi R6S is both a mini PC and a router based on Rockchip RK3588S processor. I received some samples in November and started the NanoPi R6S review with OpenWrt/FriendlyWrt quickly testing the 2.5GbE interfaces and routing with iperf3, and it worked pretty well. But using a system with an octa-core Cortex-A76/A55 processor and 8GB RAM as an OpenWrt router only feels like a waste of resources, so I wanted to install a more versatile operating system – Ubuntu 22.04 – for further testing.
My struggles installing Ubuntu 22.04 on NanoPi R6S
FriendlyELEC provides various images on the Wiki either booting from an SD card, installing from a MicroSD to the eMMC flash (aka eFlasher imagers), or flashing through USB with Windows tools. I like the eFlasher images since the OS runs from the internal eMMC flash and no special tools are needed. I had just used the FriendlyWrt eFlasher image, so I thought switching to the Ubuntu 22.04 eFlasher imager image would be a breeze.
But something was wrong. The eFlasher utility would run, but the update progress was way too fast. I tried other eFlasher images and they all failed, but going back to FriendlyWrt would always work. I also tried to boot from a MicroSD image and the Windows USB utility but none of those methods would allow me to install Ubuntu 22.04 successfully to the NanoPi R6S.
I eventually connected a serial debug board to my NanoPi R6S and could see some partition and file system errors when booting the problematic images. I told FriendlyElec the FriendlyElec worked fine on my two samples, but looking at the logs and USB utility issue, they still suspected an eMMC flash issue and sent me another unit that was supposed to be preloaded with Ubuntu 22.04, but eventually came with the same FriendlyWrt image.
So I went through the same method to update the board and same issue… I tried various Debian and Ubuntu images, and going back to the FriendlyWrt would always work… The important part that I have not mentioned s ofar is that I’ve been using USBImager ever since I discovered the lightweight utility in 2020. I never had a problem until now, but it turns out it was the culprit… FriendlyElec shares their images compressed with GZIP, and if I uncompress the image with gzip before I flash it with USBImager, the eFlasher image installs Ubuntu 22.04 or Debian 11 just fine, and the OS can boot from the eMMC flash.
USBImager is supposed to support flashing compressed images, so I opened an issue on GitLab and the developer pointed out to me that the GZIP file format specification (RFC 1952) limits the size to 4GB because it is only stored in a 32-bit field. Indeed, if I open one of the gz files in Ubuntu, it will incorrectly show the size is 3.5GB, instead of 7.8 GB… gzip (mostly) ignores the reported size and uncompresses the entire file just to get the uncompressed size. That explains why the smaller FriendlyWrt image would work, but not the desktop OSes… The issue has not been resolved in USBImager just yet, but the important point is to uncompress any gz file before flashing it with USBImager, and board manufacturers should probably avoid compressing their files with gzip and use a more modern format…
It took me well over 10 hours to find out, but at least we can carry on with the review…
Ubuntu 22.04 system information
Let’s go through the usual system information:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pi@NanoPi-R6S:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS" pi@NanoPi-R6S:~$ uname -a Linux NanoPi-R6S 5.10.110 #165 SMP Fri Jan 13 17:23:13 CST 2023 aarch64 aarch64 aarch64 GNU/Linux pi@NanoPi-R6S:~$ free -mh total used free shared buff/cache available Mem: 7.5Gi 953Mi 5.6Gi 90Mi 972Mi 6.2Gi Swap: 0B 0B 0B pi@NanoPi-R6S:~$ df -mh Filesystem Size Used Avail Use% Mounted on tmpfs 767M 2.1M 765M 1% /run overlay 25G 1.1G 23G 5% / tmpfs 3.8G 0 3.8G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 768M 92K 768M 1% /run/user/1000 |
Ubuntu 22.04.2 with Linux 5.10.110 kernel on a system with around 8GB RAM and a 25GB root filesystem partition
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
pi@NanoPi-R6S:~$ inxi -Fc0 System: Host: NanoPi-R6S Kernel: 5.10.110 aarch64 bits: 64 Console: pty pts/1 Distro: Ubuntu 22.04.2 LTS (Jammy Jellyfish) Machine: Type: ARM System: FriendlyElec NanoPi R6S details: N/A serial: c5940d3cc423aec1 Battery: ID-1: test_battery charge: 100% condition: N/A CPU: Info: 3x 4-core model: N/A variant-1: cortex-a55 variant-2: cortex-a76 bits: 64 type: MCP AMP cache: L2: 3x 512 KiB (1.5 MiB) Speed (MHz): avg: 408 min/max: 408/1800:2352:2256 cores: 1: 408 2: 408 3: 408 4: 408 5: 408 6: 408 7: 408 8: 408 Graphics: Device-1: display-subsystem driver: rockchip_drm v: N/A Device-2: mali-bifrost driver: mali v: N/A Device-3: rk3588-dw-hdmi driver: dwhdmi_rockchip v: N/A Display: server: X.org v: 1.21.1.3 with: Xwayland v: 22.1.1 driver: gpu: rockchip_drm,mali,dwhdmi_rockchip note: X driver n/a tty: 80x24 resolution: 1280x800 Message: GL data unavailable in console. Try -G --display Audio: Device-1: rk3588-dw-hdmi driver: dwhdmi_rockchip Device-2: simple-audio-card driver: asoc_simple_card Sound Server-1: ALSA v: k5.10.110 running: yes Sound Server-2: PulseAudio v: 15.99.1 running: yes Sound Server-3: PipeWire v: 0.3.48 running: yes Network: Device-1: Realtek RTL8125 2.5GbE driver: r8125 IF: eth1 state: down mac: 5e:e3:b2:df:c6:31 Device-2: Realtek RTL8125 2.5GbE driver: r8125 IF: eth1 state: down mac: 5e:e3:b2:df:c6:31 Device-3: rk3588-gmac driver: rk_gmac_dwmac IF: eth0 state: down mac: 72:23:60:53:d0:4f IF-ID-1: eth2 state: up speed: 2500 Mbps duplex: full mac: 6e:23:60:53:d0:4f Drives: Local Storage: total: 28.91 GiB used: 0 KiB (0.0%) ID-1: /dev/mmcblk2 model: A3A551 size: 28.91 GiB Partition: Message: No partition data found. Swap: Alert: No swap data was found. Sensors: System Temperatures: cpu: 44.4 C mobo: N/A Fan Speeds (RPM): N/A Info: Processes: 278 Uptime: 3h 4m Memory: 7.49 GiB used: 1.33 GiB (17.8%) Init: systemd runlevel: 5 Shell: Bash inxi: 3.3.13 |
People interested in the Linux boot log can check it on pastebin.
NanoPi R6S benchmarks in Ubuntu 22.04
Let’s run some benchmarks starting with sbc-bench.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
pi@NanoPi-R6S:~$ sudo ./sbc-bench.sh -c Status of performance related governors found below /sys (w/o cpufreq): dmc: dmc_ondemand / 528 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand) fb000000.gpu: simple_ondemand / 300 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand) fdab0000.npu: rknpu_ondemand / 1000 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand) sbc-bench v0.9.27 Installing needed tools: apt -f -qq -y install sysstat curl lshw mbw p7zip, tinymembench, ramlat, mhz, cpuminer. Done. Checking cpufreq OPP. Done (results will be available in 21-32 minutes). Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Executing 7-zip benchmark. Done. Executing cpuminer. 5 more minutes to wait. Done. Checking cpufreq OPP again. Done (23 minutes elapsed). Memory performance (all 3 CPU clusters measured individually): memcpy: 6259.3 MB/s (Cortex-A55) memset: 21819.0 MB/s (Cortex-A55) memcpy: 11139.7 MB/s (Cortex-A76) memset: 28893.1 MB/s (Cortex-A76) memcpy: 10816.2 MB/s (Cortex-A76) memset: 28268.4 MB/s (Cortex-A76) Cpuminer total scores (5 minutes execution): 24.38,24.37,24.36,24.35,24.34,24.33,24.32,24.31,24.29 kH/s 7-zip total scores (3 consecutive runs): 14727,14444,14563, single-threaded: 2564 OpenSSL results (all 3 CPU clusters measured individually): type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 160302.91k 475125.03k 930599.68k 1228690.43k 1354962.26k 1365458.94k (Cortex-A55) aes-128-cbc 658148.26k 1291201.73k 1674105.60k 1792312.66k 1839043.93k 1843828.05k (Cortex-A76) aes-128-cbc 636342.98k 1256862.25k 1622009.51k 1737261.06k 1781757.27k 1786565.97k (Cortex-A76) aes-192-cbc 152879.55k 422953.75k 756360.28k 945381.72k 1019838.46k 1025824.09k (Cortex-A55) aes-192-cbc 611966.19k 1143024.19k 1419125.42k 1491956.74k 1533744.47k 1536950.27k (Cortex-A76) aes-192-cbc 589766.45k 1106727.42k 1373112.23k 1445577.39k 1486036.99k 1489141.76k (Cortex-A76) aes-256-cbc 148098.01k 388656.21k 652590.25k 790665.56k 841708.89k 845785.77k (Cortex-A55) aes-256-cbc 594097.92k 1016885.38k 1227813.03k 1290934.95k 1315438.59k 1317776.04k (Cortex-A76) aes-256-cbc 571059.33k 983378.01k 1187549.44k 1250823.85k 1274421.25k 1276679.51k (Cortex-A76) Full results uploaded to http://ix.io/4oNq |
No throttling occurred and the maximum temperature was 64.7°C during CPU miner in a room with an ambient temperature of around 27°C, so passive cooling works well. What’s less good are the results for 7-zip at around 14,500 against 16,200 to 16,400 rating MIPS on Khadas Edge2 and Rock 5B SBCs. The Cortex-A76 cores are clocked at 2316 and 2244 MHz (measured), so that’s not the problem, and we’ll explain what’s going on further below in this review.
The other results are pretty much the same as the other RK3588(S) platforms, and much faster than on Raspberry Pi 4.
Speedometer 2.0 was really disappointing in the Chromium browser:
The results are pretty consistent between runs and I repeated the test later and got 17.1 runs per minute…
Firefox is typically slower in this benchmark, but somehow not on the NanoPi R6S with Ubuntu 22.04 as Speedometer 2.0 was rendered at 41.3 runs per minute on Firefox 110.
There must be some issues with the Chromium configuration. In the Khadas Edge2 board with the same Rockchip RK3588S, I got 80.7 in Chromium and 53.12 in Firefox.
Storage testing and benchmarks
Let’s test the eMMC performance with iozone3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
pi@NanoPi-R6S:~$ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 [sudo] password for pi: Iozone: Performance Test of File I/O Version $Revision: 3.489 $ Compiled for 64 bit mode. Build: linux Run began: Tue Feb 21 14:07:03 2023 Command line used: iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 Output is in kBytes/sec Time Resolution = 0.000001 seconds. Processor cache size set to 1024 kBytes. Processor cache line size set to 32 bytes. File stride size set to 17 * record size. random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 29323 38498 38517 38532 29567 37038 102400 16 85754 101432 70361 69697 66415 99527 102400 512 200650 200457 195765 197967 197881 197665 102400 1024 201925 199839 227483 227738 227427 197811 102400 16384 206131 201740 296392 296093 291875 201333 iozone test complete. |
The performance is rather good with 296 MB/s sequential read speed and 200MB/s sequential write speed and random I/Os look fine too.
In order to test the USB 3.0 (5Gbps) port, I connected the ORICO M234C3-U4 enclosure with an NVMe SSD as well:
1 2 3 4 5 6 7 8 9 10 |
pi@NanoPi-R6S:/media/pi/2dab295e-50c9-497e-9390-9020a8f2ea9b$ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 20857 27350 20952 20896 102400 16 62959 73206 57880 58128 102400 512 241846 236516 167135 164614 102400 1024 297352 293949 220935 222741 102400 16384 402884 407851 347897 345063 iozone test complete. |
340MB/s read and 400+ MB/s write speeds are rough as expected on a 5 Gbps USB port, although the read speed could be slightly improved.
Networking (2.5GbE)
I already tested 2.5GbE in OpenWrt, so I’ve only tested the WAN port with iperf3 in Ubuntu 22.04 to make sure there’s nothing odd going on:
- Download:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ iperf3 -t 60 -c 192.168.31.64 -i 10 Connecting to host 192.168.31.64, port 5201 [ 5] local 192.168.31.85 port 59196 connected to 192.168.31.64 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.02 MBytes [ 5] 10.00-20.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.02 MBytes [ 5] 20.00-30.00 sec 2.74 GBytes 2.35 Gbits/sec 0 2.30 MBytes [ 5] 30.00-40.00 sec 2.74 GBytes 2.35 Gbits/sec 0 2.30 MBytes [ 5] 40.00-50.00 sec 2.74 GBytes 2.35 Gbits/sec 0 2.30 MBytes [ 5] 50.00-60.00 sec 2.74 GBytes 2.35 Gbits/sec 0 2.30 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec 0 sender [ 5] 0.00-60.04 sec 16.4 GBytes 2.35 Gbits/sec receiver iperf Done. |
- Upload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ iperf3 -t 60 -c 192.168.31.64 -i 10 -R Connecting to host 192.168.31.64, port 5201 Reverse mode, remote host 192.168.31.64 is sending [ 5] local 192.168.31.85 port 48614 connected to 192.168.31.64 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 10.00-20.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 20.00-30.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 30.00-40.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 40.00-50.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 50.00-60.00 sec 2.74 GBytes 2.35 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.04 sec 16.4 GBytes 2.35 Gbits/sec 0 sender [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec receiver iperf Done. |
- Full duplex:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ iperf3 -t 60 -c 192.168.31.64 -i 10 --bidir Connecting to host 192.168.31.64, port 5201 [ 5] local 192.168.31.85 port 46570 connected to 192.168.31.64 port 5201 [ 7] local 192.168.31.85 port 46586 connected to 192.168.31.64 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd [ 5][TX-C] 0.00-10.00 sec 2.72 GBytes 2.34 Gbits/sec 0 1.95 MBytes [ 7][RX-C] 0.00-10.00 sec 2.64 GBytes 2.26 Gbits/sec [ 5][TX-C] 10.00-20.00 sec 2.71 GBytes 2.33 Gbits/sec 0 2.15 MBytes [ 7][RX-C] 10.00-20.00 sec 2.49 GBytes 2.14 Gbits/sec [ 5][TX-C] 20.00-30.00 sec 2.72 GBytes 2.34 Gbits/sec 0 2.15 MBytes [ 7][RX-C] 20.00-30.00 sec 2.61 GBytes 2.24 Gbits/sec [ 5][TX-C] 30.00-40.00 sec 2.69 GBytes 2.31 Gbits/sec 0 3.24 MBytes [ 7][RX-C] 30.00-40.00 sec 2.44 GBytes 2.09 Gbits/sec [ 5][TX-C] 40.00-50.00 sec 2.70 GBytes 2.32 Gbits/sec 0 3.24 MBytes [ 7][RX-C] 40.00-50.00 sec 2.28 GBytes 1.96 Gbits/sec [ 5][TX-C] 50.00-60.00 sec 2.69 GBytes 2.31 Gbits/sec 0 3.24 MBytes [ 7][RX-C] 50.00-60.00 sec 1.99 GBytes 1.71 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.00 sec 16.2 GBytes 2.32 Gbits/sec 0 sender [ 5][TX-C] 0.00-60.04 sec 16.2 GBytes 2.32 Gbits/sec receiver [ 7][RX-C] 0.00-60.00 sec 14.4 GBytes 2.07 Gbits/sec 299 sender [ 7][RX-C] 0.00-60.04 sec 14.4 GBytes 2.07 Gbits/sec receiver iperf Done. |
That’s pretty excellent except for some retries in full duplex mode.
SBC bench “review” mode
Thomas Kaiser has created a new “review” mode for SBC Bench in other to detect and/or fix some common issues and list key features of the hardware and software:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
pi@NanoPi-R6S:~$ sudo ./sbc-bench.sh -r Starting to examine hardware/software for review purposes... Average load and/or CPU utilization too high (too much background activity). Waiting... Too busy for benchmarking: 12:54:20 up 2:12, 3 users, load average: 0.11, 0.15, 0.12, cpu: 2% Too busy for benchmarking: 12:54:25 up 2:12, 3 users, load average: 0.10, 0.14, 0.12, cpu: 0% Too busy for benchmarking: 12:54:30 up 2:12, 3 users, load average: 0.09, 0.14, 0.12, cpu: 0% sbc-bench v0.9.30 Installing needed tools: Done. Checking cpufreq OPP. Done. Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Throttling test: heating up the device, 5 more minutes to wait. Done. Checking cpufreq OPP again. Done (13 minutes elapsed). It seems neither throttling occured nor too much background activity. Full results uploaded to http://ix.io/4pgf # FriendlyElec NanoPi R6S Tested with sbc-bench v0.9.30 on Sun, 26 Feb 2023 13:08:00 +0000. Full info: [http://ix.io/4pgf](http://ix.io/4pgf) ### General information: The CPU features 3 clusters consisting of 2 different core types: Rockchip RK3588/RK3588s (35880000), Kernel: aarch64, Userland: arm64 CPU sysfs topology (clusters, cpufreq members, clockspeeds) cpufreq min max CPU cluster policy speed speed core type 0 0 0 408 1800 Cortex-A55 / r2p0 1 0 0 408 1800 Cortex-A55 / r2p0 2 0 0 408 1800 Cortex-A55 / r2p0 3 0 0 408 1800 Cortex-A55 / r2p0 4 1 4 408 2352 Cortex-A76 / r4p0 5 1 4 408 2352 Cortex-A76 / r4p0 6 2 6 408 2256 Cortex-A76 / r4p0 7 2 6 408 2256 Cortex-A76 / r4p0 7672KB available RAM ### Governors/policies (performance vs. idle consumption): Original governor settings: cpufreq-policy0: ondemand / 1008 MHz (conservative ondemand userspace powersave performance schedutil / 408 600 816 1008 1200 1416 1608 1800) cpufreq-policy4: ondemand / 408 MHz (conservative ondemand userspace powersave performance schedutil / 408 600 816 1008 1200 1416 1608 1800 2016 2208 2352) cpufreq-policy6: ondemand / 408 MHz (conservative ondemand userspace powersave performance schedutil / 408 600 816 1008 1200 1416 1608 1800 2016 2208 2256) dmc: dmc_ondemand / 528 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand / 528 1068 1560 2112) fb000000.gpu: simple_ondemand / 300 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand / 300 400 500 600 700 800 900 1000) fdab0000.npu: rknpu_ondemand / 1000 MHz (rknpu_ondemand dmc_ondemand userspace powersave performance simple_ondemand / 300 400 500 600 700 800 900 1000) Tuned governor settings: cpufreq-policy0: performance / 1800 MHz cpufreq-policy4: performance / 2352 MHz cpufreq-policy6: performance / 2256 MHz dmc: performance / 2112 MHz fb000000.gpu: performance / 1000 MHz fdab0000.npu: performance / 1000 MHz Status of performance related policies found below /sys: /sys/devices/platform/fb000000.gpu/power_policy: [coarse_demand] always_on /sys/module/pcie_aspm/parameters/policy: default [performance] powersave powersupersave ### Clockspeeds (idle vs. heated up): Before at 47.2°C: cpu0-cpu3 (Cortex-A55): OPP: 1800, Measured: 1805 cpu4-cpu5 (Cortex-A76): OPP: 2352, Measured: 2312 (-1.7%) cpu6-cpu7 (Cortex-A76): OPP: 2256, Measured: 2240 After at 65.6°C: cpu0-cpu3 (Cortex-A55): OPP: 1800, Measured: 1796 cpu4-cpu5 (Cortex-A76): OPP: 2352, Measured: 2296 (-2.4%) cpu6-cpu7 (Cortex-A76): OPP: 2256, Measured: 2226 (-1.3%) ### Memory performance * cpu0 (Cortex-A55): memcpy: 6237.8 MB/s, memchr: 2779.4 MB/s, memset: 21792.2 MB/s * cpu4 (Cortex-A76): memcpy: 11022.5 MB/s, memchr: 14914.5 MB/s, memset: 28622.4 MB/s * cpu6 (Cortex-A76): memcpy: 11030.9 MB/s, memchr: 14857.0 MB/s, memset: 28452.4 MB/s * cpu0 (Cortex-A55) 16M latency: 116.3 117.8 117.7 118.8 113.9 120.3 190.6 339.2 * cpu4 (Cortex-A76) 16M latency: 126.5 128.9 119.5 108.4 118.5 111.5 115.7 115.6 * cpu6 (Cortex-A76) 16M latency: 118.2 109.8 117.7 107.7 118.9 106.5 105.2 106.4 ### PCIe and storage devices: * Realtek RTL8125 2.5GbE: Speed 5GT/s (ok), Width x1 (ok), driver in use: r8125 * Realtek RTL8125 2.5GbE: Speed 5GT/s (ok), Width x1 (ok), driver in use: r8125 * 238.5GB "JMicron JMS583" as /dev/sda: USB, Driver=uas, 5000Mbps (capable of 12Mbps, 480Mbps, 5Gbps, 10Gb/s Symmetric RX SuperSpeedPlus, 10Gb/s Symmetric TX SuperSpeedPlus) * 28.9GB "Foresee A3A551" HS400 Enhanced strobe eMMC 5.1 card as /dev/mmcblk2: date 07/2022, manfid/oemid: 0x0000d6/0x0103, hw/fw rev: 0x0/0x1200000000000000 ### Software versions: * Ubuntu 22.04.2 LTS * Compiler: /usr/bin/gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 / aarch64-linux-gnu * OpenSSL 3.0.2, built on 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) ### Kernel info: * `/proc/cmdline: storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal androidboot.dtbo_idx=0 androidboot.verifiedbootstate=orange earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 coherent_pool=1m irqchip.gicv3_pseudo_nmi=0 rw root=/dev/mmcblk2p8 rootfstype=ext4 data=/dev/mmcblk2p9 consoleblank=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1` * Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl * Vulnerability Spectre v1: Mitigation; __user pointer sanitization * Vulnerability Spectre v2: Vulnerable: Unprivileged eBPF enabled * Kernel 5.10.110 / CONFIG_HZ=300 Kernel 5.10.110 is not latest 5.10.169 LTS that was released on 2023-02-22. See https://endoflife.date/linux for details. It is somewhat likely that a lot of exploitable vulnerabilities exist for this kernel as well as many unfixed bugs. But this version string doesn't matter since this is not an official LTS Linux from kernel.org. This device runs a Rockchip vendor/BSP kernel. This kernel is based on a mixture of Android GKI and other sources. Also some community attempts to do version string cosmetics might have happened, see https://tinyurl.com/2p8fuubd for example. To examine how far away this 5.10.110 is from an official LTS of same version someone would have to reapply Rockchip's thousands of patches to a clean 5.10.110 LTS. All known settings adjusted for performance. Device now ready for benchmarking. Once finished stop with [ctrl]-[c] to get info about throttling, frequency cap and too high background activity all potentially invalidating benchmark scores. All changes with storage and PCIe devices as well as suspicious dmesg contents will be reported too. Time big.LITTLE load %cpu %sys %usr %nice %io %irq Temp DC(V) 13:08:01: 2256/1800MHz 4.28 6% 0% 5% 0% 0% 0% 56.4°C 19.83 13:09:01: 2256/1800MHz 1.62 0% 0% 0% 0% 0% 0% 53.6°C 19.85 13:10:01: 2256/1800MHz 0.59 0% 0% 0% 0% 0% 0% 52.7°C 19.86 13:11:01: 2256/1800MHz 0.22 0% 0% 0% 0% 0% 0% 51.8°C 19.86 |
We can’t see it from the log above, but the warnings are shown in red:
In this case, the script switched from “ondemand” governors for the CPU, GPU, NPU, and RAM to “performance” governors for all. Note that it should deliver the best benchmarks, but it may not provide the ideal settings for all depending on whether you care about power consumption and/or battery life for your specific use case.
Once we see the lines with the time and CPU frequencies, we can run some of the benchmarks we’ve tried previously to see any differences. Let’s start with 7-zip:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ 7zr b 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs LE) LE CPU Freq: - - - - - - - - 2048000000 RAM size: 7672 MB, # CPU hardware threads: 8 RAM usage: 1765 MB, # Benchmark threads: 8 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 15595 717 2116 15171 | 203408 674 2574 17350 23: 14901 731 2077 15183 | 199621 675 2560 17275 24: 14900 769 2084 16021 | 195999 676 2545 17202 25: 13894 762 2082 15864 | 191192 676 2519 17015 ---------------------------------- | ------------------------------ Avr: 745 2090 15560 | 675 2549 17211 Tot: 710 2320 16385 |
We can see the MIPS rating “Total” is 16385 and the same as for Rock 5B and Edge2 SBC. Thomas told me it was because of the RAM configuration, and the ondemand governor at 528 MHz by default does have an impact on 7-zip performance.
I also checked the eMMC flash again:
1 2 3 4 5 6 7 8 9 10 |
pi@NanoPi-R6S:~$ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 30980 39084 40046 40117 30901 37423 102400 16 87428 103596 76672 76367 64447 100728 102400 512 205175 208315 232338 225985 229206 208905 102400 1024 200300 211047 261210 261644 263963 208754 102400 16384 199688 211344 309895 309045 296465 210065 iozone test complete. |
Slightly faster indeed, but nothing dramatic.
Next up let’s test USB storage as well:
1 2 3 4 5 6 7 8 9 10 11 |
sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 29826 38019 23582 23478 102400 16 84968 96394 67641 64295 102400 512 289311 294249 216836 219205 102400 1024 331101 326569 259965 261566 102400 16384 385161 385516 322805 325460 iozone test complete. |
The write and read speeds were slightly lower somehow, and I could reproduce that with several runs.
While we are on it, I test full duplex iperf3 on the WAN port again:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ iperf3 -t 60 -c 192.168.31.64 -i 10 -bidir Connecting to host 192.168.31.64, port 5201 [ 5] local 192.168.31.85 port 50386 connected to 192.168.31.64 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.04 MBytes [ 5] 10.00-20.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.04 MBytes [ 5] 20.00-30.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.56 MBytes [ 5] 30.00-40.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.56 MBytes [ 5] 40.00-50.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.56 MBytes [ 5] 50.00-60.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.56 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec 0 sender [ 5] 0.00-60.04 sec 16.4 GBytes 2.35 Gbits/sec receiver iperf Done. |
No retries at all in the first run, but a few in the second like with default settings:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ iperf3 -t 60 -c 192.168.31.64 -i 10 -bidir Connecting to host 192.168.31.64, port 5201 [ 5] local 192.168.31.85 port 35314 connected to 192.168.31.64 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.74 MBytes [ 5] 10.00-20.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.99 MBytes [ 5] 20.00-30.00 sec 2.74 GBytes 2.35 Gbits/sec 220 1.46 MBytes [ 5] 30.00-40.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.46 MBytes [ 5] 40.00-50.00 sec 2.74 GBytes 2.35 Gbits/sec 0 1.46 MBytes [ 5] 50.00-60.00 sec 2.74 GBytes 2.35 Gbits/sec 0 2.23 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec 220 sender [ 5] 0.00-60.04 sec 16.4 GBytes 2.35 Gbits/sec receiver iperf Done. |
That speed was 2.35 Gbps in both directions. It could be luck, or because the PCIe ASPM (Active State Power Management) was set to “performance”.
Thomas mostly focused on headless use cases, but I also ran Speedometer 2.0 in Firefox to see if the new settings had any significant effects.
57 points is about 38 percent faster compared to the 41.3 points from my first run with the default settings. It’s now faster than the Khadas Edge2 (with default settings). There’s also an improvement with Chromium since it reached 21.8 points. It’s still 75% slower than on the Edge2 so no miracle here…
The review mode can also detect whether you have any issues with your storage device such as fake SD cards, worn-out drives, and so on. So at some point, I inserted a known fake micro SD card that had some issues and it was detected as a “Definite counterfeit APPSD” HD SD card and the script also pointed to errors in dmesg:
1 2 3 4 5 6 7 8 9 |
### PCIe and storage devices: * Realtek RTL8125 2.5GbE: Speed 5GT/s (ok), Width x1 (ok), driver in use: r8125 * Realtek RTL8125 2.5GbE: Speed 5GT/s (ok), Width x1 (ok), driver in use: r8125 * 30.5GB "Definite counterfeit APPSD" HS SD card HS SD card HS SD card HS SD card (various errors occured, check dmesg) as /dev/mmcblk0: date 03/2022, manfid/oemid: 0x000000/0x0000, hw/fw rev: 0x0/0x0 * 28.9GB "Foresee A3A551" HS400 Enhanced strobe eMMC 5.1 card as /dev/mmcblk2: date 07/2022, manfid/oemid: 0x0000d6/0x0103, hw/fw rev: 0x0/0x1200000000000000 |
Note that the changes made by the review mode are not permanent, so if you reboot everything is back to normal, and that’s the way it should be.
3D graphics acceleration on NanoPi R6S
I could confirm the Arm Mali driver was loaded and operational:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
pi@NanoPi-R6S:~$ eglinfo EGL client extensions string: EGL_EXT_client_extensions EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_KHR_platform_gbm EGL_KHR_platform_wayland EGL_EXT_platform_wayland GBM platform: arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. eglinfo: eglInitialize failed Wayland platform: EGL API version: 1.4 EGL vendor string: ARM EGL version string: 1.4 Valhall-"g6p0-01eac0" EGL client APIs: OpenGL_ES EGL extensions string: EGL_WL_bind_wayland_display EGL_NV_context_priority_realtime EGL_KHR_partial_update EGL_EXT_swap_buffers_with_damage EGL_KHR_swap_buffers_with_damage EGL_KHR_config_attribs EGL_KHR_image EGL_KHR_image_base EGL_KHR_fence_sync EGL_KHR_wait_sync EGL_KHR_gl_colorspace EGL_KHR_get_all_proc_addresses EGL_IMG_context_priority EGL_KHR_no_config_context EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_EXT_yuv_surface EGL_EXT_pixel_format_float EGL_ARM_pixmap_multisample_discard EGL_KHR_gl_texture_2D_image EGL_KHR_gl_renderbuffer_image EGL_KHR_create_context EGL_KHR_surfaceless_context EGL_KHR_gl_texture_cubemap_image EGL_EXT_image_gl_colorspace EGL_EXT_create_context_robustness Configurations: bf lv colorbuffer dp st ms vis cav bi renderable supported id sz l r g b a th cl ns b id eat nd gl es es2 vg surfaces --------------------------------------------------------------------- 0x01 32 0 8 8 8 8 0 0 0 0 0x00-- a y y win,pb 0x02 32 0 8 8 8 8 24 0 0 0 0x00-- a y y win,pb 0x03 32 0 8 8 8 8 24 8 0 0 0x00-- a y y win,pb 0x04 32 0 8 8 8 8 24 8 4 1 0x00-- a y y win,pb 0x05 16 0 5 6 5 0 0 0 0 0 0x00-- y y y win,pb 0x06 16 0 5 6 5 0 24 0 0 0 0x00-- y y y win,pb 0x07 16 0 5 6 5 0 24 8 0 0 0x00-- y y y win,pb 0x08 16 0 5 6 5 0 24 8 4 1 0x00-- y y y win,pb 0x09 24 0 8 8 8 0 0 0 0 0 0x00-- y y y win,pb 0x0a 24 0 8 8 8 0 24 8 0 0 0x00-- y y y win,pb 0x0b 24 0 8 8 8 0 0 0 4 1 0x00-- y y y win,pb 0x0c 24 0 8 8 8 0 24 8 4 1 0x00-- y y y win,pb 0x0d 16 0 5 5 5 1 24 8 0 0 0x00-- a y y win,pb 0x0e 16 0 5 5 5 1 24 8 4 1 0x00-- a y y win,pb 0x0f 16 0 4 4 4 4 24 8 0 0 0x00-- a y y win,pb 0x10 16 0 4 4 4 4 24 8 4 1 0x00-- a y y win,pb 0x11 32 0 8 8 8 8 24 8 8 1 0x00-- a y y win,pb 0x12 16 0 5 6 5 0 24 8 8 1 0x00-- y y y win,pb 0x13 24 0 8 8 8 0 24 8 8 1 0x00-- y y y win,pb 0x14 32 0 8 8 8 8 24 8 16 1 0x00-- a y y win,pb 0x15 16 0 5 6 5 0 24 8 16 1 0x00-- y y y win,pb 0x16 24 0 8 8 8 0 24 8 16 1 0x00-- y y y win,pb 0x17 24 0 8 8 8 0 0 0 0 0 0x00-- y y pb 0x18 64 0 16 16 16 16 24 8 0 0 0x00-- y y pb 0x19 32 0 10 10 10 2 24 8 0 0 0x00-- a y y pb 0x1a 24 0 8 8 8 0 0 0 0 0 0x00-- y y y win,pb |
The Mali driver is detected with the message “eglInitialize failed” which I also encountered with the Khadas Edge2 board, but it did not prevent me from running glmark2-es2-wayland, so let’s try it on the NanoPi R6S as well…
It does work well enough. Here’s the output from the terminal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
pi@NanoPi-R6S:~$ glmark2-es2-wayland arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. ======================================================= glmark2 2021.02 ======================================================= OpenGL Information GL_VENDOR: ARM GL_RENDERER: Mali-LODX GL_VERSION: OpenGL ES 3.2 v1.g6p0-01eac0.ba52c908d926792b8f5fe28f383a2b03 ======================================================= [build] use-vbo=false: FPS: 4893 FrameTime: 0.204 ms [build] use-vbo=true: FPS: 5422 FrameTime: 0.184 ms [texture] texture-filter=nearest: FPS: 6823 FrameTime: 0.147 ms [texture] texture-filter=linear: FPS: 6630 FrameTime: 0.151 ms [texture] texture-filter=mipmap: FPS: 6637 FrameTime: 0.151 ms [shading] shading=gouraud: FPS: 4793 FrameTime: 0.209 ms [shading] shading=blinn-phong-inf: FPS: 4768 FrameTime: 0.210 ms [shading] shading=phong: FPS: 4688 FrameTime: 0.213 ms [shading] shading=cel: FPS: 4835 FrameTime: 0.207 ms [bump] bump-render=high-poly: FPS: 2709 FrameTime: 0.369 ms [bump] bump-render=normals: FPS: 7240 FrameTime: 0.138 ms [bump] bump-render=height: FPS: 7108 FrameTime: 0.141 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 5524 FrameTime: 0.181 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 3786 FrameTime: 0.264 ms [pulsar] light=false:quads=5:texture=false: FPS: 6535 FrameTime: 0.153 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 1800 FrameTime: 0.556 ms [desktop] effect=shadow:windows=4: FPS: 4870 FrameTime: 0.205 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 622 FrameTime: 1.608 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 590 FrameTime: 1.695 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 923 FrameTime: 1.083 ms [ideas] speed=duration: FPS: 2679 FrameTime: 0.373 ms [jellyfish] <default>: FPS: 4080 FrameTime: 0.245 ms [terrain] <default>: FPS: 306 FrameTime: 3.268 ms [shadow] <default>: FPS: 4215 FrameTime: 0.237 ms [refract] <default>: FPS: 652 FrameTime: 1.534 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 5900 FrameTime: 0.169 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 5517 FrameTime: 0.181 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 5986 FrameTime: 0.167 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 5925 FrameTime: 0.169 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 5190 FrameTime: 0.193 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 5879 FrameTime: 0.170 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 5912 FrameTime: 0.169 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 5904 FrameTime: 0.169 ms ======================================================= glmark2 Score: 4525 ======================================================= |
That’s 4525 points on NanoPi R6S compared to 4005 points on the Khadas Edge2. Note that SBC bench optimizations were still running, and I also switched the GPU governor to “performance” before running the graphics benchmark on the Edge2 board.
I installed SuperTuxKart on the board and the game was playable in windowed mode, but it’s unclear whether it ma does not seem to make use of the GPU at all:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
..:: Antarctica Rendering Engine 2.0 ::.. [info ] [IrrDriver Logger]: ..:: Antarctica Rendering Engine 2.0 ::.. [info ] [IrrDriver Logger]: SDL Version 2.0.20 [info ] [IrrDriver Logger]: Using renderer: OpenGL ES 3.2 Mesa 22.2.5 [info ] [IrrDriver Logger]: Mesa/X.org [info ] [IrrDriver Logger]: GL_EXT_blend_minmax GL_EXT_multi_draw_arrays GL_EXT_texture_filter_anisotropic GL_EXT_texture_compression_s3tc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_format_BGRA8888 GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_stencil8 GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float GL_EXT_draw_instanced GL_EXT_texture_sRGB_decode GL_OES_EGL_image GL_OES_depth_texture GL_OES_packed_depth_stencil GL_EXT_texture_type_2_10_10_10_REV GL_NV_conditional_render GL_OES_get_program_binary GL_APPLE_texture_max_level GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_NV_pack_subimage GL_EXT_frag_depth GL_NV_fbo_color_attachments GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_array_object GL_OES_viewport_array GL_ANGLE_pack_reverse_row_order GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_EXT_occlusion_query_boolean GL_EXT_robustness GL_EXT_texture_rg GL_EXT_unpack_subimage GL_NV_draw_buffers GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_EXT_draw_buffers GL_EXT_map_buffer_range GL_KHR_debug GL_KHR_robustness GL_KHR_texture_compression_astc_ldr GL_NV_pixel_buffer_object GL_OES_depth_texture_cube_map GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_color_buffer_float GL_EXT_sRGB_write_control GL_EXT_separate_shader_objects GL_EXT_shader_framebuffer_fetch GL_EXT_shader_group_vote GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_ANDROID_extension_pack_es31a GL_ARM_shader_framebuffer_fetch_depth_stencil GL_EXT_base_instance GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_copy_image GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_EXT_gpu_shader5 GL_EXT_polygon_offset_clamp GL_EXT_primitive_bounding_box GL_EXT_render_snorm GL_EXT_shader_io_blocks GL_EXT_texture_border_clamp GL_EXT_texture_buffer GL_EXT_texture_cube_map_array GL_EXT_texture_norm16 GL_EXT_texture_view GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_KHR_context_flush_control GL_KHR_robust_buffer_access_behavior GL_NV_image_formats GL_OES_copy_image GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_gpu_shader5 GL_OES_primitive_bounding_box GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_io_blocks GL_OES_shader_multisample_interpolation GL_OES_tessellation_point_size GL_OES_tessellation_shader GL_OES_texture_border_clamp GL_OES_texture_buffer GL_OES_texture_cube_map_array GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_texture_view GL_EXT_blend_func_extended GL_EXT_buffer_storage GL_EXT_float_blend GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_texture_filter_minmax GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_RG8 GL_KHR_no_error GL_KHR_texture_compression_astc_sliced_3d GL_OES_EGL_image_external_essl3 GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_shader_image_atomic GL_EXT_clear_texture GL_EXT_clip_cull_distance GL_EXT_disjoint_timer_query GL_EXT_texture_compression_s3tc_srgb GL_MESA_shader_integer_functions GL_EXT_clip_control GL_EXT_color_buffer_half_float GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_texture_compression_bptc GL_EXT_texture_mirror_clamp_to_edge GL_KHR_parallel_shader_compile GL_EXT_EGL_image_storage GL_EXT_shader_framebuffer_fetch_non_coherent GL_EXT_texture_shadow_lod GL_MESA_framebuffer_flip_y GL_EXT_depth_clamp GL_EXT_texture_query_lod GL_MESA_bgra [info ] IrrDriver: OpenGL version: 3.2 [info ] IrrDriver: OpenGL vendor: Mesa/X.org [info ] IrrDriver: OpenGL renderer: llvmpipe (LLVM 15.0.6, 128 bits) [info ] IrrDriver: OpenGL version string: OpenGL ES 3.2 Mesa 22.2.5 [info ] GLDriver: Explicit Attrib Location Present [info ] GLDriver: ARB Uniform Buffer Object Present [info ] GLDriver: EXT texture format BGRA8888 Present [info ] GLDriver: EXT Color Buffer Float Present [info ] GLDriver: EXT Texture Compression S3TC Present [info ] GLDriver: EXT Texture Compression S3TC sRGB Present |
llvmpipe should mean software renderer. So I set the graphics to full screen and 1920×1080 resolution, and it was indeed unplayable at probably 1 or 2 fps confirming the GPU is not involved here. SuperTuxKart is supposed to work on OpenGL ES hardware, but I don’t know how to fix this.
The wiki says graphics acceleration is enabled in Chromium… We can double-check that by typing chrome://gpu in the address bar.
WebGL and WebGL2 are indeed enabled.
And Arm “Mali-LODX” driver appears to be in use, so let’s check the WebGL aquarium demo.
The demo renders smoothly with 1000 fish at 60 fps, and it’s still good with 5,000 fish at around 30 fps.
If I go boost the number of fish to 10,000 fish and over, I can start to see some rendering issues with the fish only showing from time to time, and the frame rate is going down. But at least we can confirm 3D graphics acceleration is working in the Ubuntu 22.04 image, even in Chromium.
Video Playback
I did not have a lot of luck with video playback on Linux in my previous Rockchip RK3588(S) hardware reviews, but there has been some good progress. First, you may have noticed in the Chromium “GPU” screenshot above that “Video Decode” is enabled, and if we scroll down we can see Video Acceleration is supported for HEVC, H.264, VP9, and VP9 up to 3840×2160 resolution.
Let’s try a 4K video at 1080p60 first…
It plays well with no dropped frames, but how do we know it’s using hardware video decoding? The first clue is the power consumption: around 5.4W, while my power meter would typically fluctuate between 8 and 10W+ with software video decoding on other RK3588 platforms.
The wiki also explains we can use fuser while the video is playing to check whether the hardware video decoder is active:
1 2 |
pi@NanoPi-R6S:~$ fuser /dev/mpp_service /dev/mpp_service: 16779 |
If there is no content output from the fuser command, it means software decoding, but here there’s a value so VP9 hardware video decoding is enabled. If I close the YouTube page, nothing is returned:
1 2 |
pi@NanoPi-R6S:~$ fuser /dev/mpp_service pi@NanoPi-R6S:~$ |
Switching to 4K resolution (in YouTube) on the same display set to 1080p60 was no issue either.
So I felt confident, and decided to try a local 8K AV1 video from the command line:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
pi@NanoPi-R6S:~/Videos$ export DISPLAY=:0.0 pi@NanoPi-R6S:~/Videos$ mpv "8K Sample Video _ Alpha 1 _ Sony _ α--ucUFBTUYLI.mkv" (+) Video --vid=1 (*) (av1 7680x4320 29.970fps) (+) Audio --aid=1 --alang=eng (*) (opus 2ch 48000Hz) arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. [vaapi] libva: vaGetDriverNameByIndex() failed with invalid VADisplay, driver_name = (null) Cannot load libcuda.so.1 xcb_connection_has_error() returned true AO: [pulse] 48000Hz stereo 2ch float VO: [gpu] 7680x4320 yuv420p AV: 00:00:08 / 00:01:55 (7%) A-V: 0.012 Dropped: 12 Audio device underrun detected. AV: 00:00:08 / 00:01:55 (7%) A-V: 0.413 Dropped: 17 Audio/Video desynchronisation detected! Possible reasons include too slow hardware, temporary CPU spikes, broken drivers, and broken files. Audio position will not match to the video (see A-V status field). AV: 00:00:08 / 00:01:55 (8%) A-V: 0.388 Dropped: 23 Audio device underrun detected. AV: 00:00:09 / 00:01:55 (8%) A-V: 0.610 Dropped: 35 Audio device underrun detected. AV: 00:00:09 / 00:01:55 (9%) A-V: 0.693 Dropped: 47 Audio device underrun detected. AV: 00:00:10 / 00:01:55 (9%) A-V: 1.300 Dropped: 65 Audio device underrun detected. AV: 00:01:09 / 00:01:55 (61%) A-V: 31.817 Dropped: 1159 Audio device underrun detected. AV: 00:01:09 / 00:01:55 (61%) A-V: 31.817 Dropped: 1159 Audio device underrun detected. AV: 00:01:55 / 00:01:55 (100%) A-V: 0.000 Dropped: 1544 Exiting... (End of file) |
It did not go well with audio cuts, plenty of dropped frames, and a choppy video. So I switch to a more traditional 4K H.264 video @ 30 fps:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pi@NanoPi-R6S:/media/pi/USB3_NTFS/Video_Samples/4K$ mpv --fs big_buck_bunny_4k_H264_30fps.mp4 (+) Video --vid=1 (*) (h264 3840x2160 30.000fps) (+) Audio --aid=1 (*) (mp3 2ch 48000Hz) Audio --aid=2 (*) (ac3 6ch 48000Hz) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. [vaapi] libva: vaGetDriverNameByIndex() failed with invalid VADisplay, driver_name = (null) Cannot load libcuda.so.1 AO: [pulse] 48000Hz stereo 2ch float VO: [gpu] 3840x2160 yuv420p AV: 00:02:03 / 00:10:34 (19%) A-V: 0.000 Cache: 163s/150MB Exiting... (Quit) |
No problem here. But the system can not handle 4K H.265 at 60 fps either:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pi@NanoPi-R6S:/media/pi/USB3_NTFS/Video_Samples/4K$ mpv --fs Fifa_WorldCup2014_Uruguay-Colombia_4K-x265.mp4 (+) Video --vid=1 (*) (hevc 3840x2160 59.940fps) (+) Audio --aid=1 (*) (ac3 6ch 48000Hz) arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'. [vaapi] libva: vaGetDriverNameByIndex() failed with invalid VADisplay, driver_name = (null) Cannot load libcuda.so.1 AO: [pulse] 48000Hz 5.1(side) 6ch float VO: [gpu] 3840x2160 yuv420p AV: 00:00:02 / 00:15:00 (0%) A-V: 0.450 Dropped: 29 Cache: 171s/150MB Audio/Video desynchronisation detected! Possible reasons include too slow hardware, temporary CPU spikes, broken drivers, and broken files. Audio position will not match to the video (see A-V status field). AV: 00:00:24 / 00:15:00 (3%) A-V: 26.147 Dropped: 837 Cache: 174s/150MB Exiting... (Quit) |
FriendlyElec says Kodi is preinstalled and supports hardware video decoding. So let’s try so videos in Kodi 19.4 instead.
The info window appears to have changed, but the results are the same with the H.264 30 fps video playing fine, and the H.265 60 fps being unwatchable will too many dropped frames.
I’m happy to see progress has been made, but video playback still needs more work in Linux. As a side note, my wireless keyboard was not always responsive once I connected a USB hard drive to play the local videos. If I remove the hard drive, the keyboard works fine.
Power consumption
I’ve also taken some power consumption numbers. The NanoPi R6S is connected to an HDMI display, 2.5GbE networking, as well as two RF dongles for the keyboard and mouse.
Here are the numbers I got from the board with default settings:
- Power off – 0.9 Watt (That’s rather high and remains at this value even if I disconnect everything from the NanoPi R6S barring the power cable. If I do remove the USB power cable, the power meter shows 0.4W so it looks like the NanoPi R6S draws 0.5W while it is powered off)
- Ilde – 4.6 Watts
- 4K YouTube Video in Firefox (full screen – SW decode) – 9.7 to 11.3 Watts
- 4K YouTube Video in Chromium (full screen – HW decode) – 5.3 to 7.3 Watts
- Stress test on all 8 cores (stress -c 8) – 10.9 Watts
I also wanted to check to what degree setting everything to “performance” would impact the power consumption, so I repeated the measurements with sbc-bench.sh script running in review mode.
- Ilde – 5.4 Watts
- 4K YouTube Video in Firefox (full screen – SW decode) – 9.9 to 11.6 Watts
- 4K YouTube Video in Chromium (full screen – HW decode) – 6.6 to 8.6 Watts
- Stress test on all 8 cores (stress -c 8) – 11.4 Watts
- CPU Miner (part of sbc-bench.sh review mode) – 11.2 Watts
So there’s a cost to enabling performance modes of 0.3W to 1.2 Watts depending on the load, and whether it matters depends on your use case.
Summary
After a frustrating start unrelated to FriendylElec support, I finally managed to install Ubuntu 22.04 on the NanoPi R6S. The system works reasonably well and is stable as I had a 5+ days uptime at some point. Performance is excellent as on other Rockchip RK3588(S) platforms, and software support has further improved, but we are not to the point where we install Ubuntu and expect everything to work out of the box like on (most) x86 platforms.
3D graphics acceleration and video hardware decoding are implemented, but they may not work on all programs. It was nice to have VP9 hardware video decoding in YouTube and WebGL demos working smoothly on Chromium. I did not have issues with 2.5GbE networking and the internal eMMC flash is fast making the system fast to boot and responsive. The metal enclosure is good enough to cool the fanless system under all loads I tested. Some of the issues include Chromium reporting an unusually low score with Speedometer 2.0, and the power consumption looks higher than on other systems.
I’d like to thank FriendlyElec for sending NanoPi R6S samples for review. The model reviewed here sells for $139 plus shipping on the company’s store, but you’ll also find it on Amazon and Aliexpress from resellers.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress
Regarding your gzip issues, it reminds me something similar I faced recently. I had some older system images using gzip 1.3.5, and found that some kernel+modules tgz I had built from more recent versions (1.10 or so) would not always decompress well on such machines. Sometimes the CRC would be bad and the contents as well, as if newer versions were using offsets that were not permitted in older versions or such a thing. I have not yet figured which combinations of compressor/decompressor trigger the issue. It also only happened on arm/aarch64 for now (i.e. could be the result of a bug with unsigned char, but why only with newer versions on the compression side?). But at least now I know that if I’m facing some gzip decompression issues I need to double-check the versions or possibly send the data uncompressed.
Wow, thats quite a lot of power when on idle.
I guess most RK3588 boards are similar correct ?
The Khadas Edge2 consumes 2.9 Watts at idle, but it’s difficult to make a direct comparison. I used a USB keyboard, WiFi, and HDMI.
The NanoPi R6S drops to 3.1 Watts without RF dongles, 2.5Gbps Ethernet, or HDMI. That means just the power cable and nothing else. The R6S still seems to consume more.
Just for reference:
RF dongle 1: adds less than 0.1W
RF dongle 2: +0.1 to 0.2W
2.5GbE: +0.8W
HDMI: +0.4W
By way of comparison, an Orange Pi 5 with no peripherials or connections uses 0.54W at idle with their provided distro.
Is that measured with a wall outlet power meter?
Inline USB power meter.
On AliExpress there are Intel N5105 computers complete with case and power supply for $120.
Why would anyone prefer this thing which has no kernel upstream support?
These systems should be at least 40% cheaper to be worth considering.
Yes to late and too little but fanboys will kick and screem
The $120 computers are likely barebone, and would still need memory and storage. They also lack 2.5GbE, NPU, and 8K support.
But if you don’t need any of those, then they should be a better option with everything working out of the box.
These are some of the reasons i stay away from ARM SBCs, even though they are interesting devices these days.
I definitely don’t won’t to be bound to certain “images”, but have the freedom to run the Linux distro i prefer.
Yeah, x86 boxes idles at much more W, but that’s a tradeoff. There are boxes in the price range of 100-130$ that idles at 8-12W.
RPi seems to have an UEFI loader which makes installation of Linux distros more convenient…but i stay away from RPi as well.
Hi Marcelo,
Yup almost he same price, but certainly not the same performance ( see : https://gadgetversus.com/processor/intel-celeron-n5105-vs-rockchip-rk3588/ @ ~5/6 page) – not to mention that this one has 8 cores (makes the difference with e.g.: nginx, or any http server in this matter).
As for the kernel, the one from Raspberry Pi OS is usually updated one or two days after a security update came for x86 from the upstream, never had a problem.
40% cheaper ? For a SBC that has twice the performance of an intel celeron N5105 ? I don’t agree ;-p)
Nice comparison switch from Rockchip to Rpi, sure no bias?
> As for the kernel, the one from Raspberry Pi OS is usually updated one or two days after a security update came
Raspberry Pi Trading Ltd. are pretty much the only ones handling security issues with their kernel fork and wireless firmwares responsibly in contrast to the Android e-waste world.
The Rockchip BSP kernel this and all other RK3588(s) thingies are running with is at 5.10.110 (5.10.172 is latest LTS version) and majority of SBC with onboard Wi-Fi is still affected by years old BroadPwn and Kr00k.
Hi Jean-Luc,
Do you know if the beast is able to boot from the network (PXE preferred, nothing on the eMMC) ?
It should be possible to load an image from the network using U-boot (TFTP). You would still have U-boot on the eMMC flash, just no need to use/have the kernel and rootfs there.
U-boot recently got HTTP support, but the version used in the OS images should not be recent enough.
I did something like that with TFTP and NFS a few years ago.
https://www.cnx-software.com/2014/05/15/how-to-boot-linux-server-amlogic-s802/
The exact method will be different.
Hi Jean-Luc,
From my own researches, U-Boot seems indeed to be ZE solution, as it is cited everywhere and seems very stable.
Thanks for the URL.