應該開啟多少進程
如何設定進程數
進程數是由 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 倍左右即可。
另外進程數並非越多越好,進程開得太多,進程切換開銷會增大,對性能有一定影響。