應該開啟多少進程

如何設定進程數

進程數是由 count 屬性決定的(windows 系統不支持進程數設定),例如下面代碼

use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.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 核數的 8 倍甚至更高。注意 非阻塞式 IO 屬於 CPU 密集型,而不屬於 IO 密集型。

3、如果是 CPU 密集型,也就是業務中沒有 阻塞式 IO 開銷,例如使用異步 IO 讀取網絡資源,進程不會被業務代碼阻塞的情況下,可以把進程數設定成和 CPU 核數一樣。

進程數設定參考值

如果業務代碼偏向 IO 密集型,則根據 IO 密集程度設定進程數,例如 CPU 核數的 3-8 倍。

如果業務代碼偏向 CPU 密集型,則可以將進程數設定成 CPU 核數。

注意

Workerman 自身的 IO 都是非阻塞的,例如 Connection->send 等都是非阻塞的,屬於 CPU 密集型操作。如果不清楚自己業務偏向於哪種類型,可設定進程數為 CPU 核數的 3 倍左右即可。
另外進程數並非越多越好,進程開得太多,進程切換開銷會增大,對性能有一定影響。