PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Đo điểm chuẩn Giải pháp đám mây PostgreSQL được quản lý:Phần thứ hai - Amazon RDS

Đây là phần thứ hai của loạt bài Giải pháp đám mây được quản lý PostgreSQL đa điểm chuẩn . Trong Phần 1, tôi đã trình bày tổng quan về các công cụ có sẵn, tôi đã thảo luận về lý do sử dụng Quy trình điểm chuẩn AWS cho Aurora, cũng như các phiên bản PostgreSQL sẽ được sử dụng và tôi đã xem xét Amazon Aurora PostgreSQL 10.6.

Trong phần này, pgbench và sysbench sẽ chạy trên Amazon RDS cho PostgreSQL 11.1. Tại thời điểm viết bài này, phiên bản PostgreSQL mới nhất là 11.2 được phát hành khoảng một tháng trước.

Bạn nên dừng lại một chút để xem nhanh các phiên bản PostgreSQL hiện có trên đám mây:

  • Amazon Aurora PostgreSQL 10.6
  • Amazon RDS cho PostgreSQL 11.1
  • Google Cloud SQL dành cho PostgreSQL 9.6
  • Microsoft Azure PostgreSQL 10.5

Amazon lại là người chiến thắng, với việc cung cấp RDS, bằng cách cung cấp phiên bản PostgreSQL mới nhất. Như đã thông báo trong diễn đàn RDS, AWS đã cung cấp PostgreSQL 11.1 vào ngày 13 tháng 3, tức là bốn tháng sau khi phát hành cộng đồng.

Thiết lập Môi trường

Một số lưu ý về các ràng buộc liên quan đến việc thiết lập môi trường và chạy điểm chuẩn, các điểm đã được thảo luận chi tiết hơn trong Phần 1 của loạt bài này:

  • Không có thay đổi nào đối với cài đặt GUC mặc định của nhà cung cấp dịch vụ đám mây.
  • Các kết nối bị giới hạn ở mức tối đa 1.000 vì bản vá AWS cho pgbench không được áp dụng rõ ràng. Một lưu ý liên quan, tôi đã phải tải xuống bản vá định thời gian AWS từ bản gửi pgsql-hacker này vì nó không còn khả dụng tại liên kết được đề cập trong hướng dẫn.
  • Mạng nâng cao phải được bật cho phiên bản máy khách.
  • Cơ sở dữ liệu không bao gồm một bản sao.
  • Bộ nhớ cơ sở dữ liệu không được mã hóa.
  • Cả phiên bản khách hàng và phiên bản mục tiêu đều ở trong cùng một khu vực khả dụng.

Đầu tiên, hãy thiết lập máy khách và các phiên bản cơ sở dữ liệu:

  • Máy khách là một phiên bản EC2 r4.8xlarge theo yêu cầu:
    • vCPU:32 (16 Cores x 2 Threads / Core)
    • RAM:244 GiB
    • Bộ nhớ:Tối ưu hóa EBS
    • Mạng:10 Gigabit
    Cấu hình phiên bản ứng dụng khách
  • DB Cluster là một db.r4.2xlarge theo yêu cầu:
    • vCPU:8
    • RAM:61GiB
    • Bộ nhớ:Tối ưu hóa EBS
    • Mạng:Băng thông tối đa 1.750 Mbps trên kết nối tối đa 10 Gbps
    Cấu hình phiên bản cơ sở dữ liệu

Tiếp theo, cài đặt và định cấu hình các công cụ điểm chuẩn, pgbench và sysbench, bằng cách làm theo các hướng dẫn trong hướng dẫn của Amazon.

Bước cuối cùng để chuẩn bị sẵn sàng môi trường là định cấu hình các tham số kết nối PostgreSQL. Một cách thực hiện là khởi tạo các biến môi trường trong .bashrc. Ngoài ra, chúng ta cần đặt các đường dẫn đến các tệp nhị phân và thư viện PostgreSQL:

xuất PGHOST =benchmark.ctfirtyhadgr.us-east-1.rds.amazonaws.com

export PGHOST=benchmark.ctfirtyhadgr.us-east-1.rds.amazonaws.com
export PGUSER=postgres
export PGPASSWORD=postgres
export PGDATABASE=postgres
export PATH=$PATH:/usr/local/pgsql/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
Verify that everything is in place:
[[email protected] ~]# psql --version
psql (PostgreSQL) 11.1
[[email protected] ~]# pgbench --version
pgbench (PostgreSQL) 11.1
[[email protected] ~]# sysbench --version
sysbench 0.5

Chạy Điểm chuẩn

