2010-08-29 120 views
4

我們有一個生產系統從遠程設備收集遙測數據。這些數據以合理的頻率發送,我們最終在高峯時間每秒接收數千條消息。有效載荷大約爲每條消息80個字節。我開始對各種存儲機制進行一些性能測試,但是我首先想到的是,我會試着看看在沒有涉及任何數據存儲的情況下我能夠多快地推送UDP。我在本地計算機上每秒獲得大約70,000條消息的最大吞吐量(如果使用另一臺計算機發送測試數據,似乎大致相同)。從我的粗略計算來看,由於網絡鏈路容量的原因,這比我預期的要低。發送者坐在發送數據的緊密循環中。我完全知道UDP re的所有問題;丟失數據包等。我只想了解我們的系統薄弱點。C#UDPClient不良吞吐量

由於小包大小,吞吐量如此之低?

馬特

private IPEndPoint _receiveEndpoint = new IPEndPoint(IPAddress.Any, _receivePort); 
private Stopwatch sw = new Stopwatch(); 
private int _recievedCount = 0; 
private long _lastCount = 0; 
private Thread _receiverThread; 
private bool _running = true; 

_clientReceive = new UdpClient(); 
_clientReceive.Client.Bind(_receiveEndpoint); 
_receiverThread = new Thread(DoReceive); 
_receiverThread.Start(); 

    while (_running) 
    { 
    Byte[] receiveBytes = _clientReceive.Receive(ref _receiveEndpoint); 

    _clientReceive.Receive(ref _receiveEndpoint); 
    if (!sw.IsRunning) 
     sw.Start(); 
    string receiveString = Encoding.ASCII.GetString(receiveBytes); 
    _recievedCount = ++_recievedCount; 
    long howLong = sw.ElapsedMilliseconds; 
    if (howLong/1000 > _lastCount) 
    { 
     _lastCount = howLong/1000; 
     Invoke(new MethodInvoker(() => { Text = _recievedCount + " iterations in " + sw.ElapsedMilliseconds + " msecs"; })); 
    } 
} 

回答

1

許多小的UDP數據包的肯定會導致較低的網絡吞吐量比你具有更大的數據包得到你怎麼會包括IP & UDP報頭大小在你的計算中?

除此之外,70k信息/秒非常高,絕對不是你想要在互聯網上發生的事情,如果這是應用程序最終要部署的地方。即使數以千計的信息/秒也很高,如果是我,我會試着讓遙測設備的通信變得不那麼好聽,也許把多個讀數捆綁成一個傳輸。

如果這不是一種選擇,並且您在專用網絡上,並且您需要增加網絡吞吐量,則可能必須開始查看網卡,其驅動程序,然後微調一些Windows網絡參數。但是無論你如何處理這些信息,你幾乎肯定會對你做的任何處理都有所限制,尤其是在涉及到磁盤的時候,在每秒達到70k信息之前(如果你甚至可以得到這些信息,我會感到驚訝的)到10K /秒,當你做任何有用的東西時)。

+0

是的,我們在這個領域有成千上萬的這些設備,雖然我們可以遠程重新編程它,但它在蜂窩通信中的成本非常高,而且還是一本相當手冊處理。我所看到的這種情況發生在我們有一個手機供應商停機時,遙測設備排隊消息,然後當他們看到我們重新聯機時立即將它們全部交付。這是相當罕見的,但是當它發生時,我們很難受到打擊。我們設計了我們自己造成的DOS攻擊! – 2010-08-31 07:23:35

1

是的,你應該做的各種有效載荷大小的測量,看看你有多少吞吐量得到。對於小型有效負載,UDP/IP /以太網頭可能會產生開銷,可能會降低吞吐量。

也可參閱SO下面的文章:Having trouble achieving 1Gbit UDP throughput

+0

是的好評,我沒有考慮到標頭 – 2010-08-31 07:20:27