AWS: Graviton2의 PostgreSQL
m5d.2xlarge(x86_64)에 "Amazon Linux 2 AMI(HVM)"를 설치하고 m6gd.2xlarge ARM64(aarch64)에 "Amazon ECS-Optimized Amazon Linux 2 AMI(ARM)"를 설치했습니다.
PostgreSQL
여기에 PostgreSQL을 설치하고 PGIO로 LIOPS를 측정하겠습니다( https://github.com/therealkevinc/pgio )
sudo yum install -y git gcc readline-devel zlib-devel bison bison-devel flex
git clone https://github.com/postgres/postgres.git
sudo yum install -y gcc readline-devel zlib-devel bison-devel
time ( cd postgres && ./configure && make all && sudo make install )
( cd postgres/contrib && sudo make install )
이는 커뮤니티 소스(버전 14devel)에서 PostgreSQL을 컴파일합니다. 이미 CPU 성능에 대한 아이디어를 얻을 수 있습니다.
export PGDATA=~/pgdata
echo "$PATH" | grep /usr/local/pgsql/bin || export PATH="$PATH:/usr/local/pgsql/bin"
initdb
pg_ctl -l postgres.log start
top -bn1 -cp $(pgrep -xd, postgres)
환경이 설정되고 인스턴스가 시작됨
sed -ie "/shared_buffers/s/^.*=.*/shared_buffers= 8500MB/" $PGDATA/postgresql.conf
sed -ie "/huge_pages/s/^.*=.*/huge_pages= true/" $PGDATA/postgresql.conf
awk '/Hugepagesize.*kB/{print 1 + int(1024 * MB / $2)}' MB=9000 /proc/meminfo | sudo bash -c "cat > /proc/sys/vm/nr_hugepages"
pg_ctl -l postgres.log restart
데이터베이스 공유 메모리에서 논리적 I/O를 측정하기 위해 8GB의 공유 버퍼를 설정했습니다.
PGIO
git clone https://github.com/therealkevinc/pgio
tar -zxf pgio/pgio*tar.gz
cat > pgio/pgio.conf <<CAT
UPDATE_PCT=0
RUN_TIME=$(( 60 * 600 ))
NUM_SCHEMAS=4
NUM_THREADS=1
WORK_UNIT=255
UPDATE_WORK_UNIT=8
SCALE=1024M
DBNAME=pgio
CONNECT_STRING="pgio"
CREATE_BASE_TABLE=TRUE
CAT
cat pgio/pgio.conf
psql postgres <<<'create database pgio;'
time ( cd pgio && sh setup.sh )
4개의 1GB 스키마에 대해 PGIO를 초기화했습니다.
echo $(curl -s http://169.254.169.254/latest/meta-data/instance-type) $(uname -m)
time ( cd pgio && sh runit.sh )
uptime
이렇게 하면 구성된 대로 PGIO가 실행됩니다(1시간 동안 1GB에서 4개의 스레드).
ARM의 스레드 4개
[ec2-user@ip-172-31-46-196 ~]$ echo $(curl -s http://169.254.169.254/latest/meta-data/instance-type) $(uname -m)
m6gd.2xlarge aarch64
[ec2-user@ip-172-31-46-196 ~]$ time ( cd pgio && sh runit.sh )
Date: Fri Mar 5 11:35:18 UTC 2021
Database connect string: "pgio".
Shared buffers: 8GB.
Testing 4 schemas with 1 thread(s) accessing 1024M (131072 blocks) of each schema.
Running iostat, vmstat and mpstat on current host--in background.
Launching sessions. 4 schema(s) will be accessed by 1 thread(s) each.
pg_stat_database stats:
datname| blks_hit| blks_read|tup_returned|tup_fetched|tup_updated
BEFORE: pgio | 12676581 | 2797475 | 2663112 | 26277 | 142
AFTER: pgio | 11254053367 | 2797673 | 11063125066 | 11057981670 | 162
DBNAME: pgio. 4 schemas, 1 threads(each). Run time: 3600 seconds. RIOPS >0< CACHE_HITS/s >3122604<
이것은 약 780651 LIOPS/스레드입니다.
x86의 스레드 4개
[ec2-user@ip-172-31-29-57 ~]$ echo $(curl -s http://169.254.169.254/latest/meta-data/instance-type) $(uname -m)
m5d.2xlarge x86_64
[ec2-user@ip-172-31-29-57 ~]$ time ( cd pgio && sh runit.sh )
uptimeDate: Fri Mar 5 13:20:10 UTC 2021
Database connect string: "pgio".
Shared buffers: 8500MB.
Testing 4 schemas with 1 thread(s) accessing 1024M (131072 blocks) of each schema.
Running iostat, vmstat and mpstat on current host--in background.
Launching sessions. 4 schema(s) will be accessed by 1 thread(s) each.
pg_stat_database stats:
datname| blks_hit| blks_read|tup_returned|tup_fetched|tup_updated
BEFORE: pgio | 109879603 | 2696860921 | 2759130206 | 2757898526 | 20
AFTER: pgio | 13016322621 | 2697387365 | 15459965084 | 15455884319 | 20
DBNAME: pgio. 4 schemas, 1 threads(each). Run time: 3600 seconds. RIOPS >146< CACHE_HITS/s >3585123<
이것은 약 896280 LIOPS/스레드입니다.
pgbench
pgbench 테스트의 경우 Jobin Augustine과 Sergey Kuzmichev가 체크섬을 사용하거나 사용하지 않고 읽기 전용 및 읽기-쓰기로 긴 테스트를 실행한 https://www.percona.com/blog/2021/01/22/postgresql-on-arm-based-aws-ec2-instances-is-it-any-good/을 읽을 수 있습니다. 그리고 sysbench-tpcc도 있습니다. 여기서는 결과가 테스트 내용에 따라 다르다는 것을 보여주기 위해 매우 간단한 테스트만 수행하고 있습니다.
time pgbench -i -s 100 postgres
pgbench 단순 프로토콜
time pgbench -T 600 -c 4 --protocol=simple postgres
결과:
pgbench 준비된 문
time pgbench -T 600 -c 4 --protocol=prepared postgres
결과:
가격/성능
제가 사용한 인스턴스의 가격입니다. 소프트웨어는 무료이며 Graviton2의 EC2 실행 시간은 20% 더 저렴합니다.
PostgreSQL 소스의 컴파일 시간은 ARM에서 11% 더 느렸습니다: 3분 39초 vs. 3분 14초 vs.
PostgreSQL 공유 버퍼 캐시 적중률은 x86에서 13% 더 빨랐습니다: 896280 LIOPS/스레드 대 780651 LIOPS/스레드. 그러나 이것이 가장 최적의 데이터베이스 작업입니다. 모두 공유 버퍼, 제한된 호출, 왕복 및 컨텍스트 전환에서 이루어집니다. 모두 CPU 및 RAM 액세스에 있습니다.
그러나 pgbench를 실행하는 경우 ARM은 준비된 명령문 프로토콜에 대해 거의 동일한 성능을 보였고 단순 프로토콜에서는 조금 더 빠릅니다. 이것이 바로 대부분의 데이터베이스 응용 프로그램이 수행하는 작업입니다. 마지막으로 Graviton2 m6gd.2xlarge가 m5d.2xlarge x86보다 20% 저렴하므로 가장 큰 차이점은 가격입니다. 여기에서는 EC2에 PostgreSQL을 설치했지만 Graviton2는 db.r6g와 함께 RDS에서도 사용할 수 있습니다(미리보기).
GCC 버전 및 컴파일 플래그에 대한 자세한 내용은
Reference
이 문제에 관하여(AWS: Graviton2의 PostgreSQL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-heroes/aws-postgresql-on-graviton2-3n44텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)