我正在Zynq 7000電路板上使用Linux的Xilinx發行版。這有兩個ARM處理器,一些L2緩存,一個DRAM接口以及大量的FPGA架構。我們的設備收集正在由FPGA處理的數據,然後通過千兆網絡將其發送到其他系統。Zynq 7000上的嵌入式Linux,丟棄了幾乎所有的UDP數據包
我們需要在此設備上支持的服務之一是SNMP,它依賴於UDP數據報,雖然SNMP確實有TCP支持,但我們不能強制客戶端使用它。
我在找的是這個系統正在丟失幾乎所有的SNMP請求。
請務必注意,網絡和CPU都不會過載。數據速率並不特別高,CPU通常在30%左右的負載下。另外,我們使用SNMP ++和Agent ++庫來管理SNMP,所以我們可以控制這些庫,所以這對於系統守護進程中斷來說並不是問題。但是,如果我們停止處理和網絡活動,則SNMP請求不會丟失。 SNMP正在自己的線程中處理,並且我們已經確保保持請求稀少和分散,以便在任何時候都不應該有超過一個請求被緩存。在CPU負載很低的情況下,應該沒有問題的上下文切換到接收進程來處理請求。
由於它不是CPU或以太網帶寬問題,我最好的猜測是問題在於Linux內核。儘管網絡負載很低,但我猜測有限的網絡堆棧緩衝區被過度填充,這就是爲什麼它會丟棄UDP數據報。
當用谷歌搜索這個,我找到了如何使用netstat報告丟失的數據包的例子,但這似乎並沒有在這個系統上工作,因爲沒有「-s」選項。我如何監控這些數據包丟失?我如何診斷原因?我如何調整內核參數以最大限度地減少這種損失?
謝謝!
在請求端可能會丟失SNMP響應,但這只是一臺普通的x86計算機,運行着大量CPU和內存的Linux。 –
把這個問題一分爲二,看看你是否可以確定數據包到達然後丟失的地方會很棒。你可以使用像wireshark這樣的工具來確保請求到達Zynq板。我建議'tcpdump'然後看看UDP數據包在內核中是否可用。你可以通過主板的flash安裝其他的linux utils。另外,UDP沒有保證傳送(我不確定SNMP是否有自己的重試邏輯ontop)。 – Phil
好吧,我個人從未使用wireshark,但我的同事們,所以我會與他們合作。至於SNMP,它有什麼是超時。在我的情況下,我試圖改變一個狀態變量,發現它沒有被設置,所以我產生了一個重試10次的線程。通常所有10次嘗試都失敗了,這令人非常痛苦。 –