我是靠谱客的博主 调皮狗,最近开发中收集的这篇文章主要介绍Linux网络协议栈 / 多队列网卡原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

有疑问或深入讨论可加qq: 2542956244


1. LVS故障: 

       背景: 近日因公司大促, mysql从服务器前端共享的一台LVS因流量跑到2Gps 而出现 LVS丢包, Client端代码不停抛出mysql connect failed异常. 

        故障特征:大流量时为LVS的CPU其中一个core使用率100%, 其他23个core使用率小于10% ; 明显地 

        根本原因: LVS使用Linux内核为2.6.18, kernel处理入站数据包时全部交给一个核心处理;  

        解决方法: 升级OS为kernel 2.6.32以上版本, 使用支持MSI-X网卡(现市面大部分机型如Dell R730、HP DL580都支持), LVS软件调优

        优化效果: top的si%(软中断)平均分布到所有核心, 单机承载力上升400%, new_connection处理能力从3w上升到20w, 流量承载力从700M上升到1500M. 




2. 网络协议栈数据流程(MSI-X多队列网卡):

    2.1  网卡预先在ram分配多个Ring_buffer队列, 每队列绑定一个CPU(/proc/irq/${IRQ}/smp_affinity

    2.2  网卡收到数据包, 保存在 NIC的 internal buffer(64k), 

    2.3  网卡根据hash算法, 通过DMA将skb保存到多个Ring_buffer队列中的一个(假设此队列绑定IRQ为IRQ100, 绑定cpu核心为 core-03),  

    2.4 网卡使用IRQ100 中断号hardirq通知core-03(irq-handler)ring的数据就绪. 

    2.5 core-03(driver)启动NAPI处理Ring内数据(skb), 此过程为软中断

    2.6 NAPI将处理后的skb交给网络协议栈(ip_rcv,tcp_rcv处理), 且保存在socket_buffer区

    2.7 应用程序用read方法读取socket_buffer区就绪的数据包. 

    关键信息:  

        收包流程: frame -> 网卡 -> Ring_buffer -> 硬中断(IRQ-Handler) -> 软中断处理(NAPI) -> 网络协议栈(ip_rcv/tcp_rcv) -> application 


3. 名词解析:

    NAPI:  2.5内核版本引入的网络子系统, 提供给Driver的接口; 

        优点: 传统intterrupt每个数据要中断一次CPU, NAPI改为一次中断消费n个数据包(budget), 大大减少中断数量; 

        适用场景: 大量小包的环境. 




最后

以上就是调皮狗为你收集整理的Linux网络协议栈 / 多队列网卡原理的全部内容,希望文章能够帮你解决Linux网络协议栈 / 多队列网卡原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部