常驻内存以及如何避免内存泄漏

常驻内存以及如何避免内存泄漏

大家好,又见面了,我是全栈君。

常驻内存以及如何避免内存泄漏

swoole常驻内存

server一开始就把我们的代码加载到内存中了,无论后期我们怎么修改本地磁盘上的代码,客户端再次发起请求的时候,永远都是内存中的代码在生效,所以我们只能终止server,释放内存然后再重启server,重新把新的代码加载到内存中

swoole内存泄漏

因为swoole常驻内存的特性,尤其是server中定义的全局变量(global声明的变量,static静态变量或对象和超全局变量),在使用完之后是不会被释放,久而久之就可能会发生内存溢出。

如何避免内存泄漏

使用max_request 和 task_max_request 来避免内存泄漏
max_request:worker进程的最大任务数,当worker进程处理的任务数超过这个参数时,worker进程会自动退出,以此达到释放内存和资源的目的。

max_request参数使用限制

  1. max_request只能用于同步阻塞、无状态的请求响应式服务器程序

  2. 纯异步的Server不应当设置max_request

  3. 使用Base模式时max_request是无效的

其中Base模式是swoole运行模式的一种,我们主要介绍多进程模式。

总结:

  1. 常驻内存减少了不小开销,swoole不错

  2. 应尽量避免使用全局变量,不用最好,没啥用

  3. max_request可以解决php的内存溢出问题,但是主要还是要养成释放内存的习惯,因为max_request也有限制场景

使用max_request和 task_max_request 可有效避免内存泄漏

server的代码简写

为了方便测试,我们只设置1个Worker进程,1个Task进程,Worker进程的最大任务设置为3次,Task进程的最大任务设置为4次。

$serv = new swoole_server('127.0.0.1', 9501);

$serv->set([
    'worker_num' => 1,
    'task_worker_num' => 1,
    'max_request' => 3,
    'task_max_request' => 4,
]);
$serv->on('Connect', function ($serv, $fd) {
});
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    $serv->task($data);
});
$serv->on('Task', function ($serv, $taskId, $fromId, $data) {
});
$serv->on('Finish', function ($serv, $taskId, $data) {
});
$serv->on('Close', function ($serv, $fd) {
});
$serv->start();

client代码

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");

// 向服务端发送数据
$client -> send("Just a test.");
$client->close();

客户端第1次请求后,server进程结构

常驻内存以及如何避免内存泄漏

注意进程id为15644和15645,这两个一个是Worker进程,一个是Task进程。

客户端请求第3次后,server进程结构

常驻内存以及如何避免内存泄漏

进程id 15645变成了15680
请求3次后Worker进程自动退出了(并释放内存),然后Manager进程拉起了新的Worker进程(15680)。

客户端请求第4次后,server进程结构

常驻内存以及如何避免内存泄漏

进程id 15644变成了15704
请求第4次后Task进程自动退出了(并释放内存),然后Manager进程拉起了新的Task进程(15704)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111882.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 不平衡数据处理之SMOTE、Borderline SMOTE和ADASYN详解及Python使用

    不平衡数据处理之SMOTE、Borderline SMOTE和ADASYN详解及Python使用  不平衡数据在金融风控、反欺诈、广告推荐和医疗诊断中普遍存在。通常而言,不平衡数据正负样本的比例差异极大,如在Kaggle竞赛中的桑坦德银行交易预测和IEEE-CIS欺诈检测数据。对模型而言,不均衡数据构建的模型会更愿意偏向于多类别样本的标签,实际应用价值较低,如下图所示,为在不均衡数据下模型预测的概率分布。  不平衡数据的处理方法,常见方法有欠采样(under-sampling)和过采样(…

    2022年10月21日
    2
  • accumulate

    accumulate

    2021年12月8日
    67
  • 数据库简介与 Mysql 服务基础「建议收藏」

    数据库简介与 Mysql 服务基础「建议收藏」文章目录一、数据库系统发展史二、数据库基本概念一、数据库系统发展史第一代数据库自20世纪60年代起,第一代数据库系统问世是层次模型与网状模型的数据库系统为统—管理和共享数据提供了有力的支撑第二代数据库20世纪70年代初,第二代数据库——关系型数据库开始出现20世纪80年代初,IBM公司的关系型数据库系统DB2问世,开始逐步取代层次与网状模型的数据库,成为行业主流到目前为止,关系型数据库系统仍占领数据库应用的主要地位第三代数据库自20世

    2022年7月27日
    9
  • Eclipse汉化教程详细[通俗易懂]

    Eclipse汉化教程详细[通俗易懂]eclipse汉化包下载建议从:www.vipkes.cn或www.tkres.cn(恬恪学习网)下载,与此教程配套的资料。或从其它渠道下载。 下载完成后,解压压缩包: 打开压缩包后,可看到里面有个“eclipse”的文件夹,再进入该文件夹,可以看到如下两个文件夹:4.复制这两个文件夹,并找到eclipse安装根目录,如果不知道在哪里,请在桌面鼠标右键—》属性—》快捷方式—》打开文件所在位置即可。在eclipse安装目录下,找到以下dropins文件,双…

    2022年6月6日
    47
  • 前端实现异步的几种方式_redux是什么

    前端实现异步的几种方式_redux是什么1.什么是Saga?实际上,这个术语出自康奈尔大学的一篇论文:http://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf最初这篇论文是为了解决分布式系统中的LLT(LongLivedTransaction),也就是长时运行事务的数据一致性问题的。这么说有点抽象,我们来举个具体的例子:假如你在一个在线订票系统上订了一张…

    2022年9月18日
    0
  • linux服务器负载均衡配置_分布式系统如何负载均衡

    linux服务器负载均衡配置_分布式系统如何负载均衡因项目需要最近研究了下Linux红帽6.5下实现Apache负载均衡的问题。从干净的环境说起。   1、安装JDK环境       首先下载linux版本的JDK,我使用的是jdk-6u24-linux-x64-rpm.bin,并将该文件上传至服务器的指定目录。       chmod777jdk-6u24-linux-x64-rpm.bin修改文件的操作权限;   

    2022年9月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号