首页 > 编程知识 正文

对象池模式,java运行时常量池存放什么

时间:2023-05-05 22:57:29 阅读:162988 作者:775

这次,我们将谈谈对象池、连接池的含义。 在此之前,为了理解游泳池的意思,学习一下其他的基础知识吧。

nginx和php-fpm的过程模型

nginx采用多进程模型,启动后的进程包括一个主进程和多个工作器进程。

主进程是工作器的父进程,其主要作用是管理工作器进程。

向工作器进程发送通知结束等信号

可以监视工作器的状态,并在工作器结束后重新启动新的工作器,而不管正常还是异常。

可以从容地重新启动。 当接收到信号时,主进程重新加载配置,然后启动新进程以开始接收新请求,通知所有旧进程不再接收新请求,并在处理完所有未完成的请求后自动终止

工作器进程负责处理请求,如果是静态文件,则可以直接处理完。 如果是php程序,则必须调用php进行处理,在php处理完成时获取php的返回并返回给客户端。

采用异步异步阻塞,在调用php时不会阻塞等待,而是处理下一个请求,在php处理完成时恢复以前的请求并返回给客户端。

php-fpm是php-cgi的管理器,已经通过php=5.3.3集成到php中。

它的出现提供了更好的php管理方法

可以顺利停止/启动php流程。 重新加载配置将生效

可以监视多个端口,并将其配置为使用不同的配置

php脚本的解释器是php-cgi

php-fpm是管理器,管理对象是php-cgi

php-fpm实现了fastcgi协议,当php-fpm启动时,它将启动多个cgi解释器进程。

web服务器可以向php-fpm发送数据,php-fpm向php-cgi发送数据进行处理。 (类似于nginx向php-fpm发送数据。)

驻留存储器下程序的对象回收

常驻内存程序是指将自己装入内存后,将控制返回到操作系统,在执行结束、异常或用户手动结束之前不中断执行的程序。

当程序运行时,对象和变量一直存在。 除非通过程序释放销毁。

高并发new对象的资源消耗

当我们新建对象时,首先需要经过几个步骤:加载类、分配内存空间、设置类的基本信息以及调用初始化构造函数。

首先让我们看一下构造函数。 这是在代码中用我们的需求和意志写的。

在此块中,您经常会发现配置、初始化数据、连接数据库(网络io )等。

接着,分配存储器区域

操作系统的内存定位器通常会事先要求操作系统具有较大的内存。 然后,在每次分配时,将中的短部分标记为已分配,在释放时标记为未分配。

由于许多程序正在运行,分配和释放交替存在,可能会产生1级分配-1级未分配-2级分配-2级未分配的结果

每个未分配的内存都是碎片,会消耗额外的内存。 碎片不一定会马上被重用。 (如果无法分配连续内存,则需要向操作系统申请更多内存。 )

此外,在创建和销毁对象时,操作系统还需要进行某些操作,从而消耗资源。

new对象过多、cpu负载联机导致所有站死机的概念

如果程序没有生成IO (网络请求、文件读写等),则执行时间等于cpu占用时间。

频繁创建销毁对象会占用更多的cpu资源,并且在高并发运行时cpu可能会长期处于高负载状态。

什么是象池

对象池是指在程序启动时创建一些可重用的对象。

如果需要在程序的其他位置使用这种类型的对象,请向池提出请求,而不是向系统申请创建。

池从池中分发对象以提供使用。 使用完程序后,必须将对象归还给对象池进行管理。

对象池服务减少了从头开始创建每个对象的开销。

同时运行多个mysql连接会导致mysql繁忙,从而导致整个站点崩溃

? phpfunctiondb ({ returnmysqli _ connect )、" root "、" root "; (for ) $I=0; $i 10000; $i () $name='db ) $i ); $$name=db (; }此demo将生成错误:警告: mysqli _ connect (: ) 08004/1040 ) : Too many connections

我们习惯不通过PHP脚本主动关闭mysql连接,而是等待脚本运行,然后gc自动回收。 在此期间持续消耗连接资源,且连接资源的数量有限,因此连接很可能不足。

处理会影响程序的执行,同时也可能导致所有站崩溃。

mysql是连接创建线程的过程。

销毁mysql线程所需的内存等性能消耗、线程缓存命中率降低

mysql的基础要求几乎同时处理几百个线程发送的查询请求,而cpu一次只能处理一条指令。 此外,数据库查询还必须生成IO,在IO期间,cpu在上下文之间切换以处理其他请求。 如果cpu频繁切换上下文,性能会下降或下降。

连接池保护mysql免受崩溃的影响

连接池是指将创建的连接保存到池中

有请求来时,直接使用已经创建好的连接对数据库进行访问。

<?phpclass Pool{ private $pool = []; private $min = 5; private $max = 100; private $now; public function __construct() { // 在池创建的时候就先创建好一些连接 for ($i = 0 ; $i < $this->min; $i++){ $this->pool[] = mysqli_connect("localhost","root","root"); $this->now++; } } public function get() { // 这里要判断当前池还有没有空闲的 // 若没有,则判断当前已经提供的服务数量大不大于最大数量 如果还没有达到最大数量 可以向系统再申请一个资源到池中 // 如果已经达到最大数量,并且池内没有服务了,则进行短暂等等看看有没有 // 需要销毁避免同一个连接多处使用,会冲突 $connect = array_shift($this->pool); return $connect;//伪代码 } public function recovery($connect) { $this->pool[] = $connect; }}

因为连接池需要长期保持在线,在传统的php脚本中不支持,在swoole中可以常驻内存运行,即可使用连接池

这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。

然而除了性能上的提高外,还有一个意义也很重要:保护服务稳定运行,不发生全站崩溃。

在上面一点我们已经提到,更多的链接将会导致cpu频繁切换上下文,性能抖动,严重情况时将会全站崩溃。

假设本来我们的服务器配置是可以保证1000个连接同时稳定运行,突然某一时刻有3000个人并发,导致连接不够用,那么是保证原有1000人都正常运行好,还是让这3000人争抢资源最终导致机器响应不了全站崩溃好呢?

连接池的意义此时才得以体现,我们设置连接池的最大数量为机器能承受并且稳定运行的最大数量。
当已经有这么多的数量在服务的时候,后面的请求申请连接资源时需要进行短暂的等待,若时间到了还是没有空余连接提供,则需要熔断服务,返回给客户端失败。

这样子可以保证机器长期稳定服务。若是越来越多的客户端申请不到资源,则需要提高机器配置。(因为我们的连接池最大数量已经是机器的瓶颈,只能通过硬件配置来提升能服务的数量)

nginx – php fpm在大并发下504
在最开始的时候已经介绍过nginx和php的运行进程模型,php-fpm就是一个池管理器,内部装了若干个php-cgi程序,当nginx申请解析php脚本时,php-fpm则分配一个php-cgi出去处理,处理完则收回管理。

在高并发下,nginx会产生504错误,这就是我们上面介绍到的,客户端进行了短暂的 等待 后,仍然申请不到资源,则只能告诉客户端失败。

(在京东、淘宝的大活动期间很有机会碰到504错误哦! 这种情况下我们一般只需要刷新页面即可。 因为再刷新时大几率已经有连接资源空闲了!)

Nginx 504 Gateway Time-out的含义是没有请求到可以执行的PHP-CGI。
总结
连接池、对象池的意义不仅仅是可以减少频繁创建销毁对象连接的性能开销

更大的意义是可以保证应有服务客户端的稳定运行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。