解惑:为什么300的并发能把支持最大连接数4000数据库压死?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 问: 为什么300的并发能把支持最大连接数4000数据库压死? 买了一台数据库,最大连接数的参数是 4000,看起来很棒!但是 cpu 和内存并不咋好!是 2c4g的超低配制。 但是想着反正业务量也不大,不如先扛着,等业务量上来再进行升配! 没过多久,进行一次小量的营销活动。

问: 为什么300的并发能把支持最大连接数4000数据库压死?

 买了一台数据库,最大连接数的参数是 4000,看起来很棒!但是 cpu 和内存并不咋好!是 2c4g的超低配制。

 但是想着反正业务量也不大,不如先扛着,等业务量上来再进行升配!
 没过多久,进行一次小量的营销活动。精力计算想了下,大量3-4台应用服务器就没问题了;然后再考虑下数据库,应该没有问题。

考虑到数据库没问题的原因有二:

  1. 应用服务器数量少,对数据库压力不会太大;

  2. 每个应用都设置了最大连接池限制,单台一般不会100的连接,与4000的并发连接指标还很远;

活动开始后,开始一切都很正常,应用服务器监控正常,前端响应正常。以为一切尽在掌握之中,结果却是一场灾难!

  前端页面响应越来越慢了,监控应用服务器却一点压力没上来!我知道是数据库出问题了!
 于是,直接开了个db客户端查看情况,自己试着运行了直sql,响应的确很慢,但是也能几十秒内返回;所以我数粗浅的结论是,应用响应会很慢,但是应该能响应完整!
  其实,我想错了。前端访问是有超时限制的,超过一段时间后,会自行断开连接,所以后端超级卡顿时,前端用户侧是会无法提供服务的!

  其二,除去前端会有超时限制断开外,应用api也会在一段时间没有收到数据库响应后,超时断开返回,然而数据库对断开请求则可能收不到,从而继续保持操作运行;从而应用服务器会再次发起下一个请求,从而使连接超过应用设置的连接池大小,进一步挑战db极限;所以,前端仍然是不能正常服务的。

回到前面数据库问题,为什么在还远低于最大连接数的情况下,db就开始不工作了呢?

其实,db的运行指标,不止有最大连接数一个!cpu,内存,磁盘,网络 都是其运行指标,这些指标都会限制其能力!

第一层,磁盘io。

  因为所有的数据都是存储在磁盘的,所以,在高并发的场景下,一定会受到磁盘能力的限制,普通磁盘 sata 可能只有7-10M/s 的能力,只要要求加载的数据远远大于这个速度,磁盘瓶颈就出来了。当然了,磁盘读取后,结果是会缓存到内存的,所以又和内存有关了!

第二层,内存。

  磁盘读取出来的数据必定会放到内存进行数据运算处理,然后才能得到结果。内存的速度当然是特别快了,咱们不考虑它这方面的能力问题。但是,速度再快,没有内存空间就没办法了,就像上面的配置 4g 的内存其实稍微几个大点的数据查询,基于就装满了。而且,在一次查询完成后,还要负责将结果缓存起来。当内存运行不够的时候,cpu会进行磁盘的swap操作,将需要运算的数据换入内存,从而保证运算正常进行,但是这个操作就很慢了,从而导致正常的查询都变得缓慢起来。(索引会稍微好点,因其数据量比较小,内存swap概率也低)。 所以,低配内存将是一大致命弱点,不要期望太高;

第三层,cpu。

  其实整个过程的调度都是由cpu来运筹帷幄的。只是,cpu运算速度往往都会很快,所以我们把它稍微放后点!因为前面磁盘和内存,导致cpu会不停地运算操作。另外,由于外部请求大量涌入,导致cpu要进行多线程的维护,即会有量上下文切换,这个切换增加了cpu压力,同时也使请求的响应变差,cpu也就越来越高,直到彪升到90+%,连操作系统的调度都很困难了。所以,只会雪上加霜地,降低请求的处理能力,从而导致db直接假死!可能只有重启才能解决问题了!

第四层,网络层。

  一般来说,只是数据库和应用是部署在一个内网里,那么,网络一般不会限制能力(非绝对);但是对于一些远程数据库,就直接要小心了,比如一个数据包就是3M+,那么如果是 10Mb/s 的带宽,仅能传输3-4个数据包,从而使响应能力完全限死;所以,数据库一般需要部署内网机房,或者买云数据库时,最好在同一区。网络层一般我们可以忽略,但是要知道这里的原理!

最后,我们来讨论下,mysql中的最大连接数到底是什么?

  1. 查看最大连接数

    show variables like '%max_connections%'

  2. 修改最大连接数

    set GLOBAL max_connections = 200;

那么,最大连接是什么原理呢?

  一般对于处理快速的情况下,每个连接进来后,会从mysql的线程池中取出线程来处理任务。但是当线程不够用的时候,它会创建新的线程池来处理。

 所以,并发连接数越大,则往往意味着mysql的线程会越多(不一定是一对一);线程越多意味着上下文切换将越频繁,cpu压力越大,服务器性能越差。所以,合理设置最大连接数,使服务器处于高效状态,是一个优化方向!

查看线程相关的状态变量:

  SHOW STATUS LIKE 'Threads%';

那么问题来了,为什么阿里云上的rds设置了这么高的最大连接数呢?我估计,他是为了直率最快速和最小数据量的并发连接情况,而设置的。自己可以压测下!

综上,四个指标。只要有一个成为瓶颈,其他指标也就失去了意义!

其实真正有过mysql调优经验的同学,深入理解过mysql,上面这些问题自然明白。而不明白的同学,则要多多实践才行!

一句话总结:纸上得来终觉浅,绝知此事要躬行!
原文地址https://www.cnblogs.com/yougewe/p/10576021.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
151 3
|
21天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
120 68
|
16天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
31 3
|
16天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
37 2
|
23天前
|
关系型数据库 MySQL 数据库连接
DBeaver如何连接一个数据库
【10月更文挑战第27天】DBeaver 是一款功能强大的通用数据库管理工具,支持多种主流数据库。本文介绍了使用 DBeaver 连接数据库的基本步骤,包括下载安装、创建新连接、选择数据库类型、配置连接参数、测试连接以及最终连接到数据库。详细的操作指南帮助用户轻松管理和操作数据库。
118 9
|
16天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
16天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
32 1
|
25天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
84 5
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
66 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库