我一直以来,对性能测试中,连接池的大小要如何配置,不是太清楚;

就我所知道的,就DB自带对连接数的限制,在sqlserver中用select @@connection 可以查到,

在代码中,可以配置DB的连接池,

在中间件中,可以配置最大的线程数等等。

在性能测试中,这些配置显然很重要,要不然,木桶原理,哪一个低了,都是个性能瓶颈,在其他地方再怎么费力,也无能为力。

今天做了一个实验,不考虑中间件,不去考虑代码逻辑啊,接口调用什么的,只考虑数据库连接池,和实际并发数的影响。

工具也很简单,就用Jmeter中元件JDBC Connection Configuration配置DB连接数,再在JDBC请求中向表中新增一条记录。新增不像查询的,不会因为数据量的多少受影响。

因为线程数是受系统的用户数决定的,所以要分析受众数量,
可以通过以往的日志分析,一般系统中都会记录用户在何时,何种渠道,登录了,退出了,修改了,等等,总之是这样的交互表
通过分解,高峰时间段,以半小时,或每小时计算,每秒钟的最大用户数
也可以通过社会工程学,并叫上算法分析师,分析和计算出高峰期用户数量

还有一些是活动Campaign, 一段时间内的大促活动,比如双十一支付宝支付接口,比如商场活动促销,抢拍,秒杀,等等,
看看每秒钟的用户数量,能否大概掌握和预估一定的值;
比如我们这边,大促之前会通过短信或者微信的方式,通知我们的会员,在xxx链接领取优惠券,xxx时间可以积分兑换更多好礼,在xxx时候购买充值会员卡等等
分析有无裂变的方式,会引来更多会员,一般不太好控制,或者会故意将通知会员的速度调节慢些;
不可裂变,即用户即使转发链接给好友,好友不支持参与活动,这个时候,单位时间内能预估的会员就比较清楚。

分析活动短信或微信的转化率,即有百分之多少的会员,能够在收到通知后,立即点击链接来参与活动。
通常会有一个比例,但也有可能因为活动力度问题,比例不太一致。
总之,为了系统能文件运营,要用预估的峰值去跑。

而数据库的线程池: 可以根据预估的峰值,参考之后进行设置。

线程池的原理:

其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:
先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,
当处理完这个请求后,线程又处于睡眠状态。

可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?
这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题?
那就是性能!

就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,
如果为每个客户端请求创建一个新线程的话,
那耗费的CPU时间和内存将是惊人的,
如果采用一个拥有200个线程的线程池,
那将会节约大量的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,
而不是频繁的线程创建与销毁。

先看以下图:

图中两次压测,并发数一样,数据库连接池不一样,上一个是10,下面的一个是100,并发数都是100,连接池大的时候,吞吐量要大很多。

并且由于并发数大于连接池,导致上面的错误率很高,大多数的错误原因是:

Cannot get a connection, pool error Timeout waiting for idle object

实验的结果

从第一次到第四次结果来看

当DB的最大连接数:当并发数<=最大链接数的时候,且启动时间慢,相当于请求来了,就能处理。
此时相等时间内的总请求数相近,吞吐量彼此相近。

当DB的最大链接> 当前并发数,且启动时间慢,
此时相等时间内的总请求数相近,吞吐量彼此相近。

一般来讲,现在都是前后端分离的系统,面向的是全网的受众,
我觉得启动时间,设置为1,比较合适;

当然,我这边没有去监控MySQL所在机器的CPU和内存情况。
第九次和第十次的结果也可以看出,并发数如果大于了DB连接数,
相同时间内,第九次的处理的总的请求数明显大于第十次,吞吐量自然也高;
第十次吞吐量比第九次低了很多,且错误率达到7%,错误原因是:
不需要总是不停的去进行上下文切换,

第6次的失败原因:

Cannot create PoolableConnectionFactory (Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)

MySQL 并发测试中,线程数和数据库连接池的实验的更多相关文章

  1. 聊下并发和Tomcat线程数(错误更正)

    本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...

  2. 浅谈并发和tomcat线程数

    假设Tomcat每到固定一个时间会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下 & ...

  3. 【转】关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念

    关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念 笔者是个刚刚踏入压力测试领域不到2个月的小菜,这里分享一下线程组中3个参数之间关系的个人见解,不喜请!喷!,望大家 ...

  4. 关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念

    关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念 笔者是个刚刚踏入压力测试领域不到2个月的小菜,这里分享一下线程组中3个参数之间关系的个人见解,不喜请!喷!,望大家 ...

  5. 并发和Tomcat线程数

    转自 http://zhanjindong.com 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多 ...

  6. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  7. mysql 并发测试

    针对上一节做一些针对公司业务的测试. 我们来做一些压力测试. 服务器配置: 操作系统: centos 5.6-64 CPU: 8核 内存: 8G 硬盘:sas 文件系统:linux MySQL:5.6 ...

  8. 聊下并发和Tomcat线程数(Updated)

    最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是 ...

  9. Java并发编程中线程池源码分析及使用

    当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnb ...

随机推荐

  1. window JNI_CreateJavaVM启动java程序

    https://blog.csdn.net/earbao/article/details/51889605 #define _CRT_SECURE_NO_WARNINGS 1       #inclu ...

  2. mycat水平分表

    和垂直分库不同,水平分表,是将那些io频繁,且数据量大的表进行水平切分. 基本的配置和垂直分库一样,我们需要改的就是我们的 schema.xml和rule.xml文件配置(server.xml不用做任 ...

  3. EDK II之DXE Core的事件管理

    本文简单介绍一下UEFI中的事件管理: UEFI是不支持多进程的,但是UEFI支持多事件分发机制.UEFI只支持时钟中断,并基于时钟中断实现事件分发.类似于OS中基于时钟中断来实现基于时间片的多任务调 ...

  4. maven执行单元测试失败后,继续生成Jacoco&Sonar报告

    为保证生成单元测试覆盖 sonarqube或者jacoco与maven集成时,如果pom文件配置了sonarqube或者Jacoco的相关配置, 那么在pom文件所在目录执行mvn clean ins ...

  5. 【题解】Luogu P1972 [SDOI2009]HH的项链

    原题传送门 莫队入门题 我博客里对莫队的介绍 很多人说这题卡莫队,但窝随便写了一个程序就过了qaq(虽说开了氧化) 我们在排序询问时,普通是这样qaq inline bool cmp(register ...

  6. python简说(二十五)面向对象

    面向对象编程: 类 一个种类.一个模型 实例.实例化.对象 实例.对象: 根据模型制作出来的东西. 实例化: 就是做东西的这个过程. class My: my=My() 私有 方法 类里面的函数 属性 ...

  7. Python3 tkinter基础 Label justify 多行字符串左对齐

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Python 处理 CSV/EXCEL 表格文件

    只想说,数据挖掘工作,80%时间都花在处理数据上了,这句话真不假! 最近和小伙伴组了个队参加数据分析比赛,记录下我处理 csv 文件的一些步骤吧: 修改csv文件 可以用csv模块1,官方文档2 im ...

  9. 百度地图bd map使用方法

    一个经验:(当项目中的方法, 很多的时候, 相互调用的时候) 可以在script中, 先定义, 注意是定义, 一个"入口"函数, function initMap(), 然后, 让 ...

  10. 0-1背包dp|波动数列|2014年蓝桥杯A组10-fishers

    标题:波动数列 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a ...