PostgreSQL Benchmarks: Apple ARM M1 MacBook Pro 2020
This week Apple started delivering Macs using their own Apple Silicon chips, starting with a Mac SOC named the M1. M1 uses the ARM instruction set and claims some amazing acceleration for media workloads. I wanted to know how it would do running PostgreSQL, an app that's been running on various ARM systems for years. The results are great!
The OSS community around the homebrew project already qualified their PostgreSQL package as working on M1, and with some recompiling work that all worked as expected:
$ /opt/homebrew/bin/psql -c "select version()"
PostgreSQL 13.0 on arm-apple-darwin20.1.0, compiled by
Apple clang version 12.0.0 (clang-1200.0.32.28), 64-bit
I need some additional software for my benchmark toolkit, and the only compile problems I saw were Qt and Python's numpy; those two seemed straightforward to fix once someone gets to them.
My last blog entry introduced my basic method of using pgbench-tools to look at past MacBook Pro models. I said there Apple needed to exceed "15K TPS single/60K TPS all core" on PostgreSQL to fully embarrass Intel. Well, they outperformed expectations:
32K single/92K all core is so fast for a laptop, I need to pull in some other hardware to put it into perspective. Here's a data table for all the results behind the graph, plus adding two generations of AMD's Ryzen desktop hardware:
server | 1 | 2 | 4 | 8 | 16 | 32 |
---|---|---|---|---|---|---|
2011 16GB MacBookPro8,2 | 7252 | 14644 | 20471 | 30749 | 32894 | 32647 |
2012 16GB MacBookPro9,1 | 7781 | 15861 | 22380 | 34743 | 38294 | 36754 |
2015 16GB MacBookPro11,4 | 9770 | 17795 | 22372 | 38341 | 45048 | 43497 |
2017 16GB Intel NUC7i3BNB | 12789 | 20870 | 33649 | 31053 | 32029 | 32409 |
2019 16GB MacBookPro16,1 | 14353 | 27588 | 43784 | 45089 | 61603 | 58705 |
2019 64GB MacBookPro16,1 | 14105 | 28733 | 46836 | 61167 | 62083 | 69101 |
2019 16GB Intel NUC10i5FNB | 15444 | 27496 | 43341 | 70015 | 61927 | 62584 |
2020 8GB MacBookPro17,1 | 32198 | 52828 | 96536 | 97042 | 95130 | 92663 |
2018 64GB Ryzen 7 2700X | 11624 | 22153 | 41648 | 69399 | 138431 | 123466 |
2019 64GB Ryzen 9 3950X | 37768 | 69162 | 133943 | 206684 | 258722 | 306185 |
This graph is amazing to me:
Of course Intel has Xeon processors that have pushed single core performance higher than these laptop-oriented Intel results. But look at that big cluster below 5 clients, showing how long they've been stuck in the same performance range when power and heat is limited. I mentioned last time Intel had only doubled performance in the 8 years of MacBook models I looked at, which is not industry leading performance.
AMD has been doing a lot better, getting their single core boost competitive in their 3000 series. Even last year's 3950X with its mandatory water cooling is barely faster than the M1 until you hit 8 clients.
If Apple can push the M1 design into larger amounts of memory and add a few more cores, it could be a fierce midsize server competitor. That's not going to disrupt the big industry push toward hosting things on giant cloud systems, where data centers want >=48 processors for a server to be worth installing. There are cloud scale ARM servers out there, and Apple's ARM instruction set Macs make developing for that platform easier. I'm looking forward to the competition of a four way race between Intel, AMD, Apple, and the other ARM designers.
The M1 is a great step forward for developers who can take advantage of it. Let's hope the obvious virtualization issues are sorted out in the near future. A lot of developers need tools like Docker and VMs to build modern cloud software. Until that area is sorted out, the M1 Macs aren't suitable for everyone. Make sure you understand your requirements and what's supported before you consider buying one.
To make this article complete, here's the detailed list of the hardware I tested for this tour of benchmark results, and you can drill into detail about the systems I have here by digging into my Geekbench Profile.
System | CPU Model | CPUs |
---|---|---|
2011 16GB MacBookPro8,2 | Intel i7-2860QM CPU @ 2.50GHz | 8 |
2012 16GB MacBookPro9,1 | Intel i7-3615QM CPU @ 2.30GHz | 8 |
2015 16GB MacBookPro11,4 | Intel i7-4770HQ CPU @ 2.20GHz | 8 |
2017 16GB Intel NUC7i3BNB | Intel i3-7100U CPU @ 2.40GHz | 4 |
2019 16GB MacBookPro16,1 | Intel i7-9750H CPU @ 2.60GHz | 12 |
2019 64GB MacBookPro16,1 | Intel i9-9980HK CPU @ 2.40GHz | 16 |
2019 16GB Intel NUC10i5FNB | Intel i5-10210U CPU @ 1.60GHz | 8 |
2020 8GB MacBookPro17,1 | Apple M1 | 8 |
2018 64GB Ryzen X470 | AMD Ryzen 7 2700X | 16 |
2019 64GB Ryzen X570 | AMD Ryzen 9 3950X | 32 |
Related Articles
- Sidecar Service Meshes with Crunchy Postgres for Kubernetes
12 min read
- pg_incremental: Incremental Data Processing in Postgres
11 min read
- Smarter Postgres LLM with Retrieval Augmented Generation
6 min read
- Postgres Partitioning with a Default Partition
16 min read
- Iceberg ahead! Analyzing Shipping Data in Postgres
8 min read