1. 程式人生 > 其它 >Failed to allocate skb 錯誤

Failed to allocate skb 錯誤

技術標籤:英偉達 Jetson TX2

在我的研發專案中有個程序不斷從網路相機裡採集資料,另外一個程序將採集到的影象檔案向硬盤裡面寫。儲存到硬盤裡裡面的資料量較大時,網絡卡驅動包以下錯誤。

Failed to allocate skb
Failed to re allocate skb
prx_desc[00 ffffff800bf25bb0 187 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000

我使用的網路相機,mtu設定成1500,網路相機瘋狂掉幀,當設定成巨幀 mtu 9000時,就會出現上面的核心錯誤,導致相機採集不到影象。

若只採集影象,而不儲存的時候不會出現這種錯誤。當程序不斷將影象資料 寫入磁碟,實體記憶體很大一部分跑到cache buffer之中。cache buffer作用是當需要讀檔案的時候,會直接從cache buffer中提取,提高讀的資料。

# free -m
              total        used        free      shared  buff/cache   available
Mem:           7854        1176         138          32        6539        6556
Swap:          0           0           0

有大量實體記憶體在cache和buffer之中,free -m命令看到的free 記憶體只有100M左右。因網絡卡使用的是巨幀模式,系統網絡卡在接收大概600G流量後,系統網絡卡驅動申請不到記憶體 發生錯誤,錯誤發生次數多了,就會採集不到影象,即使重啟相機 網絡卡仍不起作用。臨時解決方案:寫個小程式隨時監控free -m 輸出的free可用記憶體,當小於1000時,sync刷記憶體到檔案,同時清除系統快取。

#!/bin/bash
while true
do
	mem=`free -m | grep Mem | awk '{print $4}'`
	#清除快取。
	if [ $mem -lt 1000 ]; then
		echo "current free mem: $mem is smalller than 1000, then clear buffer \n"
		sync
		sync
		echo 3 > /proc/sys/vm/drop_caches
	fi
	sleep 3
done