Squirrel with pinecone
https://pxhere.com/id/photo/489451

Life with a ROCKPro64

Contents

"What is the quietest, lowest power computer I can use every day?"

With one question, it all went down the rabbit hole. Do I really need high powered, many cores with lots of RAM to do 90% of my daily activities? No.

I want to build a silent desktop that is my main computer. I also want it as small as possible. I searched high and low and came across a lot of very nice solutions. The challenge is that passively cooled Intel i7/i9 or AMD Ryzen 7/9 CPUs require lots of space. Giant heatsink/heatpipe systems, mid-tower sizes or higher, and still consume a lot of power. 

Places like Quiet PC USA, Silent PC, and Fully Silent PC offer, or will build you, a silent or very quiet computer. However, they still consume a lot of power. Can we do better? Silent and low power.

Raspberry Pi 4B 8 GB

My first attempt at a silent, low power computer is right in front of me. My trusty RPi 4B 8GB with a CoolPi case. It is silent, boots from external SSD, and has enough of a GPU to make using a graphical desktop acceptable. I tried using it for a week and found that overall it's just slower than I would like. It's usable. Installing Manjaro ARM XFCE on the SSD actually made the system quite more responsive than the default Raspbian. It's a completely subjective experience at this point. Could I use it daily? Sure, but a few persistent performance slowdowns frustrated me. 

As far as I can tell, the slowdowns are because the USB and Network i/o subsystems share the same SoC (system on a chip). The SSD is connected on the USB 3 port, which is faster than the 2.0 port, but still limiting throughput from the SSD to the main CPUs. The external SSD is still vastly faster than any SDCARD I used in the past.

it's a great system for console needs and as a cheap server for ADSBExchange. I continue to write some embedded C and julia on the device without issue.

Can we do better in a small form factor and low power?

PINE64 ROCKPro64 4GB

I decided to finally crack open the PINE64 ROCKPro64 boards I had sitting around waiting for another project. One of them runs off a micro SD card. The other is the base of a NAS build, but with the PINE64 PCIe/NVMe adapter. I found an old, unused M.2280 NVMe and set it up. Both systems run Manjaro ARM XFCE

Micro SD Card System

The micro SD card-based system has /boot and / filesystems on the sd card (because where else are they going to go?). It's pretty usable. The first run of any application is slow, solely due to the performance of the sd card. I tried a few sd card and found the Samsung EVO Plus in stock. It's the fastest card I can find, but it's still slow.

Let's take something simple, booting. Here's the output of systemd-analyze:

Startup finished in 4.216s (kernel) + 31.300s (userspace) = 35.516s 
graphical.target reached after 31.300s in userspace

systemd-analyze is a tool to analyze performance of the system, in this case, the booting process. The system is ready, in a graphical state, waiting for me, the human, to login in 35.516 seconds. Once logging in, it still takes another 30 seconds or so to load the full desktop and be ready for me to start applications and get to work. In watching i/o and system performance, the sd card is the bottleneck.

It's a usable system, but even slower than the RPI 4. Now let's try the NVMe-based system.

NVMe System

The default setup is to have /boot on the sd card and / on the NVMe. There's a longer story here about the default boot process, but we'll just leave it at defaults. It's faster. Everything is faster. Let's start with booting, same systemd-analyze:

Startup finished in 3.420s (kernel) + 5.605s (userspace) = 9.025s 
graphical.target reached after 4.992s in userspace

This is 3.94x (ok, 4x) faster than the sd card-based system. Once the emmc modules are back in stock, I'll get one of those. The emmc should be about SATA speeds, 2-3x faster than sd card. After logging in, the desktop awaits my input in under 5 seconds. I can start applications quickly and get working in under 15 seconds. Using the apps and doing normal work "just works". I don't find myself waiting or getting frustrated. *This* is the system for me.

Tradeoffs

The tradeoffs are around size. Both systems run silent. A heatsink for the NVMe card is good to keep the temperature down during heavy i/o load, but not required. The sd card-based system is in the solid Aluminum case, which is small and unobtrusive sitting on my desk. It runs about 37C which isn't too bad:

cpu_thermal-virtual-0
Adapter: Virtual device
temp1:        +36.9°C  (crit = +95.0°C)

The NVMe-based system is in a rather large NAScase which doesn't fit on my desk. I have the largest heatsink PINE64 offers on the SoC. It runs about 38C:

cpu_thermal-virtual-0
Adapter: Virtual device
temp1:        +38.1°C  (crit = +95.0°C)

