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

就我所知道的,就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. oracle之存储过程和存储函数的使用和区别

    #存储过程:封装在服务器上一段sql片段,已经编译好了的代码. 1.客户端调存储过程,执行效率就会非常高效. 语法: create [or replace] procedure 存储过程名称 (参数名 ...

  2. kivy 小demo

    from kivy.lang.builder import Builder from kivy.uix.boxlayout import BoxLayout from kivy.app import ...

  3. uwsgi xml 配置

    uwsgi 用来做nginx和应用之间的桥梁,负责接收nginx动态转发过来的用户请求,其配置方式有多种,我一般选择<xml>标签的形式 下面的这些配置仅限于ubuntu下用apt-get ...

  4. 使用v-for指令渲染列表

    v-for:对集合或对象进行遍历: 使用v-for对数组遍历时: 效果如下: 代码: <script> window.onload= () =>{new Vue({ el:'#two ...

  5. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  6. 【Python54.1--豆瓣登录】

    1.模拟豆瓣登录 ''' |-- 代码解析: |-- 1.登录必须具备的条件:url,cookie,fromData fromData的参数如下: source: index_nav form_ema ...

  7. if语句学习

    #print("您好,我叫周星驰") ''' x=1+2+3 print(x*4) print(x**x) a=input("请输入相应的数字a") a=int ...

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

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

  9. CF1131D tarjan,拓扑

    题目链接 541div2 http://codeforces.com/contest/1131/problem/D 思路 给出n序列和m序列的相对大小关系 构造出最大值最小的序列 缩点+拓扑 小的向大 ...

  10. 深入了解JVW

    Java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时 ...