使用netlink出現(xiàn)ENOBUFS問(wèn)題的解決總結(jié)

背景

筆者負(fù)責(zé)維護(hù)的是net-snmp這份源代碼,原先的代碼在arp表項(xiàng)打滿的情況下會(huì)出現(xiàn)嚴(yán)重的性能問(wèn)題,原因在于使用鏈表來(lái)保存arp表項(xiàng),而從/proc/net/arp文件中讀取出來(lái)的表項(xiàng)是無(wú)序的,但最終又要將數(shù)據(jù)按照ifindex和ip進(jìn)行排序,所以查找就十分的耗性能,筆者經(jīng)過(guò)一番分析之后,采用紅黑樹(shù)來(lái)保存arp表項(xiàng),在初始化時(shí)使用netlink從內(nèi)核而不是/proc/net/arp文件把數(shù)據(jù)dump出來(lái),紅黑樹(shù)的key使用ifindex與ip作為聯(lián)合key進(jìn)行排序,這樣查找的效率就會(huì)高很多,性能問(wèn)題也就因此而解決了,但是使用netlink會(huì)存在兩種出錯(cuò)的可能,第一種是內(nèi)存耗盡,第二種是用戶的接收緩沖區(qū)滿了,這時(shí)會(huì)返回ENOBUFS的錯(cuò)誤,筆者當(dāng)時(shí)對(duì)這種緩沖區(qū)滿的情況考慮不周,主要是不知道如何復(fù)現(xiàn)這種情況,就處理的比較粗糙,結(jié)果真的出現(xiàn)了這種問(wèn)題,特此記錄一下

重現(xiàn)步驟

使用工具打滿arp表項(xiàng)(16384條),禁用掉端口,導(dǎo)致arp瞬間失效,這時(shí)就會(huì)通知用戶進(jìn)程,因?yàn)橛脩暨M(jìn)程處理較慢,就會(huì)出現(xiàn)緩沖區(qū)滿的問(wèn)題

解決方案

當(dāng)出現(xiàn)用戶進(jìn)程數(shù)據(jù)與內(nèi)核數(shù)據(jù)不一致的情況時(shí),清空用戶進(jìn)程的數(shù)據(jù),重新加載內(nèi)核數(shù)據(jù),保持一致性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容