如果系統是因為防火牆而丟包,表現的行為一般是所有的報文都無法正常接收,要排查的業務中只是部分相對少量丟包,認為非防火牆問題。(當然不排除防火牆只 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...