概述
有疑问或深入讨论可加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网络协议栈 / 多队列网卡原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复