首页 > 数据库 >POSTGRESQL 和 MYSQL 到底应该不应该控制活跃连接

POSTGRESQL 和 MYSQL 到底应该不应该控制活跃连接

时间:2023-06-22 12:04:23浏览次数:58  
标签:POSTGRESQL max 数据库 线程 MYSQL 进程 应该 连接


POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_java

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。

最近群里某个同学的提问,引起的本篇文章,关于数据库连接的部分,没有废话,我们先针对MYSQL 来说说数据库连接的部分。

首先MYSQL 的客户连接方式是通过线程的方式来进行客户和数据库之间的连接,在连接被使用的过程中,会出现活跃连接和idel连接,我们称之为空闲连接。

这里我们假设客户的连接是通过  libmysqlclient 连接到我们的MYSQL中的通过我们最常用的TCP/IP的协议方式通过3306端口,而在接受到连接手,MYSQL通过我们的队列形势,我们可以称之为接收队列来将我们客户发来的请求进行排队。

这里的一个关键是线程的缓存,缓存中会存在已经创建好的线程,如果发现当前的线程并不足以满足客户的需求,则会开启新的线程给新的来访者进行数据库的访问。那么控制来访者与线程缓存之间存在一个复用的关系,第一个问题在mysql 中thread cache 可以缓存多少线程满足用户的访问。

公式为:8 + (max_connections/100) = thread_cache_size

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_postgresql_02

举例你的系统最大知识2000个连接(不是并发连接是最大连接),那么你的thread_cache_size = 8 + (2000/100) = 208

实际上也就是在变相的告诉使用者,我最大可以缓存的连接数复用的是208。实际上如果你的一半的主机配置(8C 32 是无法达到这个最大活跃连接数的,一半以我们测试的经验这个配置的机器 60的并发连接数据已经是一个较高的值了,在超过这个值你的MYSQL很可能出现无法响应的问题)

在我们的使用中瞬时连接在30以内属于性能良好的范畴(因人而异,不是一个标准值是一个经验值,具体你的系统是多少,这个你自己的去摸索和评估)

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_java_03

而在MYSQL的每个线程连接中有一个THD 的部分,这个部分是你在创建这个线程时共同创建出来的,这个部分就是收集你这个连接的状态信息的部分,代码在 sql_class.h 中,这个部分的内存会随着连接的时间而增长,有的时候每个连接的占用的内存可能会达到10MB。这里存储着你的线程在处理任务中的事务执行中的上下文,事务的状态会话中的一些变量,临时表,等等

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_开发语言_04

在连接使用完毕后,会进行释放这还是由客户端发起的com_quit  信号,通过他来将你的客户与MYSQL的线程进行分离,分离后THD 使用的内存将被释放,并且这个线程将重新放回到 thread cache 中。

实际上一个线程在处理任务中的三个关键因素

1  互斥锁

2  数据库锁

3  IO 

一个线程在处理一个事务的过程中,会考虑在处理事务的情况下是否有其他的线程也在处理与我同样的资源,互斥锁的主要目的就是,独占性,通过独占来满足一个线程处理数据时的排他性。数据锁(如行锁)通常会保护一个线程正在更新的数据不被另一个线程读或写。元数据锁通常会保护数据库模式不受并发的、不兼容的更新的影响,而IO 是在数据处理中,一个任务等待处理的数据通过IO操作读入到内存的一个等待的事件。最终一个线程的整体操作会受到这三个方面的限制和控制。

而系统性能消耗最大的部分就是一个线程处理不完他的任务,而另一个需求已经来了,那么系统会不断开心的线程满足客户的需求,直到你的系统的资源出现瓶颈,可能是IO 也可能是 CPU 或内存。

那么怎么控制这个问题,有同学试图从数据库入手来解决这个问题,比如降低max_connections  ,或者通过降低  thread_cache_size的方式,这些都是不可取的想法,首先数据库是一个包容性的集中处理数据的机构,任何想通过各种设置,降低客户访问便利性的想法都是对于数据库本身运行的机制的一种误解。

实际中正确的控制的方式应该是从软件的形成方来进行控制,如他们的软件的连接数的设置,连接池的设计与配置,等等,DBA 工作的方向是和开发联合进行沟通和正确的数据库连接的使用,而不是自行进行活跃连接数据的限制这样的想法和做法。

而群里面提到的 innodb_commit_concurrency, 并不是一个可以控制并发连接数的设置,他的主要的初衷是控制并发线程在同一个时刻可以进行commit的数量,这实际上与活跃连接控制无关。具体他是做什么的,可以参考下面的文字。

https://www.percona.com/blog/innodb-thread-concurrency/

反过来我们在说说 POSTGRESQL ,PG 工作的客户连接是进程的模式,与MYSQL 是不一样的,客户通过libpq 的方式与PG 建立连接,客户首先会与主进程进行访问的申请后,建立backend process 的进程与数据库进行数据处理,这里每个进程在PG14并不是自己进行信息的统计,而是通过另一个进程来进行相关的每个进程的工作信息的收集,这个进程是statistics collector 。

与mysql  不同的是POSTGRESQL 有一个统一管理客户进程内存的参数,work_mem  他来提供客户端访问数据库的使用的内存。相比较线程的模式,进程的模式以及POSTGRESQL 对于客户连接的处理上,POSTGRESQL 的使用是更愿意复用的,也就是将一个连接给多个应用在不同的时间部分进行利用,所以PG 有一个数据库连接池pgbouncer 的产生,来去做这个复用的部分。

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_mysql_05