Still, pretty cool despite the workload. I could use an 80x80x20mm fan in the case for increased airflow, but then it's not silent.

Subjectively, the NVMe-based system is far more usable and wholly replaces my 8-core AMD Ryzen 7 4800H with Radeon Graphics laptop as a daily use desktop.

Storage Benchmarks

I ran some basic benchmarks, with the help of "dsimic" in pine64 IRC. These are just generally exercising the storage subsystem and not particularly accurate measures of anything. Look at them comparatively rather than as absolute. One thing that's interesting is the system limits the performance of the PCIe subsystem. As far as we can tell, it's a limitation imposed by Rock-Chip themselves for stability.

kernel: pci 0000:01:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x4 link at 0000:00:00.0 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4

8 Gbps is still much faster than the sd card can ever hope to achieve. I also compared them to my opteron server with software raid across 4 spinning platters (hard drives). First, a table summarizing the results and then the raw results below. For translation, 8 Gbps is 1 GBps, or 1000 MBps.

Summary Results

TestStorage DeviceElapsed Time (seconds)Throughput (MBps)
cached readssdcard21163.42
cached readsnvme21396.8
cached readsswraid22362.34
cached readsemmc21246.38
buffered disk readssdcard3.0221.87
buffered disk readsnvme0.37565.91
buffered disk readsswraid3.029190.16
buffered disk readsemmc3.00151.05
1 MB block write zeroessdcard35.999614.6
1 MB block write zeroesnvme0.828513633
1 MB block write zeroesswraid10.438450.20
1 MB block write zeroesemmc4.23843124
8 MB block write zeroessdcard33.44415.6
8 MB block write zeroesnvme0.915475568
8 MB block write zeroesswraid4.92541106
8MB block write zeroesemmc3.94775132
1 MB block read (from device)sdcard9.8446322.80
1 MB block read (from device)nvme6.0922688
1 MB block read (from device)swraid31.7775132
1 MB block read (from device)emmc1.37149163
8 MB block read (from device)sdcard9.5839923.39
8 MB block read (from device)nvme6.1018687
8 MB block read (from device)swraid19.2408218
8 MB block read (from device)emmc1.31526170

Raw Results

# rockpro64 filesystem benchmarks

## rp64 with fastest sdcard

### sudo hdparm -tT /dev/mmcblk1p2 

/dev/mmcblk1p2:
 Timing cached reads:   2326 MB in  2.00 seconds = 1163.42 MB/sec
 Timing buffered disk reads:  66 MB in  3.02 seconds =  21.88 MB/sec

### dd if=/dev/zero of=test.001 bs=1M count=500 oflag=direct status=progress

506462208 bytes (506 MB, 483 MiB) copied, 35 s, 14.5 MB/s
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 35.9996 s, 14.6 MB/s                    

### dd if=/dev/zero of=test.001 bs=8M count=62 oflag=direct status=progress

520093696 bytes (520 MB, 496 MiB) copied, 33 s, 15.6 MB/s
62+0 records in
62+0 records out
520093696 bytes (520 MB, 496 MiB) copied, 33.444 s, 15.6 MB/s

### dd if=/dev/mmcblk1p1 of=/dev/null bs=1M count=4000 iflag=direct status=progress

205520896 bytes (206 MB, 196 MiB) copied, 9 s, 22.7 MB/s
213+1 records in
213+1 records out
224000512 bytes (224 MB, 214 MiB) copied, 9.84463 s, 22.8 MB/s

### dd if=/dev/mmcblk1p1 of=/dev/null bs=8M count=500 iflag=direct status=progress

218103808 bytes (218 MB, 208 MiB) copied, 9 s, 23.4 MB/s
26+1 records in
26+1 records out                        
224000512 bytes (224 MB, 214 MiB) copied, 9.58399 s, 23.4 MB/s

## rp64 with pine64 pci to nvme adapter and crucial nvme

### lspci

00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3399 PCI Express Root Port
01:00.0 Non-Volatile memory controller: Micron/Crucial Technology Device 5403 (rev 03)

### sudo hdparm -tT /dev/nvme0n1p1

/dev/nvme0n1p1:
 Timing cached reads:   2792 MB in  2.00 seconds = 1396.80 MB/sec
 Timing buffered disk reads: 212 MB in  0.37 seconds = 565.92 MB/sec

### dd if=/dev/zero of=test.001 bs=1M count=500 oflag=direct status=progress

500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 0.828514 s, 633 MB/s

