workerman模型中,如果由于worker進(jìn)程數(shù)設(shè)置不夠,可能會(huì)導(dǎo)致新來(lái)的請(qǐng)求無(wú)法及時(shí)處理嗎?會(huì)發(fā)生什么情況?(不討論AsyncTcpConnection那種方案)主要是想了解會(huì)有queue嗎?這部分是wm處理還是系統(tǒng)處理?因?yàn)橛袝r(shí)候worker可能只是某一時(shí)會(huì)不夠,大多數(shù)時(shí)沒(méi)問(wèn)題,設(shè)置太大不好。
workerman模型中,如果由于worker進(jìn)程數(shù)設(shè)置不夠,可能會(huì)導(dǎo)致新來(lái)的請(qǐng)求無(wú)法及時(shí)處理嗎?
會(huì)。
會(huì)發(fā)生什么情況?
會(huì)出現(xiàn)響應(yīng)延遲。
主要是想了解會(huì)有queue嗎?
系統(tǒng)為每個(gè)socket連接分配了一個(gè)socket讀緩沖區(qū)(默認(rèn)8k),用來(lái)緩沖客戶(hù)端發(fā)來(lái)的請(qǐng)求數(shù)據(jù)。worker空閑時(shí)會(huì)從這個(gè)緩沖區(qū)讀出請(qǐng)求數(shù)據(jù),然后處理這個(gè)請(qǐng)求,處理完畢后如果緩沖區(qū)還有數(shù)據(jù),則繼續(xù)處理,是一個(gè)循環(huán)。所以這個(gè)socket讀緩沖區(qū)其實(shí)可以看做一個(gè)queue,用來(lái)緩沖請(qǐng)求。如果這個(gè)緩沖滿了,則系統(tǒng)內(nèi)核將停止接收這個(gè)客戶(hù)端發(fā)來(lái)的后續(xù)數(shù)據(jù),直到讀緩沖區(qū)有數(shù)據(jù)被worker取走。
同樣客戶(hù)端也有一個(gè)發(fā)送緩沖區(qū)(默認(rèn)8k,也可以看做一個(gè)queue),用來(lái)緩沖發(fā)送的請(qǐng)求數(shù)據(jù),當(dāng)服務(wù)端的socket讀緩沖區(qū)滿時(shí),客戶(hù)端仍然不停的向服務(wù)端發(fā)送數(shù)據(jù),客戶(hù)端的socket發(fā)送緩沖區(qū)也會(huì)被填滿。這時(shí)分兩種情況:
1、如果客戶(hù)端是阻塞發(fā)送,則會(huì)一直卡在發(fā)送接口,直到服務(wù)端socket讀緩沖區(qū)可寫(xiě)或者超時(shí)(會(huì)有一個(gè)錯(cuò)誤碼)。
2、如果是非阻塞發(fā)送,發(fā)送接口會(huì)立刻返回一個(gè)錯(cuò)誤碼,錯(cuò)誤碼類(lèi)似當(dāng)前數(shù)據(jù)不可寫(xiě),稍后重試
這部分是wm處理還是系統(tǒng)處理?
socket緩沖由系統(tǒng)處理,workerman從這個(gè)緩沖讀請(qǐng)求數(shù)據(jù)。
因?yàn)橛袝r(shí)候worker可能只是某一時(shí)會(huì)不夠,大多數(shù)時(shí)沒(méi)問(wèn)題,設(shè)置太大不好。
不夠一般是由于業(yè)務(wù)阻塞太多,處理一個(gè)請(qǐng)求或者某類(lèi)比較耗時(shí),應(yīng)該增加worker進(jìn)程。比如cpu核數(shù)的8倍甚至更大。太大可能會(huì)增加進(jìn)程切換開(kāi)銷(xiāo),但是如果不夠,則無(wú)法充分利用系統(tǒng)資源,尤其是cpu資源,導(dǎo)致業(yè)務(wù)延遲。