6-2 - 客戶端逾時
呼叫逾時是指呼叫端發送請求後,在指定時間內未獲得對應的回應而發生的逾時。
可能原因
- 伺服器端處理真的比較慢,在指定時間內無法返回結果,呼叫端會自動返回一個逾時異常回應,結束呼叫。
- 如果伺服器端回應很快,但當用戶端負載高、壓力大的時候,會因為用戶端請求沒有發送出去或者回應卡在 TCP Buffer 等問題導致逾時。因為用戶端接收伺服器端發送的資料或者請求伺服器端的資料,都會在系統層級排隊,如果系統負載比較高的話,在核心態花費的時間會增加,導致用戶端拿到值的時候就逾時了。
- 通常是業務處理太慢,可以在服務提供者機器上執行:
jstack [PID] > jstack.log
分析執行緒卡在哪些方法呼叫上,找出慢的原因。如果無法進行效能調校,則提高逾時閾值。
故障排除與解決步驟
- 客戶端和伺服器端都可能發生 GC。請檢查伺服器和客戶端的 GC 日誌。長時間的 GC 將導致逾時。逾時的發生很可能意味著呼叫方或伺服器的資源(CPU、記憶體或網路)出現瓶頸。需要檢查問題是出在伺服器端還是呼叫方,以排除 GC jitter 等疑慮。
- 檢查伺服器的網路品質,例如重新傳輸率,以排除網路問題。
- 藉助鏈路追蹤分析服務(例如阿里的 ARMS、開源的 [OpenTracing](https://github.com/opentracing/) opentracing-java 系統實現 Zipkin、SkyWalking 等)來分析每個環節的耗時情況。
致謝
此錯誤碼的常見問題頁面參考了 「Dubbo 常見錯誤及解決方法」。
引用文章以 CC-BY-4.0 授權編譯。在此感謝原作者。
上次修改時間:2023 年 1 月 3 日:合併錯誤碼 3-3 至 3-8、6-4 至 99-0。 (#1796) (a687d30ae03)