應(yīng)該開啟多少進(jìn)程
如何設(shè)置進(jìn)程數(shù)
進(jìn)程數(shù)是由count
屬性決定的(windows系統(tǒng)不支持進(jìn)程數(shù)設(shè)置),例如下面代碼
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:2345");
// ## 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù) ##
$http_worker->count = 4;
...
進(jìn)程數(shù)設(shè)置需要考慮以下條件
1、cpu核數(shù)
2、內(nèi)存大小
3、業(yè)務(wù)偏向IO密集還是CPU密集型
進(jìn)程數(shù)設(shè)置原則
1、每個(gè)進(jìn)程占用內(nèi)存之和需要小于總內(nèi)存(一般來(lái)說每個(gè)業(yè)務(wù)進(jìn)程占用內(nèi)存大概40M左右)
2、如果是IO密集型,也就是業(yè)務(wù)中涉及到一些阻塞式IO,比如一般的訪問Mysql、Redis等存儲(chǔ)都是阻塞式訪問的,進(jìn)程數(shù)可以開大一些,如配置成CPU核數(shù)的3倍。如果業(yè)務(wù)中涉及的阻塞等待非常多,可以再適當(dāng)加大進(jìn)程數(shù),例如CPU核數(shù)的8倍甚至更高。注意非阻塞式IO屬于CPU密集型,而不屬于IO密集型。
3、如果是CPU密集型,也就是業(yè)務(wù)中沒有阻塞式IO開銷,例如使用異步IO讀取網(wǎng)絡(luò)資源,進(jìn)程不會(huì)被業(yè)務(wù)代碼阻塞的情況下,可以把進(jìn)程數(shù)設(shè)置成和CPU核數(shù)一樣
進(jìn)程數(shù)設(shè)置參考值
如果業(yè)務(wù)代碼偏向IO密集型,則根據(jù)IO密集程度設(shè)置進(jìn)程數(shù),例如CPU核數(shù)的3-8倍。
如果業(yè)務(wù)代碼偏向CPU密集型,則可以將進(jìn)程數(shù)設(shè)置成cpu核數(shù)。
注意
Workerman自身的IO都是非阻塞的,例如Connection->send
等都是非阻塞的,屬于CPU密集型操作。如果不清楚自己業(yè)務(wù)偏向于哪種類型,可設(shè)置進(jìn)程數(shù)為CPU核數(shù)的3倍左右即可。
另外進(jìn)程數(shù)并非越多越好,進(jìn)程開得太多,進(jìn)程切換開銷會(huì)增大,對(duì)性能有一定影響。