# 应该开启多少进程
## 如何设置进程数
进程数是由```count```属性决定的,例如下面代码
```php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
$http_worker = new Worker("http://0.0.0.0:2345");
// ## 启动4个进程对外提供服务 ##
$http_worker->count = 4;
...
```
## 进程数设置需要考虑以下条件
1、cpu核数
2、内存大小
3、业务偏向IO密集还是CPU密集型
## 进程数设置原则
1、每个进程占用内存之和需要小于总内存(一般来说每个业务进程占用内存大概40M左右)
2、如果是IO密集型,也就是业务中涉及到一些**阻塞式**IO,比如一般的访问Mysql、Redis等存储都是阻塞式访问的,进程数可以开大一些,如配置成CPU核数的3倍。如果业务中涉及的阻塞等待很多,可以再适当加大进程数,例如CPU核数的5倍甚至更高。注意**非阻塞式**IO属于CPU密集型,而不属于IO密集型。
3、如果是CPU密集型,也就是业务中没有**阻塞式**IO开销,例如使用异步IO读取网络资源,进程不会被业务代码阻塞的情况下,可以把进程数设置成和CPU核数一样
- - - - - -
进程数设置原理有点像生产线上工人们工作的情景,有4个生产线,就相当于CPU是4核的,生产线上的产品相当于任务,工人相当于进程。
工人并非越多越好,因为只有4条生产线,生产能力有限,并且工人多了大家轮流上下生产线开销也很大,同样的进程多了进程间切换开销也很大。
如果流水线上的商品每一步操作起来比较耗时(IO密集型),就需要多一点的工人去操作。
如果流水线上的商品每一步操作都比较快(CPU密集型),只需要少数工人即可
## 进程数设置参考值
如果业务代码偏向IO密集型,也就是业务代码有IO阻塞的地方,则根据IO密集程度设置进程数,例如CPU核数的3倍。
如果业务代码偏向CPU密集型,也就是业务代码中无IO通讯或者无阻塞式IO通讯,则可以将进程数设置成cpu核数。
## 注意
WorkerMan自身的IO都是非阻塞的,例如```Connection->send```等都是非阻塞的,属于CPU密集型操作。如果不清楚自己业务偏向于哪种类型,可设置进程数为CPU核数的2倍左右即可。
- 序言
- 原理
- 开发必读
- 入门指引
- 特性
- 简单的开发示例
- 安装
- 环境要求
- 下载安装
- 启动停止
- 开发流程
- 开发前必读
- 目录结构
- 开发规范
- 基本流程
- 通讯协议
- 通讯协议作用
- 定制通讯协议
- 一些例子
- Worker类
- 构造函数
- 属性
- id
- count
- name
- protocol
- transport
- reusePort
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回调属性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- runAll
- stopAll
- listen
- TcpConnection类
- 属性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- maxPackageSize
- 回调属性
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- AsyncTcpConnection类
- 构造函数
- connect
- reconnect
- transport
- Timer定时器类
- add
- del
- 定时器注意事项
- WebServer
- 调试
- 基本调试
- 查看运行状态
- 网络抓包
- 跟踪系统调用
- 常用组件
- GlobalData数据共享组件
- GlobalDataServer
- GlobalDataClient
- Channel分布式通讯组件
- ChannelServer
- channelClient
- 例子-集群推送
- 例子-分组发送
- FileMonitor文件监控组件
- MySQL组件
- workerman/mysql
- swoole/mysql(异步)
- redis组件
- swoole/redis
- 异步http组件
- swoole/http-client
- 异步消息队列组件
- react/zmq
- react/stomp
- 异步dns组件
- swoole/dns
- 常见问题
- 心跳
- 客户端链接失败原因
- 是否支持多线程
- 与其它框架整合
- 运行多个workerman
- 支持哪些协议
- 如何设置进程数
- 查看客户端连接数
- 对象和资源的持久化
- 例子无法工作
- 启动失败
- 停止失败
- 支持多少并发
- 更改代码不生效
- 向指定客户端发送数据
- 如何主动推送消息
- 在其它项目中推送
- 如何实现异步任务
- status里send_fail的原因
- Windows下开发Linux下部署
- 是否支持socket.io
- 终端关闭导致workerman关闭
- 与nginx apache的关系
- 禁用函数检查
- 平滑重启原理
- 为Flash开843端口
- 如何广播数据
- 如何建立udp服务
- 监听ipv6
- 关闭未认证的链接
- 传输加密-ssl/tsl
- 创建wss服务
- 创建https服务
- workerman作为客户端
- 作为ws/wss客户端
- PHP的几种回调写法
- 附录
- Linux内核调优
- 压力测试
- 安装扩展
- websocket协议
- ws协议
- text协议
- frame协议
- 不支持的函数/特性
- 版权信息