Mysql连接数设置和获取的方法
获取连接数
---获取最大连接数 SHOWVARIABLESLIKE'%max_connections%'; ---获取连接列表 SHOWPROCESSLIST; ---获取连接列表 SHOWFULLPROCESSLIST; ---获取当前的链接信息Threads_connected是当前的连接数 SHOWSTATUSLIKE'Threads%'; ---获取连接统计比如历史最大连接数以及最大连接时长等 SHOWSTATUSLIKE'%Connection%';
mysql>SHOWSTATUSLIKE'Threads%'; +-------------------+-------+ |Variable_name|Value| +-------------------+-------+ |Threads_cached|58| |Threads_connected|57|---这个数值指的是打开的连接数 |Threads_created|3676| |Threads_running|4|---这个数值指的是激活的连接数,这个数值一般远低于connected数值 +-------------------+-------+
Threads_connected跟showprocesslist结果相同,表示当前连接数。准确的来说,Threads_running是代表当前并发数
设置连接数
临时设置
mysql>showvariableslike'max_connections';---查可以看当前的最大连接数 msyql>setglobalmax_connections=1000;---设置最大连接数为1000,可以再次查看是否设置成功 mysql>exit---退出
永久设置
可以在/etc/my.cnf里面设置数据库的最大连接数
[mysqld] max_connections=1000
项目中连接池设置
下面公式由PostgreSQL提供,不过底层原理是不变的,它适用于市面上绝大部分数据库产品。还有,你应该模拟预期的访问量,并通过下面的公式先设置一个偏合理的值,然后在实际的测试中,通过微调,来寻找最合适的连接数大小。
连接数=((核心数*2)+有效磁盘数)
核心数不应包含超线程(hyperthread),即使打开了超线程也是如此,如果热点数据全被缓存了,那么有效磁盘数实际是0,随着缓存命中率的下降,有效磁盘数也逐渐趋近于实际的磁盘数。另外需要注意,这一公式作用于SSD的效果如何,尚未明了。
好了,按照这个公式,如果说你的服务器CPU是4核i7的,连接池大小应该为((4*2)+1)=9。
取个整,我们就设置为10吧。你这个行不行啊?10也太小了吧!
你要是觉得不太行的话,可以跑个性能测试看看,我们可以保证,它能轻松支撑3000用户以6000TPS的速率并发执行简单查询的场景。你还可以将连接池大小超过10,那时,你会看到响应时长开始增加,TPS开始下降。
你需要的是一个小连接池,和一个等待连接的线程队列
假设说你有10000个并发访问,而你设置了连接池大小为10000,你怕是石乐志哦。
改成1000,太高?改成100?还是太多了。
你仅仅需要一个大小为10数据库连接池,然后让剩下的业务线程都在队列里等待就可以了。
连接池中的连接数量大小应该设置成:数据库能够有效同时进行的查询任务数(通常情况下来说不会高于2*CPU核心数)。
你应该经常会看到一些用户量不是很大的web应用中,为应付大约十来个的并发,却将数据库连接池设置成100,200的情况。请不要过度配置您的数据库连接池的大小。
是不是越大约好
模拟9600个并发线程来操作数据库,每两次数据库操作之间sleep550ms,注意,视频中刚开始设置的线程池大小为2048。
让我们来看看数据库连接池的大小为2048性能测试结果的鬼样子:
每个请求要在连接池队列里等待33ms,获得连接之后,执行SQL需要耗时77ms,CPU消耗维持在95%左右;
接下来,我们将连接池的大小改小点,设置成1024,其他测试参数不变,结果咋样?
“这里,获取连接等待时长基本不变,但是SQL的执行耗时降低了!”
哎呦,有长进哦!
接下来,我们再设置小些,连接池的大小降低到96,并发数等其他参数不变,看看结果如何:
每个请求在连接池队列中的平均等待时间为1ms,SQL执行耗时为2ms.
我去!什么鬼?
我们没调整任何东西,仅仅只是将数据库连接池的大小降低了,这样,就能把之前平均100ms响应时间缩短到了3ms。吞吐量指数级上升啊!
你这也太溜了!
为啥有这种效果?
我们不妨想一下,为啥Nginx内部仅仅使用了4个线程,其性能就大大超越了100个进程的ApacheHTTPD呢?追究其原因的话,回想一下计算机科学的基础知识,答案其实非常明显。
要知道,即使是单核CPU的计算机也能“同时”运行着数百个线程。但我们其实都知道,这只不过是操作系统快速切换时间片,跟我们玩的一个小把戏罢了。
一核CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU核心快速调度,执行另一个线程的代码,不停反复,给我们造成了所有进程同时运行假象。
其实,在一核CPU的机器上,顺序执行A和B永远比通过时间分片切换“同时”执行A和B要快,其中原因,学过操作系统这门课程的童鞋应该很清楚。一旦线程的数量超过了CPU核心的数量,再增加线程数系统就只会更慢,而不是更快,因为这里涉及到上下文切换耗费的额外的性能。
说到这里,应该恍然大悟了……
以上就是Mysql连接数设置和获取的方法的详细内容,更多关于Mysql连接数设置和获取的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。