AWS: Graviton2의 PostgreSQL

AWS 프리 티어에서는 가입 날짜 이후 처음 12개월 동안 매월 750시간 동안 t2.micro 인스턴스를 실행할 수 있습니다. 그리고 현재 2021년 6월까지 T4g.micro도 실행할 수 있습니다. 그러나 무료 평가판이 종료되거나 사용량이 무료 평가판 제한을 초과하는 경우 표준 종량제 요금을 지불하게 되므로 주의하십시오. 이것은 Graviton2 ARM 프로세서를 테스트할 수 있는 좋은 기회이며 해당 인스턴스에 대해 이 블로그 게시물에서 수행하는 것과 동일하게 수행할 수 있습니다. 하지만 장기적으로 실행하는 동안 CPU 성능을 비교하고 싶기 때문에 더 큰(버스트할 수 없는) 인스턴스를 사용하겠습니다. x86_64의 경우 m5d.2xlarge 및 vCPU 8개와 32GB 또는 RAM이 모두 있는 m6gd.2xlarge aarch64입니다.

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 성능에 대한 아이디어를 얻을 수 있습니다.
  • m5d.2xlarge x86_64 Xeon 시간: 실제 3m32.192s, 사용자 3m14.176s, sys 0m18.400s
  • m6gd.2xlarge aarch64 ARM 시간: 실제 3m54.493s, 사용자 3m39.324s, sys 0m15.373s
  • 
    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
    

    결과:
  • m5d.2xlarge x86_64 Xeon: tps = 2035.794849(연결 설정 제외)
  • m6gd.2xlarge aarch64 ARM: tps = 2109.661869(연결 설정 제외)

  • pgbench 준비된 문


    
    time pgbench -T 600 -c 4 --protocol=prepared postgres
    

    결과:
  • m5d.2xlarge x86_64 Xeon: tps = 2107.070647(연결 설정 제외)
  • m6gd.2xlarge aarch64 ARM: tps = 2121.966940(연결 설정 제외)

  • 가격/성능



    제가 사용한 인스턴스의 가격입니다. 소프트웨어는 무료이며 Graviton2의 EC2 실행 시간은 20% 더 저렴합니다.
  • m5d.2xlarge x86_64 Xeon EC2 비용: $0.504/시간
  • m6gd.2xlarge aarch64 ARM EC2 비용: $0.403/시간

  • 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 버전 및 컴파일 플래그에 대한 자세한 내용은

    좋은 웹페이지 즐겨찾기