iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Workerman中reusePort属性的作用是什么
  • 602
分享到

Workerman中reusePort属性的作用是什么

2023-06-20 16:06:34 602人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Workerman中reusePort属性的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Workerman是一个高性能的PHP Socket服务器框架

这篇文章将为大家详细讲解有关Workerman中reusePort属性的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Workerman是一个高性能的PHP Socket服务器框架。可以用 Workerman 直接在 tcp编程,基本的编程套路是:

$w = new Workerman\Worker('tcp://0.0.0.0:80');$w->count = 4;$w->onMessage = function(Workerman\COnnection\TcpConnection $connection, array $data) {    $connection->send('Hello World');};Worker::runAll();

在使用的过程中,不知道你是否留意过 reusePort 这个参数,他默认被设置为 false。这个参数有什么用?什么情况下我们需要把他设置为 true,从而提高性能呢?

1. reuseport 的作用

关于 reusePort 参数,Workerman官方的文档是这么解释的:

开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。

如果没有深入研究过 linux 网络编程,很难理解这句话。在此简单解释一下:

服务端程序通常通过监听服务器上的某个端口号,来接收客户端的请求。在Linux中,服务器网卡 + 端口号被抽象成了一个 Socket

为了提升性能,一般的服务端程序在运行时都有多个进程(俗称 Worker)监听同一个 Socket,在没有客户端连接到来的时候,这些Worker是处于挂起状态的,不消耗CPU资源。

如果某一刻有一个客户端连接到来,Linux 内核就会同时唤醒这些 Worker,让他们竞争去处理这个连接,

结果只有一个 Worker 可以获得处理这个连接的机会,其他Worker在竞争失败后继续回到挂起状态。唤醒 Worker 的过程是要消耗CPU资源的,Worker 数量越多,消耗的 CPU 资源就越多,造成了资源的浪费。这就是常说的 惊群效应

你也许会问:为什么不每次只唤醒一个Worker呢?很遗憾,Linux内核并没有这样的功能。

幸好,在 Linux 3.9 及以后的版本,加入 reuseport 特性。这个特性有什么用呢?

在有 reuseport 之前,一个端口号只能被一个 Socket 监听,有了 reuseport 之后,这个限制就被打破了:一个端口号可以被多个 Socket 同时监听。

前面说到,Linux 内核没法做到一次只唤醒一个 Worker,但是,内核可以做到将客户端连接均匀地发送到监听统一端口的一群 Socket 上。

如图所示,每个 Worker 都有自己的 Socket,都监听同一个端口。当有客户端连接到来时,内核转发连接到一个 Socket 上,而这个 Socket 只会唤醒自己隶属的那个 Worker。这样就很巧妙地解决了 惊群效应,提高了整体的性能。

由此,我们可以得出结论:如果你的 Linux 内核版本是 3.9 及以上的话,那么在使用 Workerman 时,可以将 reusePort 设置为 true 提升程序运行效率。

2. Workerman 如何利用 reuseport

虽然你只要在 Workerman 中把 reusePort 设置为 true,就能享受到 Linux 的这个高级特性。但 Workerman 的源码中,并不只是开启一个内核参数那么简单。Workerman 为你隐藏了许多的设计细节,我们来研究下。

Worker 类是 Workerman 里最主要的类,其中有个 listen() 函数:

protected function listen(){    ...    if (!$this->_mainSocket) {        ...        $this->_mainSocket = stream_socket_server(...);        ...    }    ...}

listen() 函数的作用就是在当前进程创建一个 Socket 并开始监听请求。

当 reusePort 为 false 时,主进程在创建 Worker 之前就调用了 listen() 函数:

protected function initWorkers() {    ....    if (!$worker->reusePort) {        $worker->listen();    }    ....}

随后主进程通过 pcntl_fork() 创建 Worker。pcntl_fork() 有个特性:创建出来的子进程(Worker)中的变量都是父进程复制而来的,包括父进程创建的 mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的_mainSocket,也即共用一个 Socket。

而当 reusePort 为 true 时,情况就不同了。主进程在创建 Worker 前不会调用 listen(),而是在创建完 Worker 后由每个 Worker 自行发起 listen() 调用:

protected static function forkOneWorkerForLinux($worker) {    ...    $pid = pcntl_fork();    if ($pid === 0) {        if ($worker->reusePort) {            $worker->listen();        }        ...    }    ...}

这样的结果就是,每个子进程(Worker)都创建了自己的 Socket。

最后还有一点,如果想要内核开启 reuseport 功能,需要手动设置 Socket 的 context:

