status里send_fail原因
現(xiàn)象:
運(yùn)行status命令,看到有send_fail的情況,是什么原因?
答:
有send_fail通常來(lái)說(shuō)不是什么大問(wèn)題,一般是由于客戶端主動(dòng)關(guān)閉連接或者客戶端無(wú)法接收數(shù)據(jù)導(dǎo)致的數(shù)據(jù)發(fā)送失敗。
send_fail有兩種原因
1、調(diào)用send接口向客戶端發(fā)送數(shù)據(jù)時(shí)發(fā)現(xiàn)客戶端已經(jīng)斷開,則send_fail計(jì)數(shù)加1。由于是客戶端主動(dòng)斷開的,屬于正?,F(xiàn)象,一般可以忽略。
2、服務(wù)端發(fā)送數(shù)據(jù)的速度大于客戶端接收速度,導(dǎo)致數(shù)據(jù)不斷的積壓在服務(wù)端緩沖區(qū)(workerman為每個(gè)客戶端建立了一個(gè)發(fā)送緩沖區(qū)),如果緩沖區(qū)大小超過(guò)限值(TcpConnection::$maxSendBufferSize默認(rèn)1M)則會(huì)被丟棄,觸發(fā)onError事件(如果有的話),并導(dǎo)致send_fail計(jì)數(shù)加1。
例如瀏覽器最小化后js可能會(huì)暫停運(yùn)行,導(dǎo)致瀏覽器暫停接收服務(wù)端數(shù)據(jù),數(shù)據(jù)長(zhǎng)時(shí)間積壓在緩沖區(qū),超過(guò)限制后每次調(diào)用send都會(huì)導(dǎo)致send_fail計(jì)數(shù)加1。
總結(jié):
由于客戶端斷開連接導(dǎo)致的send_fail
一般不用擔(dān)心。
如果是由于客戶端停止接收數(shù)據(jù)導(dǎo)致的send_fail需要檢查下客戶端是否正常。
如果客戶端接收數(shù)據(jù)速度持續(xù)低于服務(wù)端發(fā)送速度,需要考慮優(yōu)化業(yè)務(wù)流程,或者優(yōu)化客戶端性能。如果是帶寬導(dǎo)致發(fā)送不暢可以考慮增加服務(wù)器帶寬。