我這里有一個真正的撓頭(對我來說)。
我有以下設定:
- Azure 中的 Kubernetes 集群(Linux 虛擬機)
- 帶有 TCP 服務器的 ASP.NET docker 映像
- 模擬 TCP 客戶端的軟體
- 用于通知傳入訊息的 RabbitMQ
同伴行為:
- 客戶端每 10 分鐘發送一次心跳
- 服務器每 5 分鐘發送一次 keep-alive(nginx-ingress 在空閑約 10 分鐘后終止連接)
我正在測驗我的新 TCP 服務器的性能。前一個是用 Java 撰寫的,可以輕松處理我將要解釋的負載。由于某種原因,用 C# 撰寫的新 TCP 服務器在大約 10-15 分鐘后斷開連接。
這是我所做的:
- 使用模擬器啟動 500 個客戶端,加速時間為 300 秒
- 所有連接都已正確建立
- 大多數時候,發送和接收第一個心跳和保持活動
Stream.EndRead()10 多分鐘后,我從連接的兩端收到 0 個位元組。
這是觸發錯誤的一段代碼。
var numberOfBytesRead = Stream.EndRead(result);
if (numberOfBytesRead == 0)
{
This.Close("no bytes read").Sync(); //this is where I end up
return;
}
在服務器端的日志記錄中,我看到很多disconnected ('no bytes read')行和很多例外表明 RabbitMQ 太忙了:None of the specified endpoints were reachable.
我的猜測是 Azure 負載均衡器只是反彈連接,但 Java TCP 服務器不會發生這種情況。或者 ASP.NET 環境缺少一些配置。
有誰知道這是怎么發生的,更重要的是,如何解決這個問題?
--更新#1--
我只用了 250 臺設備,效果很好。
我將加速減半,這又是一個問題。所以這似乎是一個性能問題。我的鏈中的一個組件太忙了。
--更新#2--
我禁用了向 RabbitMQ 的發布,它現在繼續作業。現在我必須修復 RabbitMQ 的性能。
uj5u.com熱心網友回復:
我最終在一個新任務中處理了傳入的資料。這是我現在的代碼:
public void ReceiveAsyncLoop(IAsyncResult? result = null)
{
try
{
if (result != null)
{
var numberOfBytesRead = Stream.EndRead(result);
if (numberOfBytesRead == 0)
{
This.Close("no bytes read").Sync();
return;
}
var newSegment = new ArraySegment<byte>(Buffer.Array!, Buffer.Offset, numberOfBytesRead);
// This.OnDataReceived(newSegment)); <-- previously this
Task.Run(() => This.OnDataReceived(newSegment));
}
Stream.BeginRead(Buffer.Array!, Buffer.Offset, Buffer.Count, ReadingClient.ReceiveAsyncLoop, null);
}
catch (ObjectDisposedException) { /*ILB*/ }
catch (Exception ex)
{
Log.Exception(ex, $"000001: {ex.Message}");
}
}
現在,一切都超級快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512343.html
標籤:C#网天蓝色插座
