MySQL 和 PG 性能 PK,基准测试跑起来!

数据库 MySQL
使用 sysbench,我们可以为 PostgreSQL 服务器生成测试负载。请注意,最佳的基准测试是,使用您的真实数据和应用程序,但这可能并不总是可行的。它也可能是一个将会快速演进的新应用程序。

介绍

基准测试是一种发现基础组件性能的方式。Sysbench 是对 PostgreSQL 服务器进行基准测试的一个优秀工具。在本文中,我们将向您展示如何使用 sysbench 生成测试负载。我们将使用双节点的主从流复制设置。这也会帮助我们在集群上产生一些活动,以检查复制是否能按预期工作。

我们将安装最新版本的 sysbench,该项目目前在此处维护。我们将使用 Github 项目页面中提供的更新包,来安装 sysbench。我们还将使用 PostgreSQL 下载页面中标准的 PostgreSQL 16 二进制软件包。

安装 sysbench

安装 sysbench 非常简单。对于 Debian/Ubuntu:

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
$ sudo apt -y install sysbench

对于 RHEL/CentOS:

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench

安装 sysbench 软件包:

$ yum install sysbench

验证软件版本:

$ sysbench --version
sysbench 1.0.15

我们现在已经安装了 sysbench。

初始化测试数据

如果您熟悉 sysbench,对于 PostgreSQL 的参数会使用以下默认值:

  • • pgsql-host=localhost
  • • pgsql-port=5432
  • • pgsql-user=sbtest
  • • pgsql-password=password
  • • pgsql-db=sbtest

首先,在 PostgreSQL 中创建数据库和用户:

CREATE USER sbtest WITH PASSWORD 'password';
CREATE DATABASE sbtest;
GRANT ALL PRIVILEGES ON DATABASE sbtest TO sbtest;

然后,编辑基于主机的访问控制文件pg_hba.conf:

$ vim /var/lib/pgsql/16/data/pg_hba.conf

并添加下面的行,以允许用户 sbtest 从192.168.55.0网络下的所有主机连接到数据库 sbtest:

host    sbtest          sbtest          192.168.55.0/24         md5

重新加载服务器,以应用更改:

$ /usr/pgsql-16/bin/pg_ctl --reload

使用 psql 命令行客户端,验证用户身份验证是否正常工作:

$ psql -U sbtest -h 192.168.55.61 -p 5432 -d sbtest -W

您应该能够进入到服务器中的 sbtest 数据库。运行 “q” 退出终端。我们现在可以执行下面命令,使用 sysbench 初始化数据库:

$ sysbench \
--db-driver=pgsql \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=1 \
--pgsql-host=192.168.55.61 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua \
run

上面命令在数据库 'sbtest' 中,为 24 个表(sbtest1 到 sbtest24)中的每个表生成 100,000 行。模式名称为 “public”,这是默认值。数据由名为parallel_prepare.lua的脚本准备,该脚本位于/usr/share/sysbench/tests/include/oltp_legacy下面。

执行下面的命令,验证生成的表:

$ psql -U sbtest -h 192.168.55.61 -p 5432 -W -c 'dt+'
Password for user sbtest:
                    List of relations
 Schema |   Name   | Type  | Owner  | Size  | Description
