- CPU
- 内存访问速度
- 中断系统
在开始描述网络的性能分析前,先简单讲一下网卡驱动程序的收发流程。
Lemon的一个网口有16个硬件接收队列组成,每个队列深度为1024, 当网卡接收到数据时,通过多元组的RSS算法来决定分发到哪个硬件队列,并填充对应软件预先分配好的BD,一般每个控制器都会有可配置的中断聚合参数,也就是软件可以配置中断上报的频率,网卡中断聚合参数分两种,一种是中断超时,一种是中断个数(这两者的配置都是基于网卡的而不是队列的),只要其中一个条件满足后,硬件就会上报中断上报,上报中断后,先屏蔽相应的硬中断,启用软中断轮询解析BD内容,转换为协议栈识别的skb数据,向上层传递,轮询完成后,就打开硬中断,等待新的数据,如此反复循环。
Lemon的一个网口有16个硬件发送队列组成,每个队列深度为1024,由协议栈组织好SKB数据下发到驱动,再调用之前,如果网卡有多队列,首先会调用选择发送队列的函数,选择好队列后,就调用驱动注册的发送函数,驱动的发送函数主要工作是将SKB翻译成硬件识别的BD信息,然后更新tail指针,通知硬件发送,像接收一样,积攒一定数量的发送完成时间后,硬件就会中断绑定的CPU核,先屏蔽相应的硬中断,启用软中断轮询发送完成的BD, 调用函数进行资源回收,轮询结束后,就打开中断。
- 中断聚合参数的设置,此参数决定一个中断中处理的报文个数,如果在设置的过低,大流量下CPU负载过高,每次轮询的报文个数减少,如果设置过大,硬件会很容易塞满,触发PAUSE帧发送,最终导致性能降低;
- 内存的管理,第一,减少BD的数据向SKB结构体内存拷贝,第二,较少内存的申请释放,第三,CPU核尽量访问同一numa节点下的内存。
- 同一网口所有收发队列公用一个中断聚合参数,而友商网卡每个队列一个聚合参数,配置更为灵活。
- 当来一个中断后,没有DFX寄存器可以表明当前的中断是由于超时触发的还是接收、发送帧数达到触发的,此信息对调整中断参数很有帮助。
最刚开始解决的是多进程UDP性能达不到82599的标准,而且在自动化环境还发现10进程的性能还比5进程还低,甚至降到连1进程都达不到的水平,既然是XGE和82599、10线程和5线程性能的对比问题,那就测试在同等条件下这两组环境的各项对比数据,如下:
通过上述的对比数据,得出结论:无论是10进程、5进程还是3进程,XGE都是CPU核6的si占用率都100%,使用perf top命令查看热点函数,都是tx回收资源 而
tips: 期间为了加快测试速度,写了一个shell脚本进行快速
- 在跑相同进程数量的netperf,使用perf和top工具分析差异,有个明显的差异点,通过top信息看进行 top命令和82599做对比