关于linux 软中断对网卡性能的影响以及优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于linux 软中断对网卡性能的影响以及优化相关的知识,希望对你有一定的参考价值。
参考技术A 首先,要对软中断有一个认识,程序运行后,操作系统会发送程序需要的一些cpu指令到某个cpu,扔给CPU的这个过程是异步的,cpu获得指令后操作完成会触发一个硬中断,并且把操作的结果保存在寄存器,之后linux内核会启动ksofttrip进程去,来获取操作结果,这个动作就叫做软中断。linux默认会起n个ksofttrip进程,n等于cpu的个数,ksofttrip是死循环,只要有软中断,它就会一直去获取,n个ksoftrip获取源是一样的,为什么要起n个进程呢?就是为了 ,当某个cpu空闲,哪个就去跑。通常操作系统里它的进程名是 ksoftrip/n ,n是对应的cpu的编号,ksoft进程跟cpu是一对一绑定的。
现在来说说网卡的性能问题,要想优化,首先你的网卡必须是多通道队列的。那如何知道你的网卡是否是多队列的呢? 通过cat /proc/interrept |grep eth0|wc -l 可以看到网卡通道队列的数量.
现在来来说说优化方案,为什么要优化,因为linux默认情况所有的网卡的软中断都是的cpu0,所以加入你的ksoftrip/0总是跑满,就说明可能是网卡问题了。
方案1 ,SMP IRQ affinity技术
说白了,就是信号量分布技术,把特定信号量的处理放到固定的cpu上,每个网卡的通道队列都有一个自己的信号量。
首先查看所有网卡通道队列的信号量,方法 cat/proc/interrept |grep eth0
每行最开头的数字“n:”就是信号量,在/proc/irq/下面可以找到对应的以信号量命名的目录
找完了之后,可以进行信号量绑定了,在/proc/irq/n/下面有两个文件,分别是smp_affinity跟smp_affinity_list, 这两个是文件的内容是对应的,smp_affinity里是通过bitmask算法绑定cpu,smp_affinity_list是通过数字指定cpu编号的方法,例如 cpu0,文件里就是“0”,如果是cpu1跟2就是“1,2”
!!重点来了,虽然默认里面填写的是多个,但是!!!但是它只跑在绑定cpu中的第一个!!!坑啊!!!
所以,你要做的就是单独绑定每一个网卡的通道队列。
直接echo "1" >/proc/irq/ (cpu1的信号量)/snmp_affinity_list
echo "3" >/proc/irq/$(cpu2的信号量)/snmp_affinity_list
这个是最快速的解决方案,提升效率显著啊!!!
升级方案2,在方案1基础之上,RPS/RFS技术
此技术大家可以查网上,文章很多,优化效果是,单个网卡通道队列的软中断会平均到所有cpu上,并且会优化为,中断落在发出中断的程序所在的那个cpu上,这样节省了cpu cache。
坏消息是对单队列网卡而言,「smp_affinity」和「smp_affinity_list」配置多CPU无效。
好消息是Linux支持RPS,通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能。
首先看看如何配置RPS,如果CPU个数是 8 个的话,可以设置成 ff:
shell> echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus
接着配置内核参数rps_sock_flow_entries(官方文档推荐设置: 32768):
shell> sysctl net.core.rps_sock_flow_entries=32768
最后配置rps_flow_cnt,单队列网卡的话设置成rps_sock_flow_entries即可:
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
说明:如果是多队列网卡,那么就按照队列数量设置成 rps_sock_flow_entries / N 。
Linux性能优化从入门到实战:05 CPU篇:硬中断软中断
??软中断(softirq)会导致CPU 使用率升高
??中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。并且当CPU执行在中断处理函数中时,不会响应同时发生的又一次中断。
??所以为了加快中断处理程序执行和解决中断丢失的问题,Linux将中断分为上半部和下半部。
??上半部,硬中断,用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作,会打断 CPU 正在执行的任务。
??下半部,软中断,用来延迟处理上半部未完成的工作,通常由内核触发,以内核线程的方式运行。并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/
??如:网卡接收数据的过程。对上半部来说,是把网卡的数据读到内存中,然后更新一下硬件寄存器的状态,再发送一个软中断信号,下半部就从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。
??
查看软中断和内核线程
??proc 文件系统,是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置。
??TASKLET 是最常用的软中断实现机制,每个 TASKLET 只运行一次就会结束 ,并且只在调用它的函数所在的 CPU 上运行。
$ cat /proc/softirqs // 提供了软中断的运行情况:类型 + 中断次数
CPU0 CPU1
HI: 2 0
TIMER: 13086 12592
NET_TX: 2 29
NET_RX: 110 1803
BLOCK: 8584 7866
IRQ_POLL: 0 0
TASKLET: 24 59
SCHED: 10279 10218
HRTIMER: 0 0
RCU: 14262 13818
$ cat /proc/interrupts // 提供了硬中断的运行情况
CPU0 CPU1
0: 35 0 IO-APIC 2-edge timer
1: 11 189 IO-APIC 1-edge i8042
$ ps aux | grep softirq // 查看软中断内核线程
root 6 0.0 0.0 0 0 ? S 22:59 0:00 [ksoftirqd/0]
root 16 0.0 0.0 0 0 ? S 22:59 0:00 [ksoftirqd/1]
??
??
案例调试方法:
??sar 是一个系统活动报告工具,既可以实时查看系统的当前活动,又可以配置保存和报告历史统计数据。
??hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试等。
# -S 参数表示设置 TCP 协议的 SYN(同步序列号),-p 表示目的端口为 80
# -i u100 表示每隔 100 微秒发送一个网络帧
# 注:如果你在实践过程中现象不明显,可以尝试把 100 调小,比如调成 10 甚至 1
$ hping3 -S -p 80 -i u100 192.168.0.30
??tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题。
??Step 1:通过 top 查看软中断使用情况:
$ top # 运行后按数字 1 切换到显示所有 CPU
top - 10:50:58 up 1 days, 22:10, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 122 total, 1 running, 71 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 3.3 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni, 95.6 id, 0.0 wa, 0.0 hi, 4.4 si, 0.0 st
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7 root 20 0 0 0 0 S 0.3 0.0 0:01.64 ksoftirqd/0
16 root 20 0 0 0 0 S 0.3 0.0 0:01.97 ksoftirqd/1
??Step 2:查看 /proc/softirqs 变化速率,使用 watch 可以看到变化,明确变化最大的软中断类型:TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)等
$ watch -d cat /proc/softirqs
CPU0 CPU1
HI: 0 0
TIMER: 1083906 2368646
NET_TX: 53 9
NET_RX: 1550643 1916776
BLOCK: 0 0
IRQ_POLL: 0 0
TASKLET: 333637 3930
SCHED: 963675 2293171
HRTIMER: 0 0
RCU: 1542111 1590625
??Step 3:通过 sar 查看系统具体情况:
$ sar -n DEV 1 # -n DEV 表示显示网络收发的报告,间隔 1 秒输出一组数据
15:03:46 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
15:03:47 eth0 12607.00 6304.00 664.86 358.11 0.00 0.00 0.00 0.01
15:03:47 docker0 6302.00 12604.00 270.79 664.66 0.00 0.00 0.00 0.00
15:03:47 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
15:03:47 veth9f6bbcd 6302.00 12604.00 356.95 664.66 0.00 0.00 0.00 0.05
// 第一列:表示报告的时间
// 第二列:IFACE 表示网卡
// 第三、四列:rxpck/s 和 txpck/s 分别表示每秒接收、发送的网络帧数,也就是 PPS。
// 第五、六列:rxkB/s 和 txkB/s 分别表示每秒接收、发送的千字节数,也就是 BPS。
// 664 * 1024 / 12607 = 54 字节,小包数据!!!
??Step 4:针对上述网络小包问题,通过 tcpdump 查看具体网络和端口的问题:
# -i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
# tcp port 80 表示只抓取 tcp 协议并且端口号为 80 的网络帧
$ tcpdump -i eth0 -n tcp port 80
15:11:32.678966 IP 192.168.0.2.18238 > 192.168.0.30.80: Flags [S], seq 458303614, win 512, length 0
...
??
??
??
??
??
以上是关于关于linux 软中断对网卡性能的影响以及优化的主要内容,如果未能解决你的问题,请参考以下文章