当前位置: 首页 > news >正文

Linux编程:嵌入式ARM平台Linux网络实时性能优化

文章目录

    • 0. 概要
    • 1. 时钟周期与网络性能的权衡
      • 时钟周期(ClockPeriod)
        • **优化策略:**
        • **副作用:**
    • 2. 网络中断优化
        • **问题:**
        • **优化策略:**
        • **副作用:**
    • 3. 网络协议栈优化
        • **优化策略:**
        • **副作用:**
    • 4. 禁用内存页面交换(禁用 Swap)
      • 为什么禁用 Swap?
      • **禁用 Swap 配置:**
      • **副作用:**
    • 5. 配置 `swappiness` 为 0
      • **如何设置 `swappiness` 为 0:**
      • **副作用:**
    • 6. 网络吞吐量与 CPU 调度
        • **优化策略:**
        • **副作用:**
    • 7. 使用硬件辅助优化
        • **优化策略:**
        • **副作用:**
    • 更多阅读

0. 概要

本文将通过优化时钟周期、网络中断处理、协议栈配置、CPU 调度等配置来提升网络吞吐量,尤其是 UDP 数据包的处理效率。同时也将分析这些优化措施可能带来的副作用和对系统资源的影响。

1. 时钟周期与网络性能的权衡

时钟周期(ClockPeriod)

优化策略:
  • 启用高分辨率定时器:对于实时性要求高的应用,建议配置内核,启用高分辨率定时器(CONFIG_HIGH_RES_TIMERS),以提高定时器精度。

    make menuconfig  # 打开Linux内核配置
    CONFIG_HIGH_RES_TIMERS=y
    
  • 合理选择时钟周期:选择适当的时钟周期,使其在精度和 CPU 负载之间找到平衡。可通过测试找到最适合的时钟周期。

副作用:
  • CPU 负担增加:高分辨率定时器提高了系统调度的精度,但也增加了频繁的上下文切换和时钟更新,可能会增加 CPU 资源的消耗,特别是在 CPU 负载本已较重的情况下。
  • 过短的时钟周期可能会导致 CPU 资源被频繁的中断处理占用,从而影响网络中断的响应,尤其是在高流量的 UDP 数据包处理中。

2. 网络中断优化

问题:
  • 中断过于频繁:默认情况下,网络驱动会为每个数据包触发一次中断,这在高流量场景下会大幅增加 CPU 的负载,降低 UDP 数据包的吞吐量。
  • 中断竞争:在多核系统中,多个中断可能争夺 CPU 资源,导致缓存失效和上下文切换开销,进一步影响性能。
优化策略:
  • 启用 NAPI:通过启用 NAPI(New API)合并中断,减少中断的频率,优化 CPU 的使用。
    ethtool -C eth0 rx-usecs 10
    
  • 中断优先级调整:调整网络中断的优先级,确保网络中断能在系统繁忙时优先处理。
    echo 1 > /proc/irq/<irq_number>/smp_affinity_list
    
  • 中断绑定(CPU 绑定):将网络中断绑定到特定的 CPU 核心,减少跨核上下文切换开销。
    echo 1 > /sys/class/net/eth0/queues/rx-0/rps_cpus
    
副作用:
  • 内存使用增加:NAPI 的合并中断可能会导致系统使用更多的内存来存储等待处理的数据包,特别是在大流量情况下。
  • 延迟增加:尽管中断频率减少,但合并中断和轮询可能会导致延迟略有增加,尤其是在低流量场景下。

3. 网络协议栈优化

在高吞吐量应用中,网络协议栈的一些默认配置可能成为性能瓶颈。

优化策略:
  • 调整缓冲区大小:合理调整 UDP 接收和发送缓冲区的大小,以优化吞吐量。
    sysctl -w net.core.rmem_max=16777216
    sysctl -w net.core.wmem_max=16777216
    
  • 禁用不必要的协议:如果系统不需要 IPv6 或其他协议,可以通过禁用这些协议来减少协议栈的负担。
    sysctl -w net.ipv6.conf.all.disable_ipv6=1
    
副作用:
  • 内存消耗增加:增大缓冲区大小会增加内存的消耗,特别是在高负载的情况下,可能导致系统内存紧张。

4. 禁用内存页面交换(禁用 Swap)

为什么禁用 Swap?

交换空间(swap)允许操作系统将不常用的数据页从内存移至硬盘,当系统内存不足时,避免直接崩溃。虽然这种机制有助于防止内存溢出,但当数据被交换到磁盘上时,每当需要访问这些数据时都会触发缺页中断,进而导致额外的延迟。

