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