Linux内核协议栈性能瓶颈

在x86体系结构中,接收数据包的传统方式是CPU中断方式,即网卡驱动接收到数据包后通过中断通知CPU处理,然后由CPU拷贝数据并交给内核协议栈。在数据量大时,CPU中断方式会产生大量 CPU中断,导致CPU负载较高。

Linux性能优化(九)——Kernel Bypass


(1)硬件中断导致的线程、进程切换
硬件中断请求会抢占优先级较低的软件中断,频繁到达的硬件中断和软中断意味着频繁的线程切换,随着而来的就是运行模式切换、上下文切换、线程调度器负载、高速缓存缺失(Cache Missing)、多核缓存共享数据同步、竞争锁等一系列的CPU性能损耗。
(2)内存拷贝
网卡驱动位于内核态,网络驱动接收到数据包后会经过内核协议栈的处理,然后再拷贝到用户态的应用层缓冲区.从内核态到用户态的数据拷贝是耗时操作,数据拷贝的时间会占数据包处理流程时间的50%以上。
(3)多处理器平台CPU漂移
一个数据包可能中断在CPU0,内核态处理在CPU1,用户态处理在 CPU2,跨多个物理核(Core)处理会导致大量的 CPU Cache命中缺失,造成局部性失效。对于NUMA架构,还会出现跨NUMA节点的内存访问,极大地影响CPU性能。
(4)缓存失效
传统服务器大多采用页式虚拟存储器,内存页默认为4K的小页,在存储空间较大的处理机上会存在大量的页面映射项。同时由于TLB缓存空间有限,最终导致TLB快表的映射项频繁变更,产生大量的TLB命中缺失。
 

猜你喜欢

转载自blog.csdn.net/weixin_44260459/article/details/120922144
今日推荐