300并发服务器mysql_解惑:为什么300的并发能把⽀持最⼤
连接数4000数据库压死?...
问: 为什么300的并发能把⽀持最⼤连接数4000数据库压死?
买了⼀台数据库,最⼤连接数的参数是 4000,看起来很棒!但是 cpu 和内存并不咋好!是 2c4g的超低配制。
但是想着反正业务量也不⼤,不如先扛着,等业务量上来再进⾏升配!
没过多久,进⾏⼀次⼩量的营销活动。粗略计算想了下,⼤约3-4台应⽤服务器就没问题了;然后再考虑下数据库,应该没有问题。
考虑到数据库没问题的原因有⼆:
1. 应⽤服务器数量少,对数据库压⼒不会太⼤;
2. 每个应⽤都设置了最⼤连接池限制,单台⼀般不会超过100的连接,与4000的并发连接指标还差很远;
mysql无法连接到服务器
活动开始后,开始⼀切都很正常,应⽤服务器监控正常,前端响应正常。以为⼀切尽在掌握之中,结果却是⼀场灾难!
前端页⾯响应越来越慢了,监控应⽤服务器却⼀点压⼒没上来!我知道是数据库出问题了!
于是,直接开了个db客户端查看情况,⾃⼰试着运⾏了直sql,响应的确很慢,但是也能⼏⼗秒内返回;所以我数粗浅的结论是,应⽤响应会很慢,但是应该能响应完整!
其实,我想错了。
其⼀,前端访问是有超时限制的,超过⼀段时间后,会⾃⾏断开连接,所以后端超级卡顿时,前端⽤户侧是会⽆法提供服务的!
其⼆,除去前端会有超时限制断开外,应⽤api也会在⼀段时间没有收到数据库响应后,超时断开返回,然⽽数据库对断开请求则可能收不到,从⽽继续保持操作运⾏;从⽽应⽤服务器会再次发起下⼀个请求,从⽽使连接超过应⽤设置的连接池⼤⼩,进⼀步挑战db极限;所以,前端仍然是不能正常服务的。
回到前⾯数据库问题,为什么在还远低于最⼤连接数的情况下,db就开始不⼯作了呢?
其实,db的运⾏指标,不⽌有最⼤连接数⼀个!cpu,内存,磁盘,⽹络 都是其运⾏指标,这些指标都会限制其能⼒!
第⼀层,磁盘io。
指标专业名词:IOPS;因为所有的数据都是存储在磁盘的,所以,在⾼并发的场景下,⼀定会受到磁盘能⼒的限制,普通磁盘 sata 可能只有7-10M/s 的能⼒,只要要求加载的数据远远⼤于这个速度,磁盘瓶颈就出来了。当然了,磁盘读取后,结果是会缓存到内存的,所以⼜和内存有关了!
第⼆层,内存。
磁盘读取出来的数据必定会放到内存进⾏数据运算处理,然后才能得到结果。内存的速度当然是特别快了,咱们不考虑它这⽅⾯的能⼒问题。但是,速度再快,没有内存空间就没办法了,就像上⾯的配置 4g 的内存其实稍微⼏个⼤点的数据查询,基本就装满了。⽽且,在⼀次查询完成后,还要负责将结果缓存起来。当内存运⾏不够的时候,cpu会进⾏磁盘的swap操作,将需要运算的数据换⼊内存,从⽽保证运算正常进⾏,但是这个操作就很慢了,从⽽导致正常的查询都变得缓慢起来。(索引会稍微好点,因其数据量⽐较⼩,内存swap概率也低)。所以,低配内存将是⼀⼤致命弱点,不要期望太⾼;
第三层,cpu。
英国constitution
其实整个过程的调度都是由cpu来运筹帷幄的。只是,cpu运算速度往往都会很快,所以我们把它稍微放后点!因为前⾯磁盘和内存,导致cpu会不停地运算操作。另外,由于外部请求⼤量涌⼊,导致cpu要进⾏多线程的维护,即会有⼤量上下⽂切换,这个切换增加了cpu压⼒,同时也使请求的响应变差,cpu也就越来越⾼,直到彪升到90+%,连操作系统的调度都很困难了。所以,只会雪上加霜地,降低请求的处理能⼒,从⽽导致db直接假死!可能只有重启才能解决问题了!
第四层,⽹络层。
⼀般来说,只要数据库和应⽤是部署在⼀个内⽹⾥,那么,⽹络⼀般不会限制能⼒(⾮绝对);但是对于⼀些远程数据库,就直接要⼩⼼了,⽐如⼀个数据包就是3M+,那么如果是 10Mb/s 的带宽,仅能传输3-4个数据包,从⽽使响应能⼒完全限死;所以,数据库⼀般需要部署内⽹机房,或者买云数据库时,最好在同⼀区。⽹络层⼀般我们可以忽略,但是要知道这⾥的原理!
最后,我们来讨论下,mysql中的最⼤连接数到底是什么?
1. 查看最⼤连接数
show variables like '%max_connections%'怎么把pycharm调成中文
2. 修改最⼤连接数
div滚动条滚动到一定距离后
set GLOBAL max_connections = 200;
那么,最⼤连接是什么原理呢?
⼀般对于处理快速的情况下,每个连接进来后,会从mysql的线程池中取出线程来处理任务。但是当线程不够⽤的时候,它会创建新的线程池来处理。
所以,并发连接数越⼤,则往往意味着mysql的线程会越多(不⼀定是⼀对⼀);线程越多意味着上下⽂切换将越频繁,cpu压⼒越⼤,服务器性能越差。所以,合理设置最⼤连接数,使服务器处于⾼效状态,是⼀个优化⽅向!
查看线程相关的状态变量:
SHOW STATUS LIKE 'Threads%';
那么问题来了,为什么阿⾥云上的rds设置了这么⾼的最⼤连接数呢?我估计,他是为了兼容最快速和最⼩数据量的并发连接情况,⽽设置的。⾃⼰可以压测下!
综上,四个指标。只要有⼀个成为瓶颈,其他指标也就失去了意义!
成人计算机编程培训学校language in use是什么意思
其实真正有过mysql调优经验的同学,深⼊理解过mysql,上⾯这些问题⾃然明⽩。⽽不明⽩的同学,则要多多实践才⾏!
⼀句话总结:纸上得来终觉浅,绝知此事要躬⾏!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论