一、linux查看進(jìn)程
pstree命令可以查看進(jìn)程的樹(shù)模型
1
2
3
4
5
從系統(tǒng)的輸出中,可以看出server其實(shí)有3個(gè)進(jìn)程,進(jìn)程的pid分別是2829、2831、2836,其中2829是2831的父進(jìn)程,而2831又是2836的父進(jìn)程。
2829是根進(jìn)程,就是所謂的Master進(jìn)程;而2831則是Manager進(jìn)程;最后的2836是Worker進(jìn)程。
二、各進(jìn)程之間的關(guān)系
數(shù)量上:一個(gè)多進(jìn)程模式下的Swoole Server中,有且只有一個(gè)Master進(jìn)程;有且只有一個(gè)Manager進(jìn)程;卻可以有n個(gè)Worker進(jìn)程。
swoole進(jìn)程結(jié)構(gòu)圖:
第一層,Master進(jìn)程,這個(gè)是swoole的主進(jìn)程,這個(gè)進(jìn)程是用于處理swoole的核心事件驅(qū)動(dòng)的,那么在這個(gè)進(jìn)程當(dāng)中可以看到它擁有一個(gè)MainReactor[線程]以及若干個(gè)Reactor[線程],swoole所有對(duì)于事件的監(jiān)聽(tīng)都會(huì)在這些線程中實(shí)現(xiàn),比如來(lái)自客戶端的連接,信號(hào)處理等。
Master、Manage、Worker、Task四種進(jìn)程之間是怎么協(xié)作的:
1、Client主動(dòng)Connect的時(shí)候,Client實(shí)際上是與Master進(jìn)程中的某個(gè)Reactor線程發(fā)生了連接。
2、當(dāng)TCP的三次握手成功了以后,由這個(gè)Reactor線程將連接成功的消息告訴Manager進(jìn)程,再由Manager進(jìn)程轉(zhuǎn)交給Worker進(jìn)程。
3、在這個(gè)Worker進(jìn)程中觸發(fā)了OnConnect的方法。
4、當(dāng)Client向Server發(fā)送了一個(gè)數(shù)據(jù)包的時(shí)候,首先收到數(shù)據(jù)包的是Reactor線程,同時(shí)Reactor線程會(huì)完成組包,再將組好的包交給Manager進(jìn)程,由Manager進(jìn)程轉(zhuǎn)交給Worker。
5、此時(shí)Worker進(jìn)程觸發(fā)OnReceive事件。
6、如果在Worker進(jìn)程中做了什么處理,然后再用Send方法將數(shù)據(jù)發(fā)回給客戶端時(shí),數(shù)據(jù)則會(huì)沿著這個(gè)路徑逆流而上。
7、Task進(jìn)程主要處理一些占用時(shí)間較長(zhǎng)的業(yè)務(wù),主要處理Worker進(jìn)程中占時(shí)較長(zhǎng)的一些任務(wù)。
注:Task進(jìn)程理解
形象的例子:
Master進(jìn)程就像業(yè)務(wù)窗口的,Reactor就是前臺(tái)接待員,用戶很多的時(shí)候,后邊的用戶就需要排隊(duì)等待服務(wù);Reactor負(fù)責(zé)與客戶直接溝通,對(duì)客戶的請(qǐng)求進(jìn)行初步的整理(傳輸層級(jí)別的整理——組包);然后,Manager進(jìn)程就是類似項(xiàng)目經(jīng)理的角色,要負(fù)責(zé)將業(yè)務(wù)分配給合適的Worker(例如空閑的Worker);而Worker進(jìn)程就是工人,負(fù)責(zé)實(shí)現(xiàn)具體的業(yè)務(wù)。
三、多進(jìn)程的基本配置
1
2
3
4
5
6
7
8
reactor_num:表示Master進(jìn)程中,Reactor線程總共開(kāi)多少個(gè),注意,這個(gè)可不是越多越好,因?yàn)橛?jì)算機(jī)的CPU是有限的,所以一般設(shè)置為與CPU核心數(shù)量相同,或者四倍即可。
worker_num:表示啟動(dòng)多少個(gè)Worker進(jìn)程,同樣,Worker進(jìn)程數(shù)量不是越多越好,仍然設(shè)置為與CPU核心數(shù)量相同,或者兩倍即可。