关于Linux网卡调优之:RPS (Receive Packet Steering)

本文分享了作者在LVS调度均衡性问题上的解决经验,包括通过调整persistence_timeout参数来实现IP哈希,确保长连接的一致性。同时介绍了如何通过启用RPS(接收数据包导向)来优化网卡的多队列处理能力,减轻单个CPU核心的压力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 昨天在查LVS调度均衡性问题时,最终确定是 persistence_timeout 参数会使用IP哈希。目的是为了保证长连接,即一定时间内访问到的是同一台机器。而我们内部系统,由于出口IP相对单一,所以总会被哈希到相同的RealServer。

    过去使用LVS,遇到过单核CPU被软中断耗尽的问题,然后知道了网卡驱动与多队列。而后知道了淘宝对LVS的优化,然后对生产环境进行了优化,效果显著。

    如今单台LVS带宽吃到近500Mb/s,每秒进出包都过40万。此时发现网卡(4队列)对应CPU的软中断消耗已过40%了,倍感压力。按理,空闲CPU如果少于40%,则要新增节点了。关于中断不均衡的问题,听取了淘宝普空的意见,效果也非常明显,全均衡了:

 


   原来CentOS 6.1就开始支持RPS了,原生支持需要使用Linux内核2.6.38或以上版本。

   简单来讲,RPS就是让网卡使用多核CPU的。传统方法就是网卡多队列(RSS,需要硬件和驱动支持),RPS则是在系统层实现了分发和均衡。献上修改设置的脚本一例:

#!/bin/bash  
# Enable RPS (Receive Packet Steering)  
      
rfc=4096  
cc=$(grep -c processor /proc/cpuinfo)  
rsfe=$(echo $cc*$rfc | bc)  
sysctl -w net.core.rps_sock_flow_entries=$rsfe  
for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)  
do
    echo fff > $fileRps  
done
      
for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)  
do
    echo $rfc > $fileRfc  
done
      
tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
<think>我们正在处理用户关于Linux RPS配置与使用指南的问题。根据引用内容,RPSReceive Packet Steering)是Linux网络协议栈中的一项功能,用于在多核系统上分发网络接收负载,提高多处理器系统的并行处理能力。默认情况下,Linux内核不启用RPS,需要手动配置。 用户的需求是了解如何配置和使用RPS。我们将按照以下步骤组织回答: 1. 解释RPS的基本概念和工作原理。 2. 说明如何启用和配置RPS,包括配置文件和设置方法。 3. 提供验证和测试RPS效果的方法。 4. 注意事项和常见问题。 同时,根据系统级指令,我们需要在行内数学表达式使用$...$格式,独立公式使用$$...$$格式,使用中文回答,并在最后生成相关问题。 参考引用: [^1] 提到RPS需要显式启用和配置,并且数据路径取决于是否启用RPS。 [^2] 提供了化网络设备队列和中断绑定的命令,包括配置RPS的具体命令(如设置rps_cpus)和性能测试方法。 [^3] 提到了性能测试工具ab的使用,但这里我们可能更关注网络性能测试工具(如netperf)来测试RPS效果。 回答结构: 1. RPS概述 2. RPS配置步骤 3. 验证与测试 4. 注意事项 5. 相关问题 注意:由于引用内容有限,我们将结合通用知识补充RPS配置细节。</think>### Linux RPS 配置与使用指南 #### 一、RPS 技术原理 接收数据包导向(Receive Packet SteeringRPS)是 Linux 网络协议栈的软件级负载均衡机制。其核心原理是通过**哈希算法**将数据包分发到不同 CPU 核心处理,解决单队列网卡在多核环境中的瓶颈问题[^1]。工作流程如下: 1. 网卡接收数据包生成中断 2. 内核根据数据包五元组(源/目的 IP+端口,协议)计算哈希值 3. 通过哈希值映射到目标 CPU 核心 4. 通过 **IPI(处理器间中断)** 唤醒目标 CPU 处理数据包 数学表达为: $$ \text{目标CPU} = \text{hash}(\text{srcIP}, \text{dstIP}, \text{srcPort}, \text{dstPort}, \text{proto}) \mod \text{CPU\_COUNT} $$ #### 二、配置步骤 1. **检查网卡队列** ```bash ls /sys/class/net/eth0/queues/ # 确认接收队列(rx-*)存在 ``` 2. **启用 RPS** ```bash # 为每个接收队列分配CPU掩码 echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus echo f > /sys/class/net/eth0/queues/rx-1/rps_cpus ``` *掩码说明*:`f`(十六进制)= `1111`(二进制),表示使用 CPU0-3 3. **整流表大小**(可选) ```bash echo 32768 > /proc/sys/net/core/rps_sock_flow_entries # 总流表大小 echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt # 单队列流表 ``` #### 三、性能验证 1. **监控 CPU 负载分布** ```bash mpstat -P ALL 1 # 观察各CPU软中断(si%)是否均衡 ``` 2. **网络性能测试** ```bash # 使用ab测试(需安装httpd) ab -n 100000 -c 500 http://localhost/ # 对比启用RPS前后的RPS值 grep "Requests per second" ab_report.log ``` 3. **跟踪数据包路径** ```bash ftrace -t netif_receive_skb_entry # 验证数据包分发路径 ``` #### 四、生产环境最佳实践 1. **拓扑感知配置** ```bash # NUMA架构化(例:CPU0-3属于NUMA0) echo 0f > /sys/class/net/eth0/queues/rx-0/rps_cpus ``` 2. **与RFS联动** ```bash echo 1 > /proc/sys/net/core/rps_sock_flow_entries # 启用RFS ``` 3. **中断绑定化** ```bash # 将网卡中断绑定到特定核心 echo 02 > /proc/irq/$(grep eth0 /proc/interrupts | cut -d: -f1)/smp_affinity ``` #### 五、注意事项 1. **适用场景**: - 万兆及以上高速网络 - 虚拟化环境(VM、容器) - 网络密集型应用(视频流、CDN) 2. **禁用条件**: - 单核处理器系统 - 已启用硬件RSS(`ethtool -n eth0` 查看) - 网络延迟敏感型应用(可能增加 $5-10\mu s$ 延迟) 3. **监控指标**: ```bash cat /proc/net/softnet_stat # 第2列:RPS丢包计数 ``` [^1]: RPS 通过软件模拟多队列实现负载均衡,特别适合虚拟化环境和云主机 [^2]: 配置需结合 NUMA 拓扑和中断亲和性,避免跨节点内存访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值