<b>1 前言</b>
每种测试工具都有其优点和缺点,本次测试将采用两种工具进行测试数据库部分,借助软件本身提供的方法进行测试,没有对特殊的业务进行逻辑测试。本次测试并不太关注业务表现的等待和性能问题,重点在于数据库运行在云主机所能承受的压力,以及cpu、内存、磁盘在压力期间的性能数据,业务测试返回的tps、iops、rt等数据,以求对oracle运行在云主机提供参考。
<b>2 测试工具</b>
1、sysbench,是一款开源的多线程性能测试工具,可以执行cpu/内存/线程/io/数据库等方面的性能测试。数据库目前支持mysql/oracle/postgresql。sysbench对于绑定变量的支持存在bug,但它的脚本都是lua语言写的,完全可以自行设计和定制业务逻辑进行测试。
安装方法见《附录9.1》
2、swingbench,是oracle uk的一个员工在一个被抛弃的项目的基础上开发的。swingbench可 以执行4种不同的标准测试(benchmark),拥有三种前端展示方式。swingbench的开发目的主要是用来展示rac的负载和测试,但也可用于单实例环境。
安装方法见《附录9.2》
两种方法均在测试机上作为客户端对数据库进行压力测试。
<b>3 测试环境</b>
测试阿里ecs+ssd+oracle的运行情况。
服务器端配置