if ($this->reusePort) {    $context = stream_context_create();    stream_context_set_option($context, 'socket', 'so_reuseport', 1);}

关于Workerman中reusePort属性的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Workerman中reusePort属性的作用是什么

本文链接: https://www.lsjlt.com/news/298631.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Workerman中reusePort属性的作用是什么
    这篇文章将为大家详细讲解有关Workerman中reusePort属性的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Workerman是一个高性能的PHP Socket服务器框架...
    99+
    2023-06-20
  • php中workerman的作用是什么
    在PHP中,Workerman是一个高性能的PHP异步网络编程框架,可以用于开发实时通讯应用、游戏服务器、物联网应用等需要处理大量并...
    99+
    2024-04-02
  • css属性中float属性的作用是什么
    本教程操作环境:Windows10系统、CSS3版、DELL G3电脑css属性中float属性的作用是什么?float,css的一种属性,主要属性值为:left(左浮动)、none(不浮动)、right(右浮动)、inherit(继承父元...
    99+
    2023-05-14
    float css
  • php中Workerman框架的作用是什么
    这篇文章将为大家详细讲解有关php中Workerman框架的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php的框架有哪些php的框架:1、Laravel,Laravel是一款免...
    99+
    2023-06-14
  • vue中mixins属性的作用是什么
    本篇文章给大家分享的是有关vue中mixins属性的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mixin.js 文件import...
    99+
    2024-04-02
  • CSS中cssfilter属性的作用是什么
    CSS的filter属性用于对元素进行图像处理和效果,可以实现一些常见的图像处理操作,如模糊、亮度调整、对比度调整、灰度化、反转、色...
    99+
    2023-09-15
    CSS
  • VB.NET中DateTime属性的作用是什么
    本篇文章为大家展示了VB.NET中DateTime属性的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。属性Date:返回一个DateTime值,显示日期。   Day:...
    99+
    2023-06-17
  • Python中property属性的作用是什么
    本篇内容主要讲解“Python中property属性的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中property属性的作用是什么”吧!前言Python 动态属性的概念...
    99+
    2023-06-30
  • js中offsettop属性的作用是什么
    offsetTop属性返回的是一个元素相对于其offsetParent元素的顶部偏移量(即元素顶部边缘与offsetParent元素...
    99+
    2023-10-24
    js
  • C#中useshellexecute属性的作用是什么
    在C#中,UseShellExecute属性是一个bool类型的属性,用于指定是否使用操作系统的 Shell 执行的方式来运行进程。...
    99+
    2024-02-29
    C#
  • vb中wordwrap属性的作用是什么
    在VB中,WordWrap属性用于设置控件是否自动换行。 当WordWrap属性设置为True时,控件中的文本会自动换行,以适应控件...
    99+
    2023-10-28
    vb
  • CSS中margin属性的作用是什么
    这篇文章主要介绍“CSS中margin属性的作用是什么”,在日常操作中,相信很多人在CSS中margin属性的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS中...
    99+
    2024-04-02
  • HTML5 中placeholder属性的作用是什么
    HTML5 中placeholder属性的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。HTML代码<input type...
    99+
    2024-04-02
  • CSS 中margin 属性的作用是什么
    这篇文章给大家介绍CSS 中margin 属性的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。CSS margin 属性定义margin 属性是用于在一个声明中设置四个外边距...
    99+
    2024-04-02
  • C# 中ThreadState属性的作用是什么
    这篇文章将为大家详细讲解有关C# 中ThreadState属性的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。主线程Main()函数所有线程都是依附于Main()函数所在的线程的,...
    99+
    2023-06-17
  • css中 fixed属性的作用是什么
    今天就跟大家聊聊有关css中 fixed属性的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。fixed是position属性的属性值。当元素的position属性设置为fi...
    99+
    2023-06-15
  • CSS中position:relative;属性的作用是什么
    CSS中position:relative;属性的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 引...
    99+
    2024-04-02
  • CSS中contentEditable属性的作用是什么
    contentEditable属性是CSS中的一个属性,用于指定元素是否可以编辑。当将元素的contentEditable属性设置为...
    99+
    2023-09-11
    CSS
  • iframe中allowTransparency属性的作用是什么
    allowTransparency属性是用于设置iframe元素是否允许透明度的属性。如果将其设置为"true"...
    99+
    2023-09-12
    iframe
  • ASP.NET中AutoEventWireup属性的作用是什么
    AutoEventWireup属性是ASP.NET中的一个页面级别的属性,用于指定是否自动将事件与事件处理程序进行关联。当AutoE...
    99+
    2023-09-21
    ASP.NET
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作