### dd if=/dev/zero of=test.001 bs=8M count=62 oflag=direct status=progress

62+0 records in
62+0 records out
520093696 bytes (520 MB, 496 MiB) copied, 0.915476 s, 568 MB/s

### dd if=/dev/nvme0n1 of=/dev/null bs=1M count=4000 iflag=direct status=progress

4131389440 bytes (4.1 GB, 3.8 GiB) copied, 6 s, 688 MB/s
4000+0 records in
4000+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 6.0923 s, 688 MB/s

### dd if=/dev/nvme0n1 of=/dev/null bs=8M count=500 iflag=direct status=progress

4127195136 bytes (4.1 GB, 3.8 GiB) copied, 6 s, 687 MB/s
500+0 records in
500+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 6.1019 s, 687 MB/s

## opteron server with linux swraid setup as raid5

### 
AMD SP5100 SATA2 controller

### 4x SATA drive
Device Model:     WDC  WUH721414ALE604
User Capacity:    14,000,519,643,136 bytes [14.0 TB]                                    
Sector Sizes:     512 bytes logical, 4096 bytes physical                                 
Rotation Rate:    7200 rpm                                                                               
Form Factor:      3.5 inches                                                                             
ATA Version is:   ACS-2, ATA8-ACS T13/1699-D revision 4                                 
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 3.0 Gb/s) 

### hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   4716 MB in  2.00 seconds = 2362.34 MB/sec
 Timing buffered disk reads: 576 MB in  3.03 seconds = 190.17 MB/sec

### dd if=/dev/zero of=test.001 bs=1M count=500 oflag=direct status=progress

507510784 bytes (508 MB, 484 MiB) copied, 10 s, 50.7 MB/s
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 10.4385 s, 50.2 MB/s

### dd if=/dev/zero of=test.001 bs=8M count=62 oflag=direct status=progress

427819008 bytes (428 MB, 408 MiB) copied, 4 s, 106 MB/s
62+0 records in
62+0 records out
520093696 bytes (520 MB, 496 MiB) copied, 4.92541 s, 106 MB/s

### dd if=/dev/md0 of=/dev/null bs=1M count=4000 iflag=direct status=progress

4065329152 bytes (4.1 GB, 3.8 GiB) copied, 31 s, 131 MB/s
4000+0 records in
4000+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 31.7775 s, 132 MB/s

### dd if=/dev/md0 of=/dev/null bs=8M count=500 iflag=direct status=progress

4135583744 bytes (4.1 GB, 3.9 GiB) copied, 19 s, 217 MB/s
500+0 records in
500+0 records out
4194304000 bytes (4.2 GB, 3.9 GiB) copied, 19.2408 s, 218 MB/s

## rp64 with 128GB emmc

### sudo hdparm -tT /dev/mmcblk

/dev/mmcblk2p2:
 Timing cached reads:   2492 MB in  2.00 seconds = 1246.38 MB/sec
 Timing buffered disk reads: 454 MB in  3.01 seconds = 151.05 MB/sec
 
### dd if=/dev/zero of=test.001 bs=1M count=500 oflag=direct status=progress

498073600 bytes (498 MB, 475 MiB) copied, 4 s, 124 MB/s
500+0 records in
500+0 records out
524288000 bytes (524 MB, 500 MiB) copied, 4.23844 s, 124 MB/s

### dd if=/dev/zero of=test.001 bs=8M count=62 oflag=direct status=progress

402653184 bytes (403 MB, 384 MiB) copied, 3 s, 132 MB/s
62+0 records in
62+0 records out
520093696 bytes (520 MB, 496 MiB) copied, 3.94775 s, 132 MB/s

### dd if=/dev/mmcblk2p1 of=/dev/null bs=1M count=4000 iflag=direct status=progress

162529280 bytes (163 MB, 155 MiB) copied, 1 s, 162 MB/s
213+1 records in
213+1 records out
224000512 bytes (224 MB, 214 MiB) copied, 1.37149 s, 163 MB/s

### dd if=/dev/mmcblk2p1 of=/dev/null bs=8M count=500 iflag=direct status=progress

167772160 bytes (168 MB, 160 MiB) copied, 1 s, 168 MB/s
26+1 records in
26+1 records out
224000512 bytes (224 MB, 214 MiB) copied, 1.31527 s, 170 MB/s

In Conclusion

I'm sticking with the nvme-based rockpro64. It's fast, it's usable, and I haven't run out of ram yet.


Updated 2022-06-22 with performance of EMMC storage.