美文网首页
使用netlink出现ENOBUFS问题的解决总结

使用netlink出现ENOBUFS问题的解决总结

作者: 布灵不灵的丙丙 | 来源:发表于2021-06-09 20:05 被阅读0次

    背景

    笔者负责维护的是net-snmp这份源代码,原先的代码在arp表项打满的情况下会出现严重的性能问题,原因在于使用链表来保存arp表项,而从/proc/net/arp文件中读取出来的表项是无序的,但最终又要将数据按照ifindex和ip进行排序,所以查找就十分的耗性能,笔者经过一番分析之后,采用红黑树来保存arp表项,在初始化时使用netlink从内核而不是/proc/net/arp文件把数据dump出来,红黑树的key使用ifindex与ip作为联合key进行排序,这样查找的效率就会高很多,性能问题也就因此而解决了,但是使用netlink会存在两种出错的可能,第一种是内存耗尽,第二种是用户的接收缓冲区满了,这时会返回ENOBUFS的错误,笔者当时对这种缓冲区满的情况考虑不周,主要是不知道如何复现这种情况,就处理的比较粗糙,结果真的出现了这种问题,特此记录一下

    重现步骤

    使用工具打满arp表项(16384条),禁用掉端口,导致arp瞬间失效,这时就会通知用户进程,因为用户进程处理较慢,就会出现缓冲区满的问题

    解决方案

    当出现用户进程数据与内核数据不一致的情况时,清空用户进程的数据,重新加载内核数据,保持一致性。

    相关文章

      网友评论

          本文标题:使用netlink出现ENOBUFS问题的解决总结

          本文链接:https://www.haomeiwen.com/subject/emfyeltx.html