标签:没有 dma worker color 提升 lis for com text
代码细节
$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
类是 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); }
标签:没有 dma worker color 提升 lis for com text
原文地址:https://www.cnblogs.com/tkzc2013/p/14948694.html