sendbuffertoworker fail. may be the send buffer are overflow
說明
出現(xiàn)這個(gè)錯(cuò)誤說明服務(wù)端處理請求的速度低于客戶端發(fā)送請求的速度。 例如服務(wù)端處理一個(gè)請求需要10毫秒,那么單個(gè)進(jìn)程每秒最多處理100個(gè)請求,如果客戶端每秒發(fā)來200個(gè)請求,
那么就有100個(gè)請求排隊(duì)等待處理。如果是一直處于這種狀態(tài),則會有越來越多的請求積壓在請求隊(duì)列,導(dǎo)致請求被延遲處理,
最終導(dǎo)致積壓數(shù)據(jù)大小超過隊(duì)列緩沖區(qū)上限(上限受$Gateway->sendToWorkerBufferSize控制),然后報(bào)出這個(gè)錯(cuò)誤。
可以調(diào)大businessWoreker進(jìn)程數(shù)緩解問題,但是想根本解決問題需要從以下途徑解決:
運(yùn)行 php start.php status 命令檢查是否有busy的進(jìn)程。
出現(xiàn)busy進(jìn)程則可能是以下原因:
1、業(yè)務(wù)代碼有死循環(huán)。表現(xiàn)為對應(yīng)進(jìn)程占用cpu率很高,對應(yīng)進(jìn)程一直是busy狀態(tài)
2、業(yè)務(wù)代碼可能阻塞在某個(gè)外部資源請求上。表現(xiàn)為對應(yīng)進(jìn)程占用cpu使用率很低,對應(yīng)進(jìn)程一直是busy狀態(tài)
3、業(yè)務(wù)執(zhí)行比較慢,表現(xiàn)為busy的進(jìn)程過一會兒恢復(fù)成idle狀態(tài)
4、有大量的請求需要進(jìn)程處理,表現(xiàn)為對應(yīng)進(jìn)程cpu很高
如果busy進(jìn)程對應(yīng)的cpu占用很高,需要review代碼看看哪里有while(1) foreach for類似的代碼。
如果cpu不高,需要用 strace -ttp $pid 命令跟蹤下businessWorker進(jìn)程系統(tǒng)調(diào)用,
是否有read(fd=x、 poll(fd=x類似的代碼,如果有說明進(jìn)程在等待某個(gè)fd的數(shù)據(jù)返回,
這時(shí)用lsof -p $pid | grep $fd 查看進(jìn)程在等待哪個(gè)外部資源的返回,從而定位是哪里問題。
如果是業(yè)務(wù)比較慢,則需要打日志定位下業(yè)務(wù)哪個(gè)部分比較耗時(shí),然后做響應(yīng)優(yōu)化。
如果是有大量的請求需要處理,可以考慮降低請求量或者增加businessWorker進(jìn)程數(shù)量或者增加服務(wù)器分布式部署。