禁用 Swap 配置:

可以使用以下命令禁用当前的 swap 分区:

# 禁用 swap 分区
swapoff -a# 永久禁用 swap,编辑 /etc/fstab 文件,注释掉 swap 行

副作用:

  • 内存压力增加:禁用 swap 后,如果系统内存不足,应用程序可能会因内存溢出而崩溃。需要确保系统有足够的物理内存来承载高负载。

5. 配置 swappiness 为 0

  • 禁用 Swap 是彻底关闭交换空间,不允许内存数据交换到磁盘。
  • 配置内核swappiness 为 0 是一种软性优化,它尽量避免使用交换空间,但不完全禁止。当系统内存极度紧张时,swappiness 为 0 不会阻止系统使用 swap

如何设置 swappiness 为 0:

  1. 临时修改: 临时修改 swappiness 的值,使其立即生效,但重启后会失效。

    sysctl vm.swappiness=0
    
  2. 永久修改: 修改 /etc/sysctl.conf 文件,使配置在系统重启后依然生效。

    echo "vm.swappiness = 0" >> /etc/sysctl.conf
    sysctl -p
    

副作用:

  • 内存压力增加:将 swappiness 设置为 0 后,如果系统内存不足,进程可能会因内存不足而崩溃。

6. 网络吞吐量与 CPU 调度

网络吞吐量不仅与中断处理有关,还与 CPU 调度效率和任务优先级密切相关。合理调度网络相关进程,确保它们能够高优先级地执行,可以有效提高 UDP 数据包的吞吐量。

优化策略:
  • CPU 亲和性:将 UDP 数据处理任务绑定到特定的 CPU 核心上,避免跨核任务迁移,减少缓存失效的概率。
    taskset -c 0-1 ./my_udp_task
    
  • 高优先级调度:使用实时调度策略(如 FIFO 或 RR)提高与 UDP 数据包处理相关进程的优先级,确保网络中断能够及时响应。
    chrt -f 99 my_udp_task
    
副作用:
  • CPU 负担不均:CPU 亲和性优化可能会导致某些 CPU 核心的负载过重,而其他核心处于闲置状态,因此需要仔细评估。

7. 使用硬件辅助优化

硬件时间戳可以提高网络吞吐量,减轻 CPU 的负担。

优化策略:
  • 启用硬件时间戳:如果网卡支持,启用硬件时间戳可以减轻 CPU 的负担。
    ethtool -T eth0
    ethtool -s eth0 time-stamping on
    
副作用:
  • 内存消耗:硬件时间戳等功能会占用一定的内存资源,特别是在需要精确时间同步的高流量环境中,可能导致内存消耗增加。

更多阅读

  • 针对ARM64嵌入式系统的Linux内核参数优化
  • tcp网络编程性能优化点
  • Linux操作系统的实时化-PREEMPT_RT

http://www.mrgr.cn/news/72353.html

相关文章:

  • Anacondan安装opencv
  • Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题
  • 【再谈设计模式】建造者模式~对象构建的指挥家
  • 【极限编程(XP)】
  • Hadoop(YARN)
  • JavaScript:loadScript 方法
  • 第3章: 图像增强与色彩处理
  • 基于HFSS软件的滤波器设计
  • 货拉拉四次冲刺业绩向好:净变现率下滑,司机大量投诉及权益保护仍亟待完善
  • spring-gateway网关聚合swagger实现多个服务接口切换
  • 【学习】【HTML】HTML、XML、XHTML
  • 运行springBlade项目历程
  • 论云游戏的性能与性价比,ToDesk、青椒云、顺网云游戏等具体实操看这篇就够了
  • 上海亚商投顾:沪指放量调整 全市场近3800只个股下跌
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数
  • Rocky linux8 安装php8.0
  • CesiumJS 案例 P27:创建椭圆、创建带边框的椭圆、创建圆、创建带边框的圆、创建椭圆环、创建圆环
  • WPF 中的视觉层和逻辑层有什么区别?
  • frp搭建内网穿透
  • PMC部门如何精准把控生产计划和生产进度?关键要点全解析
  • 【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】
  • day31-二叉树的最大深度
  • Git服务部署教程
  • Linux中扫描网络的“nmap”工具使用方法
  • Conda安装软件错误(Pycharm)
  • 【更新中】《硬件架构的艺术》笔记(二):时钟与复位