性能评估做不好,开会又领导点名叼了。/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~
挨叼了,也要写文章,记录下我的笔记。
写篇文章
对数据库、OS性能的性能评估,需要选择合适的压测工具,给找出数据库的运行瓶颈
pgbench
这是postgresql数据库安装的时候自带的一个压测工具,主要用于测试以下几个指标
指标数据讲解
transaction type: insert_data.sql
scaling factor: 1 ##缩放因子(scaling factor)决定了初始化时插入的测试数据的规模
query mode: simple ##查询模式。simple 模式表示使用简单的 SQL 查询模式
number of clients: 1 ##并发客户端的数量。这里是发起一个客户端链接
number of threads: 1 ##用于执行测试的线程数,这里表示一个线程数
duration: 60 s ##压测持续时间,这里表示压测持续60秒
number of transactions actually processed: 11 ## 压测时间段内的事务处理数量
latency average = 5878.522 ms ##平均延迟时间。延迟表示每个事务的平均处理时间
initial connection time = 5.295 ms ##链接客户端花费时间
tps = 0.170111 (without initial connection time) ##每秒事务处理数
pgbench可以指定执行脚本进行压测,但是不适合大数据容量的脚本,每次pgbench加载压测脚本的时候,可能会需要花费大量的时间,观察数据库的TPS 指标使用pgbench是一个不错的选择。
pgbench 常用的参数
首次使用pgbench的时候 需要时i对数据库进行初始,pgbench会在对应的压测数据库创建对应的压测表
执行
pgbench -i
会在数据库创建以下几张表,用于pgbench 的压测指标
public.pgbench_accounts
public.pgbench_branches
public.pgbench_history
public.pgbench_tellers
在自定义压测脚本的时候,需要注意对应几个表存在的约束条件。避免执行报错。
列举,使用自定义脚本,测试数据库批量插入情况的TPS 使用情况了。
##首先删掉压测表的约束
alter table pgbench_accounts drop CONSTRAINT pgbench_accounts_pkey ;
alter table pgbench_accounts alter column aid drop not null ;
使用脚本,自动生成两万条SQL语句
for i in {1..20000}; do echo "INSERT INTO pgbench_accounts (bid, abalance, filler) VALUES (0, 0, 'filler');" >> insert_data.sql; done
使用自定义脚本进行压测
pgbench -f insert_data.sql
建议不要使用过多的调试参数,调试参数的使用,可能会导致延迟的提高
常见的几个使用参数如下
pgbench -c 10 -C -j 10 -r -t 1000 -M prepared
参数介绍如下,
-c, --client=NUM: 并发数据库客户端的数量(默认:1)。
-C, --connect: 每个事务建立新的连接。
-D, --define=VARNAME=VALUE: 定义自定义脚本中使用的变量。
-j, --jobs=NUM: 使用的线程数(默认:1)。
-l, --log: 将事务时间写入日志文件。
-L, --latency-limit=NUM: 将执行时间超过 NUM 毫秒的事务记为延迟事务。
-M, --protocol=simple|extended|prepared: 提交查询时使用的协议(默认:simple)。
-n, --no-vacuum: 在测试前不运行 VACUUM。
-P, --progress=NUM: 每隔 NUM 秒显示进度报告。
-r, --report-latencies: 报告每个命令的平均延迟时间。
-R, --rate=NUM: 目标事务处理速率(每秒事务数)。
-s, --scale=NUM: 报告输出中的缩放因子。
-t, --transactions=NUM: 每个客户端执行的事务数(默认:10)。
-T, --time=NUM: 基准测试持续时间(秒)。
-v, --vacuum-all: 在测试前对所有四个标准表运行 VACUUM。
--aggregate-interval=NUM: 按 NUM 秒间隔聚合数据。
--log-prefix=PREFIX: 事务时间日志文件的前缀(默认:"pgbench_log")。
--progress-timestamp: 使用 Unix 纪元时间戳显示进度。
--random-seed=SEED: 设置随机种子("time", "rand", 整数)。
--sampling-rate=NUM: 日志记录事务的比例(例如,0.01 表示记录 1% 的事务)。
--show-script=NAME: 显示内置脚本代码,然后退出。
当你需要跨库执行压测的时候
-h, --host=HOSTNAME: 数据库服务器主机名或套接字目录。
-p, --port=PORT: 数据库服务器端口号。
-U, --username=USERNAME: 以指定的数据库用户连接。
总的来说,pgbench 在测试数据库事务处理能,是一个非常值得参考的工具,但是其并不太适合于大规模批量的数据压力测试
sybench
安装sysbench
yum install sysbench
安装完sysbench之后,会在 /usr/share/sysbench/ 目录下生成压测脚本
sysbench 是一个可以针对mysql \postgresql 进行压测的工具
在初次使用该工具的时候,需要使用初始数据库,他会在数据库生成对应的压测脚本和数据,使用该工具对数据库进行压测,主要分为prepare、run、clean三个阶段。sysbench也支持 prewarm ,将数据加载到缓存中,可以提高数据在缓存区的命中率,这在postgresql数据库中测试复杂查询的时是非常有用的方法,相当于数据库使用的pg_prefaulter插件。
示例
当我们在测试单次批量脚本测试的时候
##初始化脚本
sysbench /usr/share/sysbench/select_random_points.lua \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-port=5432 \
--pgsql-user=pgbench \
--pgsql-password=pgbench \
--pgsql-db=postgres \
--tables=10 \
--table-size=100000 \
prepare
##运行测试数据
sysbench /usr/share/sysbench/select_random_points.lua \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-port=5432 \
--pgsql-user=pgbench \
--pgsql-password=pgbench \
--pgsql-db=postgres \
--tables=10 \
--table-size=100000 \
--threads=8 \
--time=60 \
--report-interval=10 \
run
##清理测试数据
sysbench /usr/share/sysbench/select_random_points.lua \
--db-driver=pgsql \
--pgsql-host=localhost \
--pgsql-port=5432 \
--pgsql-user=pgbench \
--pgsql-password=pgbench \
--pgsql-db=postgres \
--tables=10 \
--table-size=100000 \
cleanup
sysbench 除了可以测试数据库的性能,还可以测试操作系统的性能
示例
1、测试IO性能
sysbench fileio --file-total-size=2G prepare # 准备测试文件
sysbench fileio --file-total-size=2G --file-test-mode=rndrw --time=60 --max-requests=0 run # 运行测试
–file-total-size=2G:设置总文件大小。
–file-test-mode=rndrw:设置文件测试模式,可以是 seqwr(顺序写)、seqrewr(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)和 rndrw(随机读/写)。
–time=60:设置测试持续时间。
–max-requests=0:设置最大请求数,0 表示无限制。
2、测试 CPU 性能。
sysbench cpu --cpu-max-prime=20000 run
–cpu-max-prime=20000:设置计算的最大质数。
3、测试内存性能。
sysbench memory --memory-block-size=1M --memory-total-size=10G run
–memory-block-size=1M:设置内存块大小。
–memory-total-size=10G:设置总内存大小。
4、测试线程子系统性能
sysbench threads --threads=4 --time=60 run
–threads=4:设置线程数。
–time=60:设置测试持续时间
5、测试互斥锁性能。
sysbench mutex --threads=4 --mutex-num=1024 --time=60 run
–threads=64:设置线程数。
–mutex-num=1024:设置互斥锁数量。
–time=60:设置测试持续时间。
当然以上的pgbench和sysbench 都是给予测试给出的平均值,和最大值、最小值。但是在整个运行过程中,性能的波动,也是需要观测到的。这里使用一个简化的工具NMON
yum install nmon -y
这是一款非常轻量化的系统监控工具,在安装完成后,还需要使用其自己的分析器Nmon Analyser,将采集的数据进行可视化展示。
Nmon Analyser下载地址
下载完Nmon Analyser后,里面会有两个文件,(一个说明书、一个excel的可视化分析器)、同时使用WPS还需要安装 一个宏插件
在操作系统的采集压测期间系统性能数据
nmon -f -s 1 -c 1200
-f 将数据生成CSV文件
-s 1 每一秒采集一次数据
-c 采集1200次,也就是20分钟
文件名称默认使用 hostname_年月日_启动时间
将生成的文件使用Nmon Analyser中excel文件进行打开。
注意在打开的时候,记得启用宏,然后点击Analyze nmon data 选择采集的数据文件
生的可视化文档会有以下几个sheet。
SYS_SUMM、AAA、BBBP、DISK_SUMM、CPU_ALL、CPU_SUMM、DISKBSIZE、DISKBUSY、DISKREAD、DISKWRITE、DISKXFER、JFSFILE、MEM、NET、NETPACKET
、PROC、VM、ZZZZ、CPU001、CPU002
根据可视化图标可以进行定位相关的性能瓶颈