status里send_fail原因

現象:

執行status指令時,發現有send_fail的情況,是什麼原因?

答:

一般來說,send_fail通常不是什麼大問題,通常是由於客戶端主動關閉連接或者客戶端無法接收數據導致的數據發送失敗。

send_fail有兩種原因

  1. 調用send接口向客戶端發送數據時發現客戶端已經斷開,則send_fail計數加1。由於是客戶端主動斷開的,屬於正常現象,一般可以忽略。

  2. 服務端發送數據的速度大於客戶端接收速度,導致數據不斷的積壓在服務端緩衝區(workerman為每個客戶端建立了一個發送緩衝區),如果緩衝區大小超過限值(TcpConnection::$maxSendBufferSize默認1M),則會被丟棄,觸發onError事件(如果有的話),並導致send_fail計數加1。

例如瀏覽器最小化後js可能會暫停運行,導致瀏覽器暫停接收服務端數據,數據長時間積壓在緩衝區,超過限制後每次調用send都會導致send_fail計數加1。

總結:

由於客戶端斷開連接導致的send_fail一般不用擔心。

如果是由於客戶端停止接收數據導致的send_fail需要檢查下客戶端是否正常。

如果客戶端接收數據速度持續低於服務端發送速度,需要考慮優化業務流程,或者優化客戶端性能。如果是帶寬導致發送不順可以考慮增加伺服器帶寬。