--------+----------+-------+--------+-------+-------------
 public | sbtest1  | table | sbtest | 21 MB |
 public | sbtest10 | table | sbtest | 21 MB |
 public | sbtest11 | table | sbtest | 21 MB |
 public | sbtest12 | table | sbtest | 21 MB |
 public | sbtest13 | table | sbtest | 21 MB |
 public | sbtest14 | table | sbtest | 21 MB |
 public | sbtest15 | table | sbtest | 21 MB |
 public | sbtest16 | table | sbtest | 21 MB |
 public | sbtest17 | table | sbtest | 21 MB |
 public | sbtest18 | table | sbtest | 21 MB |
 public | sbtest19 | table | sbtest | 21 MB |
 public | sbtest2  | table | sbtest | 21 MB |
 public | sbtest20 | table | sbtest | 21 MB |
 public | sbtest21 | table | sbtest | 21 MB |
 public | sbtest22 | table | sbtest | 21 MB |
 public | sbtest23 | table | sbtest | 21 MB |
 public | sbtest24 | table | sbtest | 21 MB |
 public | sbtest3  | table | sbtest | 21 MB |
 public | sbtest4  | table | sbtest | 21 MB |
 public | sbtest5  | table | sbtest | 21 MB |
 public | sbtest6  | table | sbtest | 21 MB |
 public | sbtest7  | table | sbtest | 21 MB |
 public | sbtest8  | table | sbtest | 21 MB |
 public | sbtest9  | table | sbtest | 21 MB |
(24 rows)

现在,测试数据已加载完成。

生成测试负载

您可以使用 sysbench 生成不同类型的数据库工作负载,如以下部分所示。

读/写负载

对于读写负载的测试,您可以使用下面的命令,指定 PostgreSQL 相关参数:

$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=192.168.55.61 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
run

上面的命令会使用名为/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua的 LUA 脚本生成 OLTP 工作负载,在主机 192.168.55.61(主)上,使用 64 个工作线程对 24 个表中的 100,000 行,持续操作 60 秒。sysbench 会每 2 秒报告一次中间的统计信息(--report-interval=2)。

执行完后,您将获得如下内容:

sysbench 1.0.15 (using bundled LuaJIT 2.1.0)

Running the test with following options:
Number of threads: 16
Report intermediate results every 2 second(s)
Initializing random number generator from current time

Initializing worker threads...

Threads started!

[ 2s ] thds: 64 tps: 0.00 qps: 466.69 (r/w/o: 406.55/28.33/31.81) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 64 tps: 30.55 qps: 525.38 (r/w/o: 335.56/128.72/61.10) lat (ms,95%): 3639.94 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 64 tps: 39.55 qps: 718.41 (r/w/o: 496.13/142.68/79.60) lat (ms,95%): 4128.91 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 64 tps: 35.98 qps: 840.95 (r/w/o: 604.11/163.89/72.95) lat (ms,95%): 2198.52 err/s: 0.50 reconn/s: 0.00
[ 10s ] thds: 64 tps: 65.57 qps: 1314.94 (r/w/o: 912.00/271.80/131.14) lat (ms,95%): 3040.14 err/s: 0.00 reconn/s: 0.00
...

当测试正在进行时,我们可以使用pg_activity或pg_top来监控 PostgreSQL 的活动,以确认 sysbench 报告的中间统计数据。在另一个终端中,执行下面操作:

$ su - postgres
$ pg_activity
 PostgreSQL 16.2 - postgres1.local - postgres@localhost:5432/postgres - Ref.: 2s
  Size:  654.62M -     7.67K/s        | TPS:          74
  Mem.:   39.10% -   382.72M/979.68M  | IO Max:     3395/s
  Swap:    0.20% -     3.57M/2.00G    | Read :      8.36M/s -   2141/s
  Load:    20.20 6.02 2.44            | Write:      2.54M/s -    650/s
                                                                   RUNNING QUERIES
PID    DATABASE              USER           CLIENT   CPU% MEM%   READ/s  WRITE/s     TIME+  W  IOW              state   Query
5130   sbtest              sbtest    192.168.55.61    1.0  2.8  791.57K    3.84K  0.788732  N    N             active   SELECT c FROM sbtest7 WHERE id BETWEEN 33195 AND 33294
...

还可以通过查看主服务器上的 pg_stat_replication 视图,监控复制流的状态:

