单点网站压力测试调优-第1季
环境介绍
虚拟机配置
操作系统 Centos6-64位 (内核版本: Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux) CPU (英特尔)Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz(2601 MHz),虚拟单核 主板 联想 23442G1 内存 1.00 GB (1600 MHz) 主硬盘 20 GB 网卡 Intel(R) 82579LM Gigabit Network Connection
软件
JDK版本:
java –version
java version "1.6.0_45" Java(TM) SE Runtime Environment (build 1.6.0_45-b06) Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
Tomcat版本:
Apache Tomcat/7.0.50 |
Mysql版本(编译好的解压缩版本):
mysql-5.6.15-linux-glibc2.5-x86_64 |
测试工具:JMeter
应用:Story网站
使用框架
Jquery+Fastjson1.1.38+Spring MVC3+Spring Core3+Hibernate4+C3P0 |
新闻贴子初始数据量(1w)
测试功能:
分散浏览分页浏览新闻(按页分散,每页15条记录)
分散浏览单条新闻(按id随机分散,每条记录约1kb信息)
并发更新新闻 (按id随机分散,行锁定)
并发插入新闻(id随数据库生成自增,暂不考虑分布式横向sharding)
要解决的问题:
如何分散浏览?
使用jmeter的随机函数,打开jmeter后,点击“选项”->“函数助手对话框”->弹出对话框,选择“__Random”函数,第一个参数是随机数最小值,第二个参数是随机数最大值,第三个参数是压力测试中随机函数的函数名称。之后点击生成,
如图:
则形成如下表达式:
${__Random(1,10,ram)} |
之后可以在压力测试中有随机数的地方使用它了。
一切都是默认配置,发起压力测试
JVM、tomcat 连接参数、mysql、程序配置、操作系统等等皆为默认配置,测试用例功能性能。暂时不开启远程JMX监控端口,出现问题后,在开启JMX监控之。
Mysql默认配置如下
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M log-bin=mysql-bin binlog_format=mixed server-id = 1 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
程序连接池配置入下
jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8 jdbc.user =root jdbc.password=111111 jdbc.miniPoolSize=10 jdbc.maxPoolSize=80 jdbc.initialPoolSize=10 jdbc.maxIdleTime = 120000 jdbc.acquireIncrement=10 jdbc.acquireRetryAttempts = 30 jdbc.acquireRetryDelay=60000 jdbc.testConnectionOnCheckin = true jdbc.automaticTestTable = test jdbc.idleConnectionTestPeriod = 15000 jdbc.checkoutTimeout=60000
2.1分散浏览帖子
并发100,准备时间1s
测试报告如下:
预热环境,稳定下来后的吞吐量如图
平均数值如下
吞吐量TPS基本维持在29~31之间。
并发200,准备时间1s
走势图
吞吐量报告
TPS基本也是维持在29~32之间。
并发500,准备时间1s,让它产生少量的等待请求
第一次发起,出现过多的错误,出现在http连接超时、数据库连接超时、数据库连接不够用、http response返回信息错误等等现象。
经过第一次的预热,第二次发起
走势图如下
吞吐量报告
短间隔内(一些对象池都没有回收的情况下),连续发起请求,TPS基本维持在29~31左右
下次发起1000并发调优~(未完待续)
记录,自我总结文档的第5页