- 前面搭建的测试环境linux+Servlet+mysql+tomcat都是采用的默认设置
先介绍一个在linux服务器下,批量kill掉mysql连接数的方法。
1)vi kill.sh 复制下面的代码进去
2)chmod 700 kill.sh
3)./kill.sh
#!/bin/bash
for id in `mysql -hlocalhost -uroot -e"show processlist;"|awk '{print $1}'`
do
echo $id
mysql -hlocalhost -uroot -e"kill $id"
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 单个用户无限次数运行
1)使用mysql的命令:show process命令可以看到mysql的连接数不断增加和释放。这是mysql的内部机制。释放不用的连接数,接入新的连接
大部分是在sleep状态
(https://img-blog.youkuaiyun.com/20160406163257343)
2)使用linux网络监控命令查看链接到tomcat服务器的连接数量
netstat -an|grep 8090
可以看到当用户连接服务器进行操作时,只会创建一个tcp连接,但是因为程序的原因,每次注册都会去连接数据库,所以数据库的连接数不断的增大。
增
- 加并发到10
监控连接结果如下
[root@localhost Desktop]# netstat -an|grep 8090|wc -l
20
[root@localhost Desktop]# netstat -an|grep 3306|wc -l
3229
可以看到数据库的连接数非常的大,而tomcat的连接数是20个
- 并发数量到达60的时候
从这可以看出来,错误率不断增加,说明系统不能支持60个用户并发。
但是分析一下,看到LoginServlet的错误率为零。可以知道tomcat的响应和连接没有问题,那么可以定位瓶颈是在程序与数据库的连接。
同样我使用navicat去连接mysql数据库,发现连接不上了提示too many connections
可以知道数据库的连接数已经超标了
- 优化1:扩大mysql的数据库连接数:
使用sql命令:
1)查看到数据库的最大连接数是150
show variables like ‘%max_connections%’;
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2)扩大连接数
修改最大连接数
方法一:修改配置文件。推荐方法一
进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MySQL即可.
方法二:命令行修改。不推荐方法二
命令行登录MySQL后。设置新的MySQL最大连接数为200:
MySQL> set global max_connections=200。
这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改
我测试就先采用第二种方式
修改后查询
mysql> set global max_connections=400;
Query OK, 0 rows affected
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 400 |
+-----------------+-------+
1 row in set
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
再使用60个用户进行并发测试,测试前先kill掉以前的连接。就不等mysql去释放了
- 优化后再测试
这时再使用show processlist;查看到的连接数已经达到350 明显大于前面默认的150的最大连接数。再看看测试结果,错误率已经明显降下来了:
我后面再把连接数该到600 错误消失。
总结:
通过增加用户并发数,定位和分析得出数据库连接数配置瓶颈,通过增加mysql数据库连接数,再进行测试,错误消失,性能得到优化。
几分钟完成了1.8W用户的注册
mysql> select count(*) from test.userinfo
-> ;
+----------+
| count(*) |
+----------+
| 18721 |
+----------+
1 row in set
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
jmeter连接mysql数据库失败的错误响应代码:
eport</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b></p><pre>java.lang.NullPointerException