$ su - postgres
$ watch -n1 'psql -xc "select * from pg_stat_replication"'
Every 1.0s: psql -xc "select * from pg_stat_replication"      Tue Jul 31 13:12:08 2024
-[ RECORD 1 ]----+------------------------------
pid              | 3792
usesysid         | 16448
usename          | slave
application_name | walreceiver
client_addr      | 192.168.55.62
client_hostname  |
client_port      | 44654
backend_start    | 2024-07-30 13:41:41.707514+08
backend_xmin     |
state            | streaming
sent_location    | 0/60933D78
write_location   | 0/60933D78
flush_location   | 0/60933D78
replay_location  | 0/60933D78
sync_priority    | 0
sync_state       | async

上面的 “watch” 命令每 1 秒运行一次 psql 命令。您应该会在复制进行时看到 “*_location” 列相应地更新。

在测试结束时,您应该会看到总结的报告:

SQL statistics:
    queries performed:
        read:                            67704
        write:                           19322
        other:                           9682
        total:                           96708
    transactions:                        4830   (79.34 per sec.)
    queries:                             96708  (1588.53 per sec.)
    ignored errors:                      6      (0.10 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.8723s
    total number of events:              4830

Latency (ms):
         min:                                    4.52
         avg:                                  799.70
         max:                                 8082.70
         95th percentile:                     2279.14
         sum:                              3862532.62

Threads fairness:
    events (avg/stddev):           75.4688/7.39
    execution time (avg/stddev):   60.3521/0.20

上面的总结告诉我们,我们的 PostgreSQL 数据库服务器,在 64 个工作线程下,平均每秒可以处理大约 80 个事务,和每秒大约 1588 个查询。

只读负载

对于只读负载的测试,您可以使用相同的命令,但应将 LUA 脚本更改为select.lua、select_random_points.lua、select_random_ranges.lua或oltp_simple.lua:

$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=192.168.55.62 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/select.lua \
run

上面的命令,访问 PostgreSQL 流复制中的备用服务器192.168.55.62,使用select.lua脚本,通过 64 个工作线程,运行一次只读负载的测试。

其他负载

您还可以使用 sysbench 生成许多其他 OLTP 工作负载,正如/usr/share/sysbench/tests/include/oltp_legacy目录下所列出的:

$ ls -1 /usr/share/sysbench/tests/include/oltp_legacy/
bulk_insert.lua
common.lua
delete.lua
insert.lua
oltp.lua
oltp_simple.lua
parallel_prepare.lua
select.lua
select_random_points.lua
select_random_ranges.lua
update_index.lua
update_non_index.lua

您可以使用类似的命令来测试,只需更改命令行中的 LUA 脚本路径。

最后的思考

使用 sysbench,我们可以为 PostgreSQL 服务器生成测试负载。请注意,最佳的基准测试是,使用您的真实数据和应用程序,但这可能并不总是可行的。它也可能是一个将会快速演进的新应用程序。尽管 sysbench 生成的负载可能无法代表您实际的 OLTP 工作负载,但它也可能已经足够好了。

责任编辑:武晓燕 来源: 红石PG
相关推荐

2009-04-29 14:40:17

2023-03-02 23:09:53

Node.jsC++JS

2021-01-22 14:03:34

Flutter系统鸿蒙

2010-07-13 09:31:08

RubyRuby on Rai

2011-05-04 11:26:47

优化

2021-01-12 11:12:58

大数据智慧交通

2024-05-27 09:01:22

2022-12-06 09:03:44

代码fork系统

2023-08-03 09:02:32

LangChain开发GLM

2015-08-04 17:46:19

戴尔anycloud云计算

2022-01-10 10:23:07

浏览器Vitenode

2012-05-15 13:29:20

HTML5

2017-11-17 15:25:02

Java线程安全

2023-01-31 07:42:29

代码JDKMaven

2009-07-02 18:41:24

TPC能耗服务器

2021-11-10 10:00:48

鸿蒙HarmonyOS应用

2010-07-08 09:37:56

RHEL 6.0 Be

2015-07-21 09:18:48

Windows 10Windows 8性能

2014-04-18 17:12:00

乐跑手环

2013-05-07 09:47:30

测试MySQLMySQL测试
点赞
收藏

51CTO技术栈公众号