Failed to allocate skb 錯誤
阿新 • • 發佈:2021-01-19
技術標籤:英偉達 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