2019/07/21
问题:项目中对发包过程没有使用DPDK,而且此时的多个队列要同时往一个网卡上进行发包。大致问题就是这样,虽然如果使用DPDK会好很多,但这个算是历史遗留问题吧,只能就现在这种情况,尽可能来提高性能。
这里场景还是没有说清楚,项目中使用的发包函数是libnet提供的,也就是说我如果是发包的话,必然是要走系统网络内核的。
我来仔细梳理一下,针对这个问题的几个难点。
(只考虑多个进程发包,不管别的)
- 利用什么工具来衡量发包的性能,除了在程序内部记录相关数据,还有什么别的方式吗
- 从哪些角度来发现发包的瓶颈。
现在比较尴尬的地方,就是也不知道从什么地方来验证,也不知道从什么来地方来查看。
目前为止能用的手段就是一个查看系统的中断数;我还是希望能知道,就是如果采用这种发包方式,怎么样才能尽可能保证性能最优。
其实说到现在都没有说到重点,还是说自己对这部分的性能调优不太理解。
既然找不到可说的内容,说明对这部分的内容的确很薄弱,就把能有的一些想法都列举出来,尝试这种这些名目中找到一些可以优化的内容。
- 本次发包过程中使用的函数,libnet_write底层是用的sendto,这个函数默认是阻塞的。但是尝试了修改这部分代码,并没有什么效果,所以这也是很尴尬。(但要说明的情况是,当时是为了减缓丢包的数量进行的修改,修改后丢包情况并没有减少,所以说到底是不是呢,也不好说)
- 多个线程同时发包(底层用的是同一个网卡),是不是存在抢系统调用的情况,但这种情况怎么来看
- 多个线程同时发包,网卡可以实现多队列,是不是可以从这个地方进行优化
上面的说法还是不够具体,来从函数调用的流程来说明下这个情况。
- 一个线程调用sendto这个系统调用;
- sendto调用一些底层的函数,包括什么我就不管了,但是他到了底层网卡驱动的时候,是什么情况
- 多个线程,同时发包,是否调用多个队列,那么多个队列是否是不同的终端?
- 如果队列和发包线程数量不太对称怎么办?
如此说来,我应该重点关注的是,在网卡发包部分的这个系统调用是怎么分配的,是不是说他们有冲突。
多线程多队列单网卡发送
上午简单翻了一下网卡模块那本数,发现这里面的关系远比我想象中的要复杂的多,所以要从中找出关键的部分:系统调用的过程、网卡队列的分配。
当前的运行状态是配置的单队列,但是是十多个线程同时利用这个网卡进行发包,在中断部分的统计数据上看只有一个核在工作一样,所以这里的数据又说明了什么信息。
这样看来,我需要进一步了解的信息,包括发包过程是利用了什么过程,按理说中断过程应该只为收包服务的。
网友评论