曾几何时,一切都是那么简单。网卡很慢,只有一个队列。当数据包到达时,网卡通过DMA复制数据包并发送中断,Linux内核收集这些数据包并完成中断处理。随着网卡越来越快,基于中断的模型可能会因大量传入数据包而导致 IRQ 风暴。这将消耗大部分 CPU 功率并冻结系统。
为了解决这个问题,NAPI(中断+轮询)被提议。当内核收到来自网卡的中断时,它开始轮询设备并尽快收集队列中的数据包。NAPI 可以很好地与现在常见的 1 Gbps 网卡配合使用。但是,对于10Gbps、20Gbps甚至40Gbps的网卡,NAPI可能还不够。如果我们仍然使用一个 CPU 和一个队列来接收数据包,这些卡将需要更快的 CPU。幸运的是,现在多核 CPU 很流行,那么为什么不并行处理数据包呢?
一、在优化性能的时候,首先要判断性能的瓶颈在上述的哪个地方。然后对症下药,按照下面的方法来优化
1、提高CPU性能的方法
并发。利用多线程、进程。老的线程库效率太低,需要升级用nptl 。进(线)程数不要大于cpu个数 谨慎用锁。改善架构,尽量不用锁。
慎用字符串操作,比如sprintf,snprintf,因为%d %s等等都需要CPU资源去做词法分析,数量多的话,也是不菲的开销,减少系统调用,例如time,主要消耗在用户态和内核态之间的切换。减少遍历操作。把握真实需求,简化实现方案优化架构,字符串协议解包很耗cpuÿ