美文网首页
问题:多个线程同时往一个网卡发包,如何提高性能

问题:多个线程同时往一个网卡发包,如何提高性能

作者: VChao | 来源:发表于2019-07-21 09:44 被阅读0次

    2019/07/21
    问题:项目中对发包过程没有使用DPDK,而且此时的多个队列要同时往一个网卡上进行发包。大致问题就是这样,虽然如果使用DPDK会好很多,但这个算是历史遗留问题吧,只能就现在这种情况,尽可能来提高性能。

    这里场景还是没有说清楚,项目中使用的发包函数是libnet提供的,也就是说我如果是发包的话,必然是要走系统网络内核的。


    我来仔细梳理一下,针对这个问题的几个难点。
    (只考虑多个进程发包,不管别的)

    1. 利用什么工具来衡量发包的性能,除了在程序内部记录相关数据,还有什么别的方式吗
    2. 从哪些角度来发现发包的瓶颈。
      现在比较尴尬的地方,就是也不知道从什么地方来验证,也不知道从什么来地方来查看。
      目前为止能用的手段就是一个查看系统的中断数;我还是希望能知道,就是如果采用这种发包方式,怎么样才能尽可能保证性能最优。

    其实说到现在都没有说到重点,还是说自己对这部分的性能调优不太理解。
    既然找不到可说的内容,说明对这部分的内容的确很薄弱,就把能有的一些想法都列举出来,尝试这种这些名目中找到一些可以优化的内容。

    • 本次发包过程中使用的函数,libnet_write底层是用的sendto,这个函数默认是阻塞的。但是尝试了修改这部分代码,并没有什么效果,所以这也是很尴尬。(但要说明的情况是,当时是为了减缓丢包的数量进行的修改,修改后丢包情况并没有减少,所以说到底是不是呢,也不好说)
    • 多个线程同时发包(底层用的是同一个网卡),是不是存在抢系统调用的情况,但这种情况怎么来看
    • 多个线程同时发包,网卡可以实现多队列,是不是可以从这个地方进行优化

    上面的说法还是不够具体,来从函数调用的流程来说明下这个情况。

    1. 一个线程调用sendto这个系统调用;
    2. sendto调用一些底层的函数,包括什么我就不管了,但是他到了底层网卡驱动的时候,是什么情况
    3. 多个线程,同时发包,是否调用多个队列,那么多个队列是否是不同的终端?
    4. 如果队列和发包线程数量不太对称怎么办?

    如此说来,我应该重点关注的是,在网卡发包部分的这个系统调用是怎么分配的,是不是说他们有冲突。


    多线程多队列单网卡发送

    上午简单翻了一下网卡模块那本数,发现这里面的关系远比我想象中的要复杂的多,所以要从中找出关键的部分:系统调用的过程、网卡队列的分配。


    当前的运行状态是配置的单队列,但是是十多个线程同时利用这个网卡进行发包,在中断部分的统计数据上看只有一个核在工作一样,所以这里的数据又说明了什么信息。

    这样看来,我需要进一步了解的信息,包括发包过程是利用了什么过程,按理说中断过程应该只为收包服务的。

    相关文章

      网友评论

          本文标题:问题:多个线程同时往一个网卡发包,如何提高性能

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