閘道器資料丟失分析處理

2021-10-01 21:34:46 字數 2945 閱讀 5355

如果系統是因為防火牆而丟包,表現的行為一般是所有的報文都無法正常接收,要排查的業務中只是部分相對少量丟包,認為非防火牆問題。(當然不排除防火牆只 drop 一部分報文的可能性。如果遇到丟包比率非常大的情況,防火牆某規則主動 drop udp 報文)

a、檢視丟棄資料報數目?

發現為0,認為正常

b、檢查丟棄連線數目?

發現為0.認為正常

a、檢視網絡卡丟包資料

命令 ifconfig eth0

檢視顯示結果中 errors 和 dropped 數目

errors 0  dropped 0

備註:如果硬體或者驅動沒有問題,一般網絡卡丟包是因為設定的快取區(ring buffer)太小

檢查發現每乙個節點errors和dropped查詢值都為0,繼續往下排查

b、檢查報文資料

命令 netstat -s -u

發現其餘節點都正常,但是有兩台ecs表現如下

上述的表現中 udp buffer size 不足

linux 系統在接收報文之後,會把報文儲存到快取區中。因為快取區的大小是有限的,如果出現 udp 報文過大(超過快取區大小或者 mtu 大小)、接收到報文的速率太快,都可能導致 linux 因為快取滿而直接丟包的情況。

在系統層面,linux 設定了 receive buffer 可以配置的最大值,可以在下面的檔案中檢視,一般是 linux 在啟動的時候會根據記憶體大小設定乙個初始值。

/proc/sys/net/core/rmem_max:允許設定的 receive buffer 最大值

/proc/sys/net/core/rmem_default:預設使用的 receive buffer 值

/proc/sys/net/core/wmem_max:允許設定的 send buffer 最大值

/proc/sys/net/core/wmem_****ult:預設使用的 send buffer 最大值

但是這些初始值並不是為了應對大流量的 udp 報文,如果應用程式接收和傳送 udp 報文非常多,把這個值調大。可以使用 sysctl 命令讓它立即生效:

sysctl -w net.core.rmem_max=26214400 # 設定為 25m

也可以修改 /etc/sysctl.conf 中對應的引數在下次啟動時讓引數保持生效。

我們發現異常節點上 net.core.rmem_max  沒有進行配置

而正常節點上

net.core.rmem_max = 10242880

我們直接把正常節點上的 /etc/sysctl.conf 所有配置引數直接複製到兩個非正常的兩個節點上。保證所有節點配置一致。

備註:  sysctl -a |grep net.core  檢視引數設定

接收最大值設定

sysctl -w net.core.rmem_max=56214400# 設定為 50m

接收預設值設定

sysctl -w net.core.rmem_default=26214400# 設定為 25m

傳送最大值

sysctl -w net.core.wmem_max=26214400# 設定為 25m

傳送預設值

sysctl -w net.core.wmem_default=26214400# 設定為 25m

檢視這個檔案設定大小

vim /proc/sys/net/core/rmem_max

vim /proc/sys/net/core/rmem_default

vim /proc/sys/net/core/wmem_max

vim /proc/sys/net/core/wmem_default

c、應用丟包

上面提到系統的 udp buffer size,調節的 sysctl 引數只是系統允許的最大值,每個應用程式在建立 socket 時需要設定自己 socket buffer size 的值。linux 系統會把接受到的報文放到 socket 的 buffer 中,應用程式從 buffer 中不斷地讀取報文。netty中我們也會設定快取區大小。其中 socket buffer size 大小以及應用程式讀取報文的速度。receive buffer 會減少丟包的可能性,但同時會導致應用使用更多的記憶體,所以需要謹慎使用。另外乙個因素是應用讀取 buffer 中報文的速度,對於應用程式來說,處理報文應該採取非同步的方式。

d、此外,要處理的實際業務中,每乙個連線會占用乙個控制代碼,測試有反饋有"too many open files"的錯誤。這可能導致資料丟失而沒有正確執行實際業務。

# ulimit -n  命令檢查ecs後,有兩台ecs控制代碼數目很小,是系統預設測數值65535。而其它ecs設定為

我們進行如下設定:

d1 修改檔案:/etc/security/limits.conf

* soft nofile 165535#限制單個程序最大檔案控制代碼數(到達此限制時系統報警)  

* hard nofile 165535#限制單個程序最大檔案控制代碼數(到達此限制時系統報錯) 

d2  執行命令:/sbin/sysctl -p 使配置生效

d3 對當前 session生效

ulimit -n 165535

d4  備註:檢視設定

ulimit -a

檢視某個程序控制代碼數目

lsof -p 1296 | wc -l

經過上述設定後,後續再進一步繼續觀察監測,是否有資料丟失。

資料丟失處理方法

訓練資料中樣本特徵值的部分缺失是很棘手的問題,很多文獻致力於解決該問題,因為資料直接丟掉太可惜,重新獲取代價也昂貴。一些可選的資料丟失處理方法包括 1 使用可用特徵的均值來填補缺失值 2 使用特殊值來 真補缺失值,如 1 3 忽略有缺失值的樣本 4 使用相似樣本的均值添補缺失值 5 使用另外的機器學...

pandas處理丟失資料

有兩種丟失資料的方式 none np.nan nan 1,none none是python當中自帶的,型別為python object,所以,none是不能參與到任何的計算當中的 2,np.nan np.nan是浮點型別,能參與到計算當中,但是計算的結果為nan pandas中none與np.nan...

Pandas處理丟失資料

pandas處理丟失資料 1 建立含nan的矩陣 dates pd.date range 20130101 periods 6 df pd.dataframe np.arange 24 reshape 6,4 index dates,columns a b c d df.iloc 0,1 np.na...