<b></b>
<b>4 测试方法</b>
oracle redolog 建议和数据盘分开,本次测试将测试redolog和数据分开存放为主,并测试redolog和数据在同一磁盘的一组数据作为对比。因为表的数量少并发数越大,造成竞争和冲突率就大幅度上升,测试有随机性,因此数据并不能准确反映应用的具体情况,具体应用上线前建议根据业务逻辑设计lua脚本或者swingbench测试程序。
1、sysbench
sysbench数据量初始化10张表,每张表100万条数据,每次测试最大访问条目是1000万,随机进行oltp的读写更新和删除,并发数据为50、100、200、300、400、500并发值。
2、swingbench
swingbench也是通过脚本建立测试数据库,相比sysbench比较全面,从表空间、schema soe是一套订单业务逻辑,同时可以设置并发连接的登陆属性—长连接还是短连接。同样,也进行50、100、200、300、400、500并发值测试。
<b>5 sysbench进行os基准测试</b>
1、 cpu,通过计算最大素数的方式查看cpu的计算速度
/home/oracle/sysbench-0.5/sysbench/sysbench_ora --test=cpu --cpu-max-prime=20000 run
total time: 36.4537s
2、 内存,测试内存的吞吐率
/home/oracle/sysbench-0.5/sysbench/sysbench --test=memory --num-threads=16 --memory-block-size=8192 --memory-total-size=1g run
----------------------------------------------
1024.00 mb transferred (2762.18 mb/sec)
3、 磁盘io,测试iops和吞吐率。
/u01 数据盘
/home/oracle/sysbench-0.5/sysbench/sysbench --test=fileio --num-threads=16 --init-rng=on --file-total-size=5g --file-test-mode=rndrw run
---------------------------------------------------------------------
5368709120 bytes written in 63.74 seconds (80.33 mb/sec).
read 93.734mb written 62.516mb total transferred 156.25mb (31.643mb/sec)
/u02 redolog
-------------------------------------------------------------------
5368709120 bytes written in 96.23 seconds (53.20 mb/sec).
read 93.812mb written 62.438mb total transferred 156.25mb (24.582mb/sec) 1573.25 requests/sec executed
<b>6 测试一:sysbench 对oracle进行压测</b>
6.1 准备数据
./sysbench_ora --test=/home/oracle/sysbench/tests/db/lua/oltp.lua \
--db-driver=oracle \
--oltp-table-name=sysbench \
--oltp-table-size=1000000 \ <<<每张表规格100万行
--oltp-tables-count=10 \ <<<共10张表
--oracle-db=oradb \ <<<这是tns的配置,slb负载的tns是oradbslb
--oracle-user=sysbench \
--oracle-password=xxxx \
--max-time=900 \ <<<测试时长
--max-requests=10000000 \<<<最大访问1000万行
--num-threads=40 \
--report-interval=10 \
prepare
<b>6.2 压测</b>
--压测语法
--oltp-table-size=1000000 \
--oltp-tables-count=10 \
--oracle-db=oradb \
--max-time=900 \
--max-requests=10000000 \
run
--/50并发
transactions: 204610 (227.32 per sec.)
read/write requests: 3682980 (4091.84 per sec.)
response time:
min: 24.70ms
avg: 175.88ms
max: 1070.85ms
approx. 95 percentile: 256.37ms
--/100并发
transactions: 800926 (222.47 per sec.)
read/write requests: 14416668 (4004.41 per sec.)
min: 20.03ms
avg: 359.54ms
max: 1766.33ms
approx. 95 percentile: 543.96ms
--/200并发
transactions: 115286 (192.01 per sec.)
read/write requests: 2075148 (3456.25 per sec.)
min: 84.64ms
avg: 831.56ms
max: 2552.42ms
approx. 95 percentile: 1261.25ms
--/300并发
transactions: 121441 (202.12 per sec.)
read/write requests: 2185938 (3638.24 per sec.)
min: 19.48ms
avg: 1573.34ms
max: 5466.92ms
approx. 95 percentile: 2504.40ms
--/400并发
transactions: 121441 (207.12 per sec.)
approx. 95 percentile: 2810.40ms
--/500并发
由于oltp.lua脚本表少并发太多对象争用太明显,测试执行失败,但我们看到iops、tps数值稳定,rt跟线程多少有关。
7 测试二:swingbench对oracle进行压力测试
swingbench 通过建立soe用户,模拟产品、订单业务,可以自定义数据量大小,本次测试生成10g左右的数据文件。
--/并发50
--/并发100
此时产生了大量的log file sync和log file switch (checkpoint incomplete),redolog现在是6组256m,由于commit频繁,调整为512m,9组。
--/并发200
此时测试一组redolog和数据在同一磁盘的情形
可以看到cpu的io wait 比redo分开存放时明显上升。
现在修改一下swingbench的读写权重,提高读的比例,并发依然是200
磁盘io达到27m/s,tps达到1839
--/并发300
--/并发400
--/并发500
<b>8 评测结果</b>
8.1 sysbench的测试总结
sysbench:iops
swingbench的测试效果要比sysbench的好,sysbench适合自定义业务逻辑和编辑lua脚本。但sysbench的测试结果也有一些参考:
1、 redolog和和数据分开存放,从磁盘io的截图可以看到reodlog所在的磁盘(dev252-16/dev/vdb1)tps非常高,放在数据盘势必互相影响。
2、 对于批量小io的oltp业务,业务的频繁访问特性必须从业务逻辑设计上保证其性能,其次才是主机性能、数据库性能方面的优化配合。
<b>8.2 swingbench的测试总结</b>
swingbench:
同时收集了awr报告的数据
并发 逻辑读/秒
1、 iops在25000左右对于读写混合模式是一个理想值,只读时能达到50000以上。
2、 cpu成为oltp环境的瓶颈,在400并发时性能严重不足,这时应考虑添加cpu计算能力
3、 高并发环境redo和数据文件的io都比较大,redolog同步和切换又影响数据的访问和变化,因此redolog和数据文件分开存放,而且redolod更需要快速读写的磁盘。通过swingbench的数据可以看到,磁盘io压力全集中在一个磁盘,而且iops明显上升,tps下降,响应时间增加,cpu等待也增高。
<b>8.3 评测总结</b>
结合以上的数据库性能表现以及云上oracle压测数据来看,云主机的性能根据业务场景进行选择,中配可以支持300以内的并发,如图:指标折线图,随着并发的增长,iops、cpu、tps会达到一个峰值,此时就是提升性能的时候。
redolog和数据库盘建议分开,同时配置ha方案,可选adg(active dataguard 实时同步并可以支持查询)通过业务指定部分查询到dataguard的只读节点,分散压力。
建议进行实际业务模拟测试,以观察业务在云上的表现,对ecs的选型和oracle架构进行评估。
参考《附录 9.3 ecs官方性能指标》
指标折线图
<b>9 附录</b>
<b>9.1 sysbench的安装</b>
版本:0.5
测试方法:oltp、lua
root用户安
$export oracle_home=/u01/app/oracle/product/11.2.0/dbhome_1
$./autogen.sh
$./configure --with-oracle --without-mysql --without-drizzle
$make ora_libs="-l$oracle_home/lib -lclntsh" ora_cflags="-i$oracle_home/rdbms/demo -i$oracle_home/rdbms/public"
$make install
<b>9.2 swingbench的安装</b>
其安装介质下载地址:
http://www.dominicgiles.com/swingbench.html
安装方式:
1. 确保服务器上安装配置了jdk1.6以上
2. 下载swingbench,解压即可
<b>9.3 ecs官方性能指标</b>
cpu系列 i 高配是16核64g,系列ii 可以达到32核 128g。
ssd云盘4kb i/o块大小时随机读写iops高达12000、512kb i/o块大小时顺序读写吞吐量高达300mb。