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 需要檢查下客戶端是否正常。

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