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

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

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

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IDOR漏洞接管Facebook页面,获1万6千美金奖励「建议收藏」

    IDOR漏洞接管Facebook页面,获1万6千美金奖励「建议收藏」印度小哥的自拍有点曝光过度了啊 Facebook能给出这么高的奖励,好棒啊发现Facebook零日漏洞,获得10万7千元人民币奖励安全研究人员发现Facebook存在零日漏洞!可以接管Facebook的任何页面。Facebook几乎是中小企业推广自家产品的最高效又低成本的平台。合理借用Facebook的关键在于装帧好某项产品或服务的Facebook页面,品牌、企业、组织和

    2022年6月11日
    30
  • Linux下安装mysql-8.0.21

    Linux下安装mysql-8.0.21转载原文https://www.jianshu.com/p/4587e9429702下面记录了我在Linux(Centos7)环境下安装Mysql的完整过程,实操记录,绝非水文,如有错误或遗漏,欢迎指正。安装过程中务必保证文件路径的前后统一,否则可能会导致不可预期的结果,推荐直接使用文中的命令进行操作。一安装前准备1、检查是否已经安装过mysql,执行命令[root@localhost/]#rpm-qa|grepmysql从执行结果,可以看出我们已经安装了

    2022年5月10日
    62
  • Pytest(13)命令行参数–tb的使用

    Pytest(13)命令行参数–tb的使用前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

    2022年7月30日
    4
  • web基础知识总结_Web站点基础阶段包含哪些阶段

    web基础知识总结_Web站点基础阶段包含哪些阶段传统身份验证的方法:HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在C…

    2022年10月28日
    0
  • 如何安装wget_ubuntu安装unzip命令

    如何安装wget_ubuntu安装unzip命令今天给服务器安装新LNMP环境时,wget时提示-bash:wgetcommandnotfound,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。可以通过以下两种方法来安装:1、rpm安装rpm下载源地址:http://mirrors.163.com/centos/6.2/os/x86_64/Packages/下载wget的RPM包:htt…

    2022年10月17日
    0
  • gamma correction什么意思_伽马校正计算方法

    gamma correction什么意思_伽马校正计算方法伽马是数字成像系统的一个重要特征,它定义了像素值与其实际亮度之间的关系。在标准显示器上面,如果没有伽马,数码相机拍摄到的阴影内容便会跟我们实际看到的有所差异。平时我们所说的伽马校正、伽马编码、伽马压缩,都是伽马曲线的各种应用场景,属于相似的概念。对于伽马工作原理的理解,一方面可以提高摄影者的曝光技术,另一方面可以帮助人们更好地利用后期的图像编辑功能。

    2022年9月24日
    0

发表回复

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

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