本文介紹如何排查和解決程式串連MSE Nacos出現的逾時問題。
問題現象
當程式串連MSE Nacos出現逾時問題時,可能出現如下幾種報錯:
Connection timed out
Read Timeout
TimeoutException: Waited 3000 milliseconds
問題原因
可能是以下幾種原因,導致程式串連MSE Nacos出現逾時問題。
用戶端與服務端之間的網路傳輸出現問題,導致用戶端發出的請求無法抵達服務端或服務端的回複無法抵達用戶端。或者服務端處理請求速度慢,導致用戶端誤認為逾時。
公網網域名稱被ACL策略攔截。
使用VPN導致的網路問題。
用戶端的處理線程阻塞或異常,亦或用戶端處於Full GC、OOM或CPU爭搶等狀態, 無法及時處理服務端返回的資料包,導致用戶端誤認為逾時。
解決方案
如果您僅有某一個用戶端節點出現逾時報錯,可能是這些用戶端節點與MSE Nacos之間的網路出現問題,或是這些用戶端節點存在異常或阻塞。
此時,您可在錯誤所在的用戶端節點上,使用
ping、telnet和curl等命令,訪問MSE Nacos叢集。查看用戶端監控是否存在高CPU使用率、頻繁FullGC和OOM等資訊,以此排查是否存在網路問題。ping ${mse.nacos.host} telnet ${mse.nacos.host} 8848 curl ${mse.nacos.host}:8848/nacos/v1/ns/service/list如果您使用的是公網網域名稱,請查看是否被ACL策略攔截。
如何查看是否被ACL策略攔截,請參見設定白名單。
如果您使用私網網域名稱,請查看應用是否部署在同一個地區(Region)的同一個私人網路(VPC)內。如果部署於不同的地區或屬於不同的私人網路,您需要將應用部署於MSE Nacos所在的地區或私人網路內,或使用雲企業網打通不同私人網路。關於雲企業網的更多資訊,請參見什麼是雲企業網。
在MSE控制台的基本資料頁面,可查看MSE Nacos所處的地區和內網地址對應的VPC ID。
如果您使用了VPN,請關閉VPN或查看VPN設定後重試。
如果您的錯誤資訊存在於所有的用戶端節點,請在MSE控制台的監控中心頁面,查看Nacos的如下資訊:
如何查看Nacos監控中心的資料,請參見監控引擎。
在概覽頁簽,查看引擎的每秒查詢數和每秒運算元是否超過了每秒處理請求數(TPS)。
關於每秒處理數的取值,請參見執行個體能力評估。
在串連數監控頁簽,查看用戶端版本數量和長鏈路數量是否超過了串連數。
關於串連數的取值,請參見執行個體能力評估。
在jvm監控頁簽,查看引擎Full GC是否頻繁出現。
說明No data表示從未進行過Full GC。
當Nacos引擎的網路類型為公網網路時,在資源監控頁簽,查看資源的入口流量和出口流量是否超出購買時指定的頻寬大小。
在資源監控頁簽,查看資源的記憶體使用量率和CPU使用率是否接近或超過100%,導致超出承受能力後被限流。請嘗試變更執行個體規格進行升配。
如何變更執行個體規格,請參見變更執行個體規格。
如果僅是偶爾發生逾時錯誤,請考慮設定更長的逾時時間避免此類問題。
若您的Java Client版本為1.0.0~1.4.X,請在應用進程的JVM參數中添加如下參數:
-D com.alibaba.nacos.client.naming.ctimeout=${註冊中心連線逾時時間,單位毫秒,預設3000} -D com.alibaba.nacos.client.naming.rtimeout=${註冊中心請求逾時時間,單位毫秒,預設50000} -D NACOS.CONNECT.TIMEOUT=${配置中心連線逾時時間,單位毫秒,預設1000}若您的Java Client版本為2.0.0~2.1.1, 請將Java Client版本先升級至2.1.2及以上,再設定逾時時間。
若您的Java Client版本為2.1.2及以上,請在應用進程的JVM參數中添加如下參數:
-Dnacos.remote.client.grpc.timeout=${請求逾時,單位毫秒,預設3000} ## 檢測所已連線的服務端是否健康,不健康則觸發重連 -Dnacos.remote.client.grpc.server.check.timeout=${服務端健康檢測,單位毫秒,預設3000} ## 檢測當前串連狀態是否健康,不健康則觸發重連 -Dnacos.remote.client.grpc.health.timeout=${串連健康檢測,單位毫秒,預設3000}