PostgreSQL on Raspberry Pi 4: Initial Testing
The Raspberry Pi 4B is out, and it's pretty much awesome. With how much I love the Raspberry Pi, it's no surprise that I pre-ordered one of the new Raspberry Pi 4B models with 4GB RAM the same day they were announced. I had to wait about a month for it to arrive, and I have had my Pi 4 for about a month now. I had some free time to put the new Pi 4 hardware to the test with PostgreSQL and pgbench. The goal of this post is to set an initial Postgres benchmark for the Raspberry Pi 4 and PostgreSQL 11, compared to older Raspberry Pi hardware.
This post is part of the series PostgreSQL: From Idea to Database.
Revisit prior testing
Before we get into the new results, let's recap the results from prior testing with the Pi and Postgres. My first serious test (April 2019) used four of the Pi 3B models and tested Postgres 9.6 through Postgres 12 (devel). Those TCP-B (like) tests showed that 200 TPS was a reliable goal for that hardware. At that time I was pretty happy with the results, until a few months later I tested the Pi 3B again using the newer A1 rated SD cards. That change boosted TPS performance by 140%, upping the target to nearly 500 TPS!
Pi 4 differences
The Raspberry Pi 4B is still a Raspberry Pi, but when you look at what has changed with this version of the hardware it seems like an entirely different beast:
- New CPU architecture
- New GPU
- Up to 4GB RAM (though the User Guide mentions an 8GB model... 🧐)
- Dedicated Ethernet bus (Gigabit)
- Dedicated USB bus (USB 3.0)
- Faster SD card bus
- A completely new heat profile
That's right, I ended the feature list with the "heat profile" because as this testing showed, the Pi 4 is the first Pi where heat is an issue you have to deal with. I recommend Gareth Halfacree's review that includes tons of information about the power increases, thermal profile, and other raw benchmarks of the Pi 4 compared to previous models.
Setup for Test
The three Pis I test in this post are the new Pi 4B with 4GB RAM, the Pi 3B with 1GB RAM, and the Pi Zero W with 512 MB RAM. All three are loaded with 32GB
A1 rated SD cards and configured
as described in my initial pgbench testing
with parallel query disabled (
max_parallel_workers_per_gather = 0) since the Zero
only has a single core. Also,
shared_buffers was scaled to be 25% of each device's RAM. Rasbian Buster Lite is the base OS image.
Test Run 1
Staying in line with my prior testing
the pgbench database (
bench_test) was initialized with scale = 10 and tests
were ran against a fresh database for 1 hour. The following chart shows the
Pi 4B started out with a slight lead in TPS over the Pi 3B, but after the
first 5 minutes the Pi 4's performance dropped significantly with the decline
continuing for the first 20 minutes where it stabilized.
The following table shows the summary results for this first test run, the Pi 3B is the clear winner here. Obviously the Pi Zero is way down in last place, but 54 TPS for a single core, 512MB RAM device... not too shabby.
|Pi Model||TPS||Latency||Std Dev|
|Pi Zero W||54||186||80|
Baked Pi (aka thermal issues)
I went into this test knowing heat would be an issue, so before starting I setup
each Pi with a simple script to track its internal temperature.
This code goes into a script named
temp_check.sh on each Pi:
while true do printf "%s, %s, %s\n" $(hostname) $(date +%Y%m%d-%H:%M:%S) $(cat /sys/class/thermal/thermal_zone0/temp) >> temp_tracking.csv sleep 15 done
Note: Divide the temperature by 1,000 to get the value in C.
Before starting the testing I ran the script in the background:
bash ./temp_check.sh &
The following chart shows the temperature of each Pi during the previous pgbench test, readings were aggregated to once per minute. The chart includes about 15 minutes before and after the test.
Each Pi had been powered on idling and in its case for a few hours preceding the tests.
The Pi 4 stabilized at 75C! The Pi 3B sits around 50C and the low power Pi Zero around 44C. The first small spike in temperature (time 14:00:00) was the result of
running the pgbench initialize command (
pgbench -i -s 10 bench_test). The pgbench test started at 14:02:00 and ran until 15:02:00. By 14:07 (5 minutes elapsed), the Pi 4 had reached 86C with the hottest single recorded temp at 88.3C! At the same time (5 minutes elapsed), the Pi 3 had risen to 76C, still below its thermal limiting. The Pi Zero seems to peak around 59C.
After the first test, I took the Pis out of their cases and let them cool down a bit. After 10 minutes, even the Pi 4's heat sinks were cool to the touch so I powered them back on open to the air and started watching the temps again. The Pi Zero and Pi 3 had a nice, cool, steady temperature. The Pi 4... did not. It quickly was at 50C and continued climbing at a steady rate. (See 15:30 to 15:37 in the following chart)
Up until now, I haven't had issues with heat and my Pis, so I hadn't bothered with getting any 5V fans for them. For an immediate solution I grabbed a 8" fan we had handy and placed that on the desk angled to blow over the Pis. The following picture was taking from the point of view of the fan.
With this fancy cooling system in place, I ran another test watching the temperature closely. The init happened at 15:45 and the full test started at 15:46. Within the first couple of minutes I was astonished that the Pi 3B was running 1 - 2C warmer than the Pi 4 while under load! I rearranged the original layout on the desk (above picture) so the Pi 3B and Pi 4B would receive more equal treatment from the fan, but the Pi 4 continued to run cooler. Having the extra chip with a heat sink really seems to help distribute the extra heat! The Pi 3B ran the warmest around 57C, the Pi 4B around 55C, and the Pi Zero down at 42C. Cool. 😄
Note: Ambient temperature was 27.8C (82F) according to the PiWS in my office.
Performance with Air Flow
That's great that the temps were brought down safely below the thermal limiting levels, but did it help? Yup, big time.
The results were impressive with all three Pis running faster with the cooler temps. The Raspberry Pi 4 was where it really helped though, this run showed a 76% improvement, reaching an overall 750 TPS!
The following table shows the summary results for this test run. With cooling, the Pi 4B is the obvious winner!
|Pi Model||TPS||% Diff (TPS)||Latency||Std Dev|
|Pi Zero W||61||13%||165||79|
Pi 4: Baked vs Cooled
The following chart shows the TPS trends from the two runs on the Raspberry Pi 4B.
One thing that sticks out on
run2 (no case with fan) is the increased amount of
variance in TPS from minute to minute. It hit 818 TPS in minute 19 vs 619 TPS in minute 22. I think what this shows is that the SD card bus is finally not the only bottleneck to contend with on the Raspberry Pi. The Pi 4B provides
the previous SD read speed, and increased the write speed by a good margin too.
This test run just scratches the surface of the possibilities with the new Raspberry Pi 4. I have ordered 5V fans that I'll install and test in my existing case. Other than that I'm excited to try out using an external USB drive for additional I/O performance since the USB 3.0 bus (> 300 MB/s) greatly outperforms the SD performance.
Of course, I also want to do some real world testing with how the Pi 4B
improves timing with real ETL workloads. I'm particularly interested to see
how much faster
osm2pgsql will load OpenStreetMap data.
Colorado's data (167MB) took 2.75 hours to load on a Pi 3B. My prediction is the Pi 4B will be able to
do the same load in about 1.5 hours, cutting out about 45% of the time.
The Raspberry Pi 4B and Postgres are going to be great partners on my desk! With a 56% increase in TPS over the Raspberry Pi 3B, this enables more workloads while keeping the small, low power form we love. The additional capabilities for high performance off-board storage (USB 3 or NAS) opens up so many possibilities I can't wait to test and write about.
As I wrote this summary (I do write my summary last!) I realized there was hardly a mention that my Pi 4B has 4GB RAM. I was so excited about that detail the day of the announcement, to finally have more than 1GB RAM, but other
shared_buffers = 1GB I hardly gave it a second thought during this
entire testing and writing process.
Need help with your PostgreSQL servers or databases? Contact us to start the conversation!
Published August 23, 2019
Last Updated August 23, 2019