如果你不想使用pgbouncer 的情况下,建议不要长时间一个进程被应用程序霸占时间太长,你的应用线程池需要进行合理的设置,在多长时间释放掉连接,但是POSTGRESQL 有一个特性是并行,并行查询中是可以利用多个CPU为一个SQL进行服务的,在这样的情况下,需要评估你的CPU的数量,与你参数 max_worker_processes 和 max_parallel_workers的配置。

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_数据库_06

控制PG的连接的几个部分参数有一下,建议不熟悉PG的同学先把以下的参数与以及功能弄清楚

max_connections

work_mem

max_worker_processes = 8             

max_parallel_workers_per_gather = 4    

max_parallel_maintenance_workers = 2    

max_parallel_workers = 8         

下图为POSTGRESQL 客户连接进程与PG 内部进程  

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_开发语言_07

另外一个问题,为什么MYSQL是线程,POSTGRESQL 是进程,

进程比线程更沉重,每个进程都有自己的虚拟内存,它维护称为PCB(进程控制块)的元数据,其中包括用于将虚拟地址映射到物理地址的页表以及有关进程的任何其他元数据。PCB必须存储在内存中,并进入CPU缓存寄存器,将虚拟内存地址转换为物理地址。另一方面,线程与它们的父进程共享虚拟内存空间,并且它们的TCB(线程控制块)通过指向父进程PCB的指针要小得多。所以线程的缓存命中率要比进程高得多。但是在早期的系统设计中有一个概念,线程相对于进程是不稳定的,基于这个理念PG 在设计中采用了进程,而不是线程来设计。

如果对此有疑问,可以自行查找MYSQL 5.0 的稳定性的一些历史文章和问题。

总结:控制数据库的活跃线程,是一个伪命题,无论MYSQL 或 PG 都不应该支持这样的想法,应用设计模块该去解决的问题,应该去对应的部分去解决,而不是将所有的问题都塞给数据库。

POSTGRESQL  和  MYSQL 到底应该不应该控制活跃连接_mysql_08

标签:POSTGRESQL,max,数据库,线程,MYSQL,进程,应该,连接
From: https://blog.51cto.com/u_14150796/6534559

相关文章

  • POSTGRESQL 自动搜索所有逻辑库中的无用索引自动化脚本实现
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。前两天腾出点时间,打算整理一下POSTGRESQL公司的数据库的无用的索引的问题,写了一个SQL通过SQL来获取这些数据库的无用索引,但头......
  • 我也不知道该怎么回答这个问题,还学MYSQL 吗?
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题最近一个同学偶然问了我一个这样的问题,实话说我不知道该怎么回答这个问题。但我知道问这个问题的同学,他思考了,不是在追风,一会儿MYSQ......
  • PostgreSQL 15 让多年被DISS的PG 安全画上圆满的句号
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。提起POSTGRESQL中的安全问题其中最容易被人Diss的最大BUG并不是autovacuum 之类的部分,排在首位的被DISS的最大的问题是安全的......
  • POSTGRESQL postgresql 升级的需求来自哪里
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题(本篇的思路来自于,盘古云课堂PG152023年2月18日晚,PG15升级问题大讨论稿)说起POSTGRESQL的升级问题,很多同学会问,升级POSTGRESQL......
  • MYSQL collation 选好还能换吗
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。Collation 主要的作用是什么,排序。 数据库中的字符众多,而在这里很多的查询中都对这些符号进行一些比对的工作,如A=a,B>B......
  • POSTGRESQL 再说 PGBOUNCER 如何部署的问题
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近得到与PGBOUNCER的一个问题,问题大体上是这样描述的,一台POSTGRESQL的服务器,2000个maxconnection,同时安装了4个pgbouncer在......
  • PostgreSQL 16 三则 “新功能更新”
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。POSTGRESQL15刚刚推出不久,而POSTGRESQL16的新功能也已经在路上了,下面说说PG16已经确认有的3个新功能。1PG_DUMP压缩相对......
  • POSTGRESQL SQL 优化,不建立索引,不调整参数,不修改SQL的另类方式
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,软件架构师,软件开发大佬,可以解决你的问题。在MYSQL中很少听说过自建统计信息,实际上在其他数据库中,创建统计信息的方式和需求都是有的,尤其处理复杂SQ......
  • 这应该是堪称教科书级别的“Android Framework学习笔记”了,字节九位大佬联合打造,首次
    相信大家在找工作的时候,肯定或多或少都被面试官问到过安卓的八股文。ActivityManagerService(简称AMS),或者WindowManagerService(WMS)怎么实现的啊,有些什么细节需要注意啊,View被加入到ViewRoot的流程啊等等。在我看来,对于应用开发来说,面试考这些纯粹就是扯淡,很有可能面试官自己也......
  • Android开发想转行音视频,应该要怎么做?
    在星球经常被问到的问题,Android开发想转行音视频,应该要怎么做?很多人对此都有疑惑,不光有工作多年的职场老司机,也有求学期间的研究生同学们,摘录了其中一部分提问,可以看到大家的疑惑是有类似的。对于星球用户的每个提问我都有认真回答,毕竟每个人的情况不一样,没有什么统一的答案。这些......