6-2 - 客戶端逾時

呼叫逾時是指呼叫端發送請求後,在指定時間內未獲得對應的回應而發生的逾時。

可能原因

  1. 伺服器端處理真的比較慢,在指定時間內無法返回結果,呼叫端會自動返回一個逾時異常回應,結束呼叫。
  2. 如果伺服器端回應很快,但當用戶端負載高、壓力大的時候,會因為用戶端請求沒有發送出去或者回應卡在 TCP Buffer 等問題導致逾時。因為用戶端接收伺服器端發送的資料或者請求伺服器端的資料,都會在系統層級排隊,如果系統負載比較高的話,在核心態花費的時間會增加,導致用戶端拿到值的時候就逾時了。
  3. 通常是業務處理太慢,可以在服務提供者機器上執行:jstack [PID] > jstack.log 分析執行緒卡在哪些方法呼叫上,找出慢的原因。如果無法進行效能調校,則提高逾時閾值。

故障排除與解決步驟

  1. 客戶端和伺服器端都可能發生 GC。請檢查伺服器和客戶端的 GC 日誌。長時間的 GC 將導致逾時。逾時的發生很可能意味著呼叫方或伺服器的資源(CPU、記憶體或網路)出現瓶頸。需要檢查問題是出在伺服器端還是呼叫方,以排除 GC jitter 等疑慮。
  2. 檢查伺服器的網路品質,例如重新傳輸率,以排除網路問題。
  3. 藉助鏈路追蹤分析服務(例如阿里的 ARMS、開源的 [OpenTracing](https://github.com/opentracing/) opentracing-java 系統實現 ZipkinSkyWalking 等)來分析每個環節的耗時情況。

致謝

此錯誤碼的常見問題頁面參考了 「Dubbo 常見錯誤及解決方法」

引用文章以 CC-BY-4.0 授權編譯。在此感謝原作者。