11# PostgreSQL built for AWS Graviton2
22
3- PostgreSQL rebuilt and optimized for AWS Graviton2 processors (` armv8.2 ` with LSE atomics):
3+ 1 . Launch a new ARM64 instance:
4+ * Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
5+ * 64-bit (Arm)
6+ * t4g.2xlarge
7+ * 40 GB EBS volume
8+ * tags:
9+ * ` Name: mediacloud-herewegoagain-build-arm64 `
10+ * ` project: mediacloud-herewegoagain `
11+
12+ 2 . SSH into the instance and run:
13+
14+ ``` bash
15+ sudo hostnamectl set-hostname build-arm64
16+
17+ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
18+ sudo apt-get update
19+ sudo apt-get -y install gcc-11 g++-11
20+
21+ sudo update-alternatives --remove-all gcc
22+ sudo update-alternatives --remove-all g++
23+ sudo update-alternatives --remove-all cc
24+ sudo update-alternatives --remove-all c++
25+ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 10
26+ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 10
27+ sudo update-alternatives --set cc /usr/bin/gcc
28+ sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 10
29+ sudo update-alternatives --set cc /usr/bin/gcc
30+ sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 10
31+ sudo update-alternatives --set c++ /usr/bin/g++
32+
33+ export CFLAGS=" -march=armv8.2-a+fp16+rcpc+dotprod+crypto -mcpu=neoverse-n1 -fsigned-char"
34+ export CXXFLAGS=" $CFLAGS "
35+ export CPPFLAGS=" $CFLAGS "
36+ export DEB_CFLAGS_SET=" $CFLAGS "
37+ export DEB_CPPFLAGS_SET=" $CFLAGS "
38+ export DEB_CXXFLAGS_SET=" $CFLAGS "
39+
40+ sudo apt install curl ca-certificates gnupg
41+ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg > /dev/null
42+ sudo sh -c ' echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
43+ sudo sh -c ' echo "deb-src http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
44+ sudo apt-get -y update
45+
46+ sudo apt-get -y install dpkg-dev
47+ ```
48+
49+ 3 . Build PostgreSQL:
50+
51+ ``` bash
52+ sudo apt-get -y install autoconf bison clang debhelper-compat dh-exec docbook-xml docbook-xsl flex gdb gettext libicu-dev libio-pty-perl libipc-run-perl libkrb5-dev libldap2-dev liblz4-dev libpam0g-dev libpam-dev libperl-dev libreadline-dev libselinux1-dev libssl-dev libsystemd-dev libxml2-dev libxml2-utils libxslt1-dev llvm-dev pkg-config postgresql-common python3-dev systemtap-sdt-dev tcl-dev uuid-dev xsltproc zlib1g-dev libz-dev clang-11 llvm-11-dev
53+
54+ apt-get source postgresql-14
55+
56+ git clone https://salsa.debian.org/postgresql/postgresql.git -b 14
57+ cd postgresql/
58+ git checkout debian/14.1-1
59+ cp -R debian/ ../postgresql-14-14.1/debian/
60+ cd ../postgresql-14-14.1/
61+
62+ sed -i ' s/debhelper-compat (= 13)/debhelper, dh-exec (>= 0.13~)/' debian/control
63+ sed -i ' s/clang-9/clang-11/' debian/control
64+ sed -i ' s/llvm-9/llvm-11/' debian/control
65+ sed -i ' s/clang-9/clang-11/' debian/rules
66+ sed -i ' s/llvm-config-9/llvm-config-11/' debian/rules
67+ echo 9 > debian/compat
68+
69+ dpkg-buildpackage -rfakeroot -b -uc -us
70+
71+ # Ensure that PostgreSQL got built with LSE (has to be non-zero)
72+ objdump -d ./build/src/backend/postgres | grep -i ' cas\|casp\|swp\|ldadd\|stadd\|ldclr\|stclr\|ldeor\|steor\|ldset\|stset\|ldsmax\|stsmax\|ldsmin\|stsmin\|ldumax\|stumax\|ldumin\|stumin' | wc -l
73+
74+ # Ensure that PostgreSQL didn't get built with load-store exclusives (has to be zero)
75+ objdump -d ./build/src/backend/postgres | grep -i ' ldxr\|ldaxr\|stxr\|stlxr' | wc -l
76+ ```
77+
78+ 4 . Build PgBouncer:
79+
80+ ``` bash
81+ sudo apt-get -y install libevent-dev libc-ares-dev pandoc
82+
83+ # Install PostgreSQL packages that we've just built
84+ sudo dpkg -i ~ /* .deb
85+
86+ apt-get source pgbouncer
87+
88+ cd pgbouncer-1.16.1/
89+
90+ dpkg-buildpackage -rfakeroot -b -uc -us -d
91+
92+ sudo dpkg -i pgbouncer_1.16.1-1.pgdg20.04+1_arm64.deb
93+ ```
94+
95+
96+ 5 . Build Citus extension:
97+
98+ ``` bash
99+ sudo apt-get -y install autoconf flex git libcurl4-gnutls-dev libicu-dev \
100+ libkrb5-dev liblz4-dev libpam0g-dev libreadline-dev \
101+ libselinux1-dev libssl-dev libxslt1-dev libzstd-dev \
102+ make uuid-dev
103+
104+ git clone https://github.com/citusdata/citus.git
105+ cd citus/
106+ git checkout v10.2.3
107+
108+ ./configure --with-security-flags
109+ make -j$( nproc)
110+ make install-all
111+ make install
112+
113+ cd src/tests/regression/
114+ sudo chmod 777 /var/run/postgresql/
115+ make check
116+
117+ # If upgrade / downgrade tests fail, that's probably fine
118+
119+ mkdir ~ /citus-install/
120+ make DESTDIR=~ /citus-install install-all
121+ make DESTDIR=~ /citus-install install
122+
123+ cd ~ /
124+ mkdir citus-install/DEBIAN/
125+
126+ dpkg-deb --build --root-owner-group citus-install/
127+ mv citus-install.deb postgresql-14-citus-10.2_10.2.3.citus-1_arm64.deb
128+ sudo dpkg -i postgresql-14-citus-10.2_10.2.3.citus-1_arm64.deb
129+ ```
130+
131+
132+ 6 . Copy binaries to local machine:
4133
5134``` bash
6- DEB_CFLAGS_SET= " -march=armv8.2-a+fp16+rcpc+dotprod+crypto -mcpu=neoverse-n1 -fsigned-char " \
7- dpkg-buildpackage -rfakeroot -b -uc -us
135+ scp mediacloud-herewegoagain-build-arm64: ' *.deb ' .
136+ scp mediacloud-herewegoagain-build-arm64: ' *.ddeb ' .
8137```
9138
10- Used ` gcc-11-11.1.0-1ubuntu1~20.04 ` from [ ` ppa:ubuntu-toolchain-r/test ` ] ( https://launchpad.net/%7Eubuntu-toolchain-r/+archive/ubuntu/test ) .
139+
140+ 7 . Create a new GitHub release
141+
11142
12143
13144## Links
@@ -17,3 +148,5 @@ Used `gcc-11-11.1.0-1ubuntu1~20.04` from [`ppa:ubuntu-toolchain-r/test`](https:/
17148* https://www.postgresql.org/message-id/flat/099F69EE-51D3-4214-934A-1F28C0A1A7A7%40amazon.com
18149* https://www.percona.com/blog/2021/01/28/how-to-create-postgresql-custom-builds-and-debian-packages/
19150* https://github.com/aws/aws-graviton-getting-started/blob/main/c-c++.md
151+ * https://github.com/citusdata/citus/blob/master/CONTRIBUTING.md
152+ * https://www.internalpointers.com/post/build-binary-deb-package-practical-guide
0 commit comments