嵌入式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),以提高定时器精度。
    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.mzph.cn/bicheng/60432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mapwindow5代码BUG记录1

Mapwindow5代码BUG记录 一、查询功能多次点击后窗体错误1、正常情况2、BUG界面位置3、BUG表现4、BUG代码位置5、BUG代码修改6、BUG影响版本 一、查询功能多次点击后窗体错误 1、正常情况 2、BUG界面位置 表编辑器——》工具——》查找 Table editor——》Tools——》Find …

WPF中如何使用区域导航

1.创建一个Prism框架的项目并设计好数据源 User如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WPF练习17区域导航.Models {public class User{public int UserId { get; …

使用YOLOv9进行图像与视频检测

大家好&#xff0c;YOLOv9 与其前身v8一样&#xff0c;专注于识别和精确定位图像和视频中的对象。本文将介绍如何使用YOLOv9进行图像与视频检测&#xff0c;自动驾驶汽车、安全系统和高级图像搜索等应用在很大程度上依赖于此功能&#xff0c;YOLOv9 引入了比 YOLOv8 更令人印象…

基于Cocos Creator开发的打砖块游戏

一、简介 Cocos简而言之就是一个开发工具&#xff0c;详见官方网站TypeScript简而言之就是开发语言&#xff0c;是JavaScript的一个超集详解官网 今天我们就来学习如何写一个打砖块的游戏&#xff0c;很简单的一个入门级小游戏。 二、实现过程 2.1 布局部分 首先来一个整体…

YOLOv8改进 | 利用YOLOv8进行视频划定区域目标统计计数

简介 本项目旨在利用YOLOv8算法来实现视频中划定区域目标的统计计数。YOLOv8是一种目标检测算法,能够实现实时目标检测和定位。视频划定区域目标统计计数是指在一个视频中,对于指定的区域,统计出该区域内出现的目标物体数量。 该项目的工作流程如下:首先,利用YOLOv8算法…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多&#xff0c;不存在谁替代谁&#xff0c;只有双剑合璧才能破敌万千~~&#x1f60e;&#x1f60e; 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

Django 的 ModelViewSet 中的 get_queryset 方法自定义查询集

场景&#xff1a;每次调用接口&#xff0c;自动更新某个字段 基于Django REST framework class ApiDataTrackingView(ModelViewSet):queryset ApiDataTracking.objects.all()serializer_class ApiDataTrackingSerializersfilterset_class ApiDataTrackingFilterordering_f…

Rust编程与项目实战-特质(Trait)

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 特质&#xff08;Trait&#xff09;是Rust中的概念&#xff0c;类似于其他语言中的接…

uniapp中使用全局样式文件引入的三种方式

如果你想在 uni-app 中全局引入 SCSS 文件&#xff08;例如 global.scss&#xff09;&#xff0c;可以通过以下步骤进行配置&#xff1a; 方法一&#xff1a;在 main.js 中引入 在 main.js 中引入全局样式&#xff1a; 你可以在 src/main.js 文件中直接引入 SCSS 文件&#xff…

运维之systemd 服务(Systemd Service of Operations and Maintenance)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

Vue — 组件化开发

组件化开发&#xff1a;一个页面可以拆分成一个个组件&#xff1b;每个组件都有自己独立的结构、样式、行为 组件分类&#xff1a;普通组件、根组件 其中根组件包裹着所有普通小组件 普通组件的注册使用&#xff1b;有两种注册方式 局部注册全局注册 局部注册 目标&#xff…

【学习】【HTML】HTML、XML、XHTML

HTML 什么是 HTML&#xff1f; HTML (HyperText Markup Language) 是一种用于创建和展示网页的标准标记语言。它由一系列的元素组成&#xff0c;这些元素通过标签的形式来告诉浏览器如何显示内容。 HTML 的基本结构是什么&#xff1f; <!DOCTYPE html> <html> …

【软考】系统架构设计师-计算机系统基础(2):操作系统

1、操作系统基础 OS的5个核心功能&#xff1a;进程管理、存储管理、设备管理、文件管理、作业管理 OS的3个作用&#xff1a;管理运行的程序和分配各种软硬件资源&#xff1b;提供友善的人机界面&#xff1b;为程序应用的开发和运行提供高效的平台 OS的4个特征&#xff1a;并…

Android ANR分析总结

1、ANR介绍 ANR&#xff08;Application Not Responding&#xff09;指的是应用程序无响应&#xff0c;当Android应用程序在主线程上执行长时间运行的操作或阻塞I/O操作时发生。这可能导致应用程序界面冻结或无法响应用户输入。 1、Service ANR&#xff1a;前台20s&#xff0…

WebRTC视频 01 - 视频采集整体架构

一、前言&#xff1a; 我们从1对1通信说起&#xff0c;假如有一天&#xff0c;你和你情敌使用X信进行1v1通信&#xff0c;想象一下画面是不是一个大画面中有一个小画面&#xff1f;这在布局中就叫做PIP&#xff08;picture in picture&#xff09;&#xff1b;这个随手一点&am…

编译ffmpeg动态库时设置RPATH为$ORIGIN

原本&#xff0c;我这样编译: ./configure \--enable-xxx \--disable-yyy \...为了设置 RPATH, 尝试了在 configure 后面设置&#xff0c;如下几种都无效: --extra-ldsoflags"-Wl,-rpath,$ORIGIN" 没有 RPATH--extra-ldsoflags"-Wl,-rpath,$ORIGIN" 没有…

什么是 DAPP?它能解决什么问题?

在区块链技术日益火热的今天&#xff0c;DAPP 这个概念也逐渐走入人们的视野。但是很多人都听到了DAPP这个词&#xff0c;但是大部分人却还是不清楚什么是 DAPP&#xff1f;它又能解决什么问题呢&#xff1f;接下来这篇文章就带大家了解一下DAPP。 一、什么是 DAPP&#xff1f…

C++ 中的 JSON 序列化和反序列化:结构体与枚举类型的处理

在 C 编程中&#xff0c;处理 JSON 数据是一项常见任务&#xff0c;特别是在需要与其他系统或前端进行数据交换时。nlohmann::json 库是一个功能强大且易于使用的 JSON 库&#xff0c;它允许我们轻松地在 C 中进行 JSON 数据的序列化和反序列化。本文将详细介绍如何使用 nlohma…

ESLint 使用教程(三):12个ESLint 配置项功能与使用方式详解

前言 在现代前端开发中&#xff0c;代码质量与一致性是至关重要的&#xff0c;ESLint 正是为此而生的一款强大工具&#xff0c;本文将带您详细了解 ESLint 的配置文件&#xff0c;并通过通俗易懂的方式讲解其主要配置项及其配置方法。此外&#xff0c;我们还将探讨一些高级配置…

linux可执行文件添加到PATH环境变量的方法

linux可执行文件添加到PATH环境变量的方法 linux命令行下面执行某个命令的时候&#xff0c;首先保证该命令是否存在&#xff0c;若存在&#xff0c;但输入命令的时候若仍提示&#xff1a;command not found 这个时候就的查看PATH环境变量的设置了&#xff0c;当前命令是否存在于…