码迷,mamicode.com
首页 > 其他好文 > 详细

workerman知识清单

时间:2021-06-29 16:00:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:没有   dma   worker   color   提升   lis   for   com   text   

 

Worker类:静态Worker统一管理实例worker

代码细节

$this->workerId                    = \spl_object_hash($this);
static::$_workers[$this->workerId] = $this;
static::$_pidMap[$this->workerId]  = array();

 

进程端口复用原理

参考:https://www.jianshu.com/p/97cc8c52d47a

惊群效应

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

只有一个 Worker 可以获得处理这个连接的机会,其他Worker在竞争失败后继续回到挂起状态。唤醒 Worker 的过程是要消耗CPU资源的,Worker 数量越多,消耗的 CPU 资源就越多,造成了资源的浪费。这就是常说的 惊群效应
 
代码细节
#Worker 类是 Workerman 里最主要的类,其中有个 listen() 函数
protected
function listen() { ... if (!$this->_mainSocket) { ... $this->_mainSocket = stream_socket_server(...); ... } ... }
#当 reusePort 为 false 时,主进程在创建 Worker 之前就调用了 listen() 函数
protected function initWorkers() { .... if (!$worker->reusePort) { $worker->listen(); } .... }
#当 reusePort 为 true 时,情况就不同了。主进程在创建 Worker 前不会调用 listen(),而是在创建完 Worker 后由每个 Worker 自行发起 listen() 调用
protected static function forkOneWorkerForLinux($worker) { ... $pid = pcntl_fork(); if ($pid === 0) { if ($worker->reusePort) { $worker->listen(); } ... } ... }
#想要内核开启 reuseport 功能,需要手动设置 Socket 的 context
if ($this->reusePort) { $context = stream_context_create(); stream_context_set_option($context, ‘socket‘, ‘so_reuseport‘, 1); }

 

 

workerman知识清单

标签:没有   dma   worker   color   提升   lis   for   com   text   

原文地址:https://www.cnblogs.com/tkzc2013/p/14948694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!