pgench

Đầu tiên, khởi tạo cơ sở dữ liệu pgbench.

[[email protected] ~]# pgbench -i --fillfactor=90 --scale=10000

Quá trình khởi tạo mất một chút thời gian và trong khi chạy đã tạo ra kết quả sau:

dropping old tables...
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
creating tables...
generating data...
100000 of 1000000000 tuples (0%) done (elapsed 0.06 s, remaining 599.79 s)
200000 of 1000000000 tuples (0%) done (elapsed 0.15 s, remaining 739.16 s)
300000 of 1000000000 tuples (0%) done (elapsed 0.22 s, remaining 742.21 s)
400000 of 1000000000 tuples (0%) done (elapsed 0.33 s, remaining 814.64 s)
500000 of 1000000000 tuples (0%) done (elapsed 0.41 s, remaining 825.82 s)
600000 of 1000000000 tuples (0%) done (elapsed 0.51 s, remaining 854.13 s)
700000 of 1000000000 tuples (0%) done (elapsed 0.66 s, remaining 937.01 s)
800000 of 1000000000 tuples (0%) done (elapsed 1.52 s, remaining 1897.42 s)
900000 of 1000000000 tuples (0%) done (elapsed 1.66 s, remaining 1840.08 s)

...

500600000 of 1000000000 tuples (50%) done (elapsed 814.78 s, remaining 812.83 s)
500700000 of 1000000000 tuples (50%) done (elapsed 814.81 s, remaining 812.53 s)
500800000 of 1000000000 tuples (50%) done (elapsed 814.83 s, remaining 812.23 s)
500900000 of 1000000000 tuples (50%) done (elapsed 815.11 s, remaining 812.19 s)
501000000 of 1000000000 tuples (50%) done (elapsed 815.20 s, remaining 811.94 s)

...

999200000 of 1000000000 tuples (99%) done (elapsed 1645.02 s, remaining 1.32 s)
999300000 of 1000000000 tuples (99%) done (elapsed 1645.17 s, remaining 1.15 s)
999400000 of 1000000000 tuples (99%) done (elapsed 1645.20 s, remaining 0.99 s)
999500000 of 1000000000 tuples (99%) done (elapsed 1645.23 s, remaining 0.82 s)
999600000 of 1000000000 tuples (99%) done (elapsed 1645.26 s, remaining 0.66 s)
999700000 of 1000000000 tuples (99%) done (elapsed 1645.28 s, remaining 0.49 s)
999800000 of 1000000000 tuples (99%) done (elapsed 1645.51 s, remaining 0.33 s)
999900000 of 1000000000 tuples (99%) done (elapsed 1645.77 s, remaining 0.16 s)
1000000000 of 1000000000 tuples (100%) done (elapsed 1646.03 s, remaining 0.00 s)
vacuuming...
creating primary keys...
total time: 5538.86 s (drop 0.00 s, tables 0.01 s, insert 1647.08 s, commit 0.03 s, primary 1251.60 s, foreign 0.00 s, vacuum 2640.14 s)
done.

Khi phần đó hoàn tất, hãy xác minh rằng cơ sở dữ liệu PostgreSQL đã được điền. Phiên bản đơn giản sau của truy vấn sử dụng đĩa có thể được sử dụng để trả về kích thước cơ sở dữ liệu PostgreSQL:

SELECT
   d.datname AS Name,
   pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
   pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname)) AS SIZE
FROM pg_catalog.pg_database d
WHERE d.datname = 'postgres';

… Và đầu ra:

  name   |  owner   |  size
----------+----------+--------
postgres | postgres | 160 GB
(1 row)

Với tất cả các bước chuẩn bị đã hoàn thành, chúng tôi có thể bắt đầu kiểm tra pgbench đọc / ghi:

[[email protected] ~]# pgbench --protocol=prepared -P 60 --time=600 --client=1000 --jobs=2048

Sau 10 phút chúng tôi nhận được kết quả:

starting vacuum...end.
progress: 60.0 s, 878.3 tps, lat 1101.258 ms stddev 339.491
progress: 120.0 s, 885.2 tps, lat 1132.301 ms stddev 292.551
progress: 180.0 s, 656.3 tps, lat 1522.102 ms stddev 666.017
progress: 240.0 s, 436.8 tps, lat 2277.140 ms stddev 524.603
progress: 300.0 s, 742.2 tps, lat 1363.558 ms stddev 578.541
progress: 360.0 s, 866.4 tps, lat 1146.972 ms stddev 301.861
progress: 420.0 s, 878.2 tps, lat 1143.939 ms stddev 304.396
progress: 480.0 s, 872.7 tps, lat 1139.892 ms stddev 304.421
progress: 540.0 s, 881.0 tps, lat 1132.373 ms stddev 311.890
progress: 600.0 s, 729.3 tps, lat 1366.517 ms stddev 867.784
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10000
query mode: prepared
number of clients: 1000
number of threads: 1000
duration: 600 s
number of transactions actually processed: 470582
latency average = 1274.340 ms
latency stddev = 544.179 ms
tps = 782.084354 (including connections establishing)
tps = 783.610726 (excluding connections establishing)

sysbench

Bước đầu tiên là thêm một số dữ liệu:

sysbench --test=/usr/local/share/sysbench/oltp.lua \
      --pgsql-host=aurora.cluster-ctfirtyhadgr.us-east-1.rds.amazonaws.com \
      --pgsql-db=postgres \
      --pgsql-user=postgres \
      --pgsql-password=postgres \
      --pgsql-port=5432 \
      --oltp-tables-count=250\
      --oltp-table-size=450000 \
      prepare

Lệnh tạo 250 bảng, mỗi bảng có 2 chỉ mục:

sysbench 0.5:  multi-threaded system evaluation benchmark

Creating table 'sbtest1'...
Inserting 450000 records into 'sbtest1'
Creating secondary indexes on 'sbtest1'...
Creating table 'sbtest2'...
...
Creating table 'sbtest250'...
Inserting 450000 records into 'sbtest250'
Creating secondary indexes on 'sbtest250'...

Hãy xem các chỉ mục:

postgres=> \di
                        List of relations
Schema |         Name          | Type  |  Owner   |      Table
--------+-----------------------+-------+----------+------------------
public | k_1                   | index | postgres | sbtest1
public | k_10                  | index | postgres | sbtest10
public | k_100                 | index | postgres | sbtest100
public | k_101                 | index | postgres | sbtest101
public | k_102                 | index | postgres | sbtest102
public | k_103                 | index | postgres | sbtest103

...

public | k_97                  | index | postgres | sbtest97
public | k_98                  | index | postgres | sbtest98
public | k_99                  | index | postgres | sbtest99
public | pgbench_accounts_pkey | index | postgres | pgbench_accounts
public | pgbench_branches_pkey | index | postgres | pgbench_branches
public | pgbench_tellers_pkey  | index | postgres | pgbench_tellers
public | sbtest100_pkey        | index | postgres | sbtest100
public | sbtest101_pkey        | index | postgres | sbtest101
public | sbtest102_pkey        | index | postgres | sbtest102
public | sbtest103_pkey        | index | postgres | sbtest103
public | sbtest104_pkey        | index | postgres | sbtest104
public | sbtest105_pkey        | index | postgres | sbtest105

...

public | sbtest97_pkey         | index | postgres | sbtest97
public | sbtest98_pkey         | index | postgres | sbtest98
public | sbtest99_pkey         | index | postgres | sbtest99
public | sbtest9_pkey          | index | postgres | sbtest9
(503 rows)

Có vẻ tốt ... để bắt đầu kiểm tra, chỉ cần chạy:

sysbench --test=/usr/local/share/sysbench/oltp.lua \
      --pgsql-host=aurora.cluster-ctfirtyhadgr.us-east-1.rds.amazonaws.com \
      --pgsql-db=postgres \
      --pgsql-user=postgres \
      --pgsql-password=postgres \
      --pgsql-port=5432 \
      --oltp-tables-count=250 \
      --oltp-table-size=450000 \
      --max-requests=0 \
      --forced-shutdown \
      --report-interval=60 \
      --oltp_simple_ranges=0 \
      --oltp-distinct-ranges=0 \
      --oltp-sum-ranges=0 \
      --oltp-order-ranges=0 \
      --oltp-point-selects=0 \
      --rand-type=uniform \
      --max-time=600 \
      --num-threads=1000 \
      run

Một lưu ý thận trọng:

Bộ nhớ RDS không “co giãn”, có nghĩa là không gian lưu trữ được phân bổ khi tạo phiên bản phải đủ lớn để phù hợp với lượng dữ liệu được tạo trong quá trình chuẩn, nếu không RDS sẽ không thành công với:

FATAL: PQexec() failed: 7 PANIC:  could not write to file "pg_wal/xlogtemp.29144": No space left on device
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

FATAL: failed query: COMMIT
FATAL: failed to execute function `event': 3
WARNING:  terminating connection because of crash of another server process
DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
WARNING:  terminating connection because of crash of another server process

Kích thước bộ nhớ có thể được tăng lên mà không cần dừng cơ sở dữ liệu, tuy nhiên, tôi mất khoảng 30 phút để tăng nó từ 200 GiB lên 500 GiB:

Tăng không gian lưu trữ trên RDS

Và đây là kết quả kiểm tra sysbench:

sysbench 0.5:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1000
Report intermediate results every 60 second(s)
Random number generator seed is 0 and will be ignored

Forcing shutdown in 630 seconds

Initializing worker threads...

Threads started!

[  60s] threads: 1000, tps: 1070.40, reads: 0.00, writes: 4309.35, response time: 1808.81ms (95%), errors: 0.02, reconnects:  0.00
[ 120s] threads: 1000, tps: 889.68, reads: 0.00, writes: 3575.35, response time: 1951.12ms (95%), errors: 0.02, reconnects:  0.00
[ 180s] threads: 1000, tps: 574.57, reads: 0.00, writes: 2320.62, response time: 3936.73ms (95%), errors: 0.00, reconnects:  0.00
[ 240s] threads: 1000, tps: 232.10, reads: 0.00, writes: 928.43, response time: 10994.37ms (95%), errors: 0.00, reconnects:  0.00
[ 300s] threads: 1000, tps: 242.40, reads: 0.00, writes: 969.60, response time: 9412.39ms (95%), errors: 0.00, reconnects:  0.00
[ 360s] threads: 1000, tps: 257.73, reads: 0.00, writes: 1030.98, response time: 8833.64ms (95%), errors: 0.02, reconnects:  0.00
[ 420s] threads: 1000, tps: 264.65, reads: 0.00, writes: 1036.60, response time: 9192.42ms (95%), errors: 0.00, reconnects:  0.00
[ 480s] threads: 1000, tps: 278.07, reads: 0.00, writes: 1134.27, response time: 7133.76ms (95%), errors: 0.00, reconnects:  0.00
[ 540s] threads: 1000, tps: 250.40, reads: 0.00, writes: 1001.53, response time: 9628.97ms (95%), errors: 0.00, reconnects:  0.00
[ 600s] threads: 1000, tps: 249.97, reads: 0.00, writes: 996.92, response time: 10724.58ms (95%), errors: 0.00, reconnects:  0.00
OLTP test statistics:
   queries performed:
      read:                            0
      write:                           1038401
      other:                           519199
      total:                           1557600
   transactions:                        259598 (428.59 per sec.)
   read/write requests:                 1038401 (1714.36 per sec.)
   other operations:                    519199 (857.18 per sec.)
   ignored errors:                      3      (0.00 per sec.)
   reconnects:                          0      (0.00 per sec.)

General statistics:
   total time:                          605.7086s
   total number of events:              259598
   total time taken by event execution: 602999.7582s
   response time:
         min:                                 55.02ms
         avg:                               2322.82ms
         max:                              13133.36ms
         approx.  95 percentile:            8400.39ms

Threads fairness:
   events (avg/stddev):           259.5980/3.20
   execution time (avg/stddev):   602.9998/2.77
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Chỉ số điểm chuẩn

Các chỉ số có thể được ghi lại bằng cách sử dụng các công cụ giám sát AWS CloudWatch và Thông tin chi tiết về hiệu suất. Dưới đây là một số mẫu cho những người tò mò:

Số liệu phiên bản DB CloudWatch Thông tin chi tiết về hiệu suất RDS - Chỉ số bộ đếm Thông tin chi tiết về hiệu suất RDS - Tải cơ sở dữ liệu

Kết quả

kết quả khởi tạo pgbench kết quả chạy pgbench kết quả sysbench

Kết luận

Mặc dù đang chạy PostgreSQL phiên bản 10.6, Amazon Aurora rõ ràng làm tốt hơn RDS ở phiên bản 11.1 và điều đó không có gì ngạc nhiên. Theo Aurora FAQs, Amazon đã nỗ lực rất nhiều để cải thiện hiệu suất cơ sở dữ liệu tổng thể vốn được xây dựng dựa trên một công cụ lưu trữ được thiết kế lại.

Tiếp theo trong Sê-ri

Phần tiếp theo sẽ là về Google Cloud SQL dành cho PostgreSQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nâng cấp Slony-I 2.0.x lên phiên bản 2.1.x mới nhất

  2. Cài đặt PostgreSQL trên Docker

  3. Cột PostgreSQL foo không tồn tại trong đó foo là giá trị

  4. Hợp nhất các cột JSON (B) kết hợp trong truy vấn

  5. Chọn truy vấn có giới hạn bù quá chậm