Hi3536网络应用调优

news2024/11/24 8:40:30

目录

1. 为什么UDP接收或发送会丢包?

2. 使用 socket 接口时,如何正确工作在非阻塞模式下? 

3. TOE 使能及使用注意事项

4. TOE 模式下使用 socket 接口时的注意事项  


1. 为什么UDP接收或发送会丢包?

  • 用户态应用程序在接收 UDP 数据时(单播或组播报文),同时进行其它有延时的操作(如写码流数据到 USB 存储设备),应该程序将延迟接收 UDP 数据包,而 socket 默认接收缓存只有108544Byte,这样可能会使 socket 接收缓存满,无法接收新的 UDP 数据包,出现丢包现象。可在内核下通过执行下面命令进行确认:
    cat /proc/net/snmp | grep Udp

    如果 RcvbufErrors 字段增加较多,说明确实是 socket 接收缓存满导致的丢包。以下命令可以增加接收缓冲区大小(设置为 20,000,000 字节 (即 20 MB),解决以上问题。

    echo 20000000 > /proc/sys/net/core/rmem_max
    echo 20000000 > /proc/sys/net/core/rmem_default
    echo 20000000 > /proc/sys/net/core/netdev_max_backlog
    

    这样做的目的是提高网络传输性能,特别是在处理大量数据流时。这种改动,需要根据实际码流发送速度和接收程序的延时进行参数调优。

  • UDP 发送可能会丢包,一种原因是 CPU 发送 UDP 报文的速率超过了网卡 MAC 的发包速率,导致网卡MAC的发送缓冲队列满,引起了丢包。可以在内核下通过执行下面命令进行确认: 
    ifconfig eth0

    如果打印的信息中 TX dropped 和 overruns 值基本相等,都增加较多说明是网络MAC的发送缓冲队列满导致的丢包。以下命令可以减小发送缓冲区,让CPU发包速率慢一点,解决以上问题。

    echo 20000 > /proc/sys/net/core/wmem_max
    echo 20000 > /proc/sys/net/core/wmem_default
    

    这种改动,需要根据码流发送速率和丢包率的要求进行参数调优。

2. 使用 socket 接口时,如何正确工作在非阻塞模式下? 

在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种 socket 先做一下说明: 

阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。

非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。

对于一个 socket 是阻塞模式还是非阻塞模式有两种方式来处理:

  • 方法1:fcntl 设置;用 F_GETFL 获取 flags,用 F_SETFL 设置 flags | O_NONBLOCK; fcntl 函数可以将一个 socket 句柄设置成非阻塞模式: 
    flags = fcntl(sockfd, F_GETFL, 0);           //获取文件的flags值
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);  //设置成非阻塞模式

    设置之后每次对于 sockfd 的操作都是非阻塞的。

    flags  = fcntl(sockfd, F_GETFL, 0);           //获取文件的flags值
    fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK);  //设置成阻塞模式

    设置之后每次对于sockfd 的操作都是阻塞的。

  • 方法2:recv、send 系列的参数 (读取、发送时,临时将 sockfd 或 filefd 设置为非阻塞)。 recv、send 函数的最后有一个 flag 参数可以设置成 MSG_DONTWAIT,临时将 sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。
    recv(sockfd, buff, buff_size, MSG_DONTWAIT);  //非阻塞模式的消息发送
    send(scokfd, buff, buff_size, MSG_DONTWAIT);  //非阻塞模式的消息接受
    

3. TOE 使能及使用注意事项

TOE 模块(TCP Offload Engine,TCP 卸载引擎) 同时实现两个网络接口数据的接收和发送,可以工作在 10/100/1000Mbit/s 模式下,支持半双工和全双工工作模式,提供 MII、RMIIRGMII 接口。TOE 模块能够通过硬件部分实现 TCP/IP 加速处理的功能,不但能够提升网络接口的吞吐量,还可以显著的降低 CPU 占用率。

  • Hi3536 网口默认使用的是 bypass 功能,使能 TOE 功能只需要如下操作即可:

    修改文件系统的 /etc/init.d/S81toe 启动脚本:

    insmod /hitoe/stmmac.ko 注释掉;

    再将下列三句话使能,打开 TOE 功能:

    echo 8192 > /proc/sys/vm/min_free_kbytes
    echo 200 > /proc/sys/vm/vfs_cache_pressure
    insmod /hitoe/stmmac.ko hitoe=1

    由于这里保留空间增大了,相应的 bootargsMEM 的配置也要相应的增大,否则会出现内存不够用的情况。

  • Hi3536 GMAC 每次使用 TOE 发送数据时,需要大块连续的物理内存,但是内核中大块连续内存的数量非常少。因此在使用前需要做如下处理,确保能够分配到足够多的物理内存。下述处理只是简单的举例,具体的数值需要根据业务场景使用的连接数来决定。
    echo 8192 > /proc/sys/vm/min_free_kbytes
    echo 200 > /proc/sys/vm/vfs_cache_pressure

    min_free_kbytes 表示最小保留内存的大小,缺省值为 8192vfs_cache_pressure 表示设置了虚拟内存回收 directoryi-node 缓冲的倾向,缺省值为 100,推荐设置为 200,因为该参数的值越大,回收的倾向越严重。这样 TOE 就会有更多的物理内存使用。Hi3536 ETH 使用时如果网口出现内存分配不足的情况下可以在 shell 下进行如下设置:echo 16384 > /proc/sys/vm/min_free_kbyte,增大最小保留内存。

  • TOE 不支持选择性重传功能,而内核默认打开了网络模块的选择性重传,为了 Hi3536TOE 模式下能与对端设备协商一致,需要关闭选择性重传:
    echo 0 > /proc/sys/net/ipv4/tcp_sack
  • TOE 接收描述子个数可以配置,默认 4096,消耗 8MB 内存(每个描述子 2K)。补充说明:个数可以根据内存大小或应用场景配置。CPU 压力越大,网络压力越大,则配置描述子大可以提高性能,其他情况下可以减少配置,一般简单场景 256 即可,可以节省内存,配置范围 256~8192。配置方法举例:
    insmod stmmac.ko hitoe=1 tnk_rx_fifo=4096
  • 增加 socket 选项,可以通过 setsocketopt 来实现某个 socket 是否使用 TOE 功能,目前默认每个 socket 都使能 TOE。实现方法:在具体的业务 socket 层代码中定义如下宏:
    #define SO_TOE_ENABLE 76

    在创建 socket 连接的代码实现中添加 TOE 使能开关:

    int val = 0; /* DISABLE TOE : val = 0 ENABLE TOE: val = 1*/
    int len = sizeof(int);
    setsockopt(sockfd, SOL_SOCKET, SO_TOE_ENABLE, &val, len);
  • 增加 socket 选项,可以通过 getsockopt 来获取某个 socket 是否处于 tcp 连接加速状态。实现方法:在具体的业务 socket 层代码中定义如下宏:

    #define SO_TOE_STATE 77

    当用户创建并使用 socket 后,用户可以通过如下代码在任意时刻获取 tcp 连接的加速状态:

    int val;
    int len = sizeof(int);
    getsockopt(sockfd, SOL_SOCKET, SO_TOE_STATE, &val, &len);

    如果返回的 val 值为 1,说明 tcp 连接处于加速状态,如果返回的 val 值为 0,说明 tcp 连接处于非加速状态。

  • 增加对所有连接默认是否开启 TOE 加速的支持。如果用户希望默认所有连接不开启 TOE 加速,仅当主动通过 setsockopt 设置某条连接开启 TOE 时,这条连接才开启 TOE 加速特性,那么用户可通过内核文件系统 /proc 下的参数来进行设置。其中,/proc/sys/tnk/tnk_tcp_gmac0_enable 是网口 0 口的 TOE 使能开关,/proc/sys/tnk/tnk_tcp_gmac1_enable 是网口 1 口的 TOE 使能开关,向该 proc 节点写 1 表示所有连接默认开启 TOE 加速,写 0 表示所有连接默认不开启 TOE 加速。如果用户希望网口 0 默认所有连接不开启 TOE 加速,使用命令如下:
    echo 0 >/proc/sys/tnk/tnk_tcp_gmac0_enable

    这样,网口 0 所有连接默认都不会开启 TOE 加速,客户可以通过 setsockopt 来使能某条 socket 进入 TOE 加速。

4. TOE 模式下使用 socket 接口时的注意事项  

  • TOE 模式下,不管是阻塞模式还是非阻塞模式,协议处理是由硬件完成的,当出现内核 buffer满时,都会给上层应用返回 EAGAIN,而在 Bypass 模式下,如果是阻塞模式,则出现内核 buffer 满时,不会返回 EAGAIN,而阻塞继续发送!
  • 另外经过查询得知 send 的返回值是这样处理的:阻塞模式与非阻塞模式下,send 返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 表示暂时发送失败,需要重试,如果 send 返回值 <= 0, && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN 时,连接异常,才需要关闭。
  • 因此,建议应用程序在调用 send 时,若返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 应该延时等待一段时间再重新尝试发送,而不要直接调用 close 断开连接,则不会出现此问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792267.html

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

相关文章

什么是SVM算法?硬间隔和软间隔的分类问题

SVM全称是supported vector machine(支持向量机)&#xff0c;即寻找到一个超平面使样本分成两类&#xff0c;并且间隔最大。 SVM能够执行线性或⾮线性分类、回归&#xff0c;甚至是异常值检测任务。它是机器学习领域最受欢迎的模型之一。SVM特别适用于中小型复杂数据集的分类。…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

kali中的一些工具简单使用dirb、netdiscover、ffuf、nmap、sqlmap、hydra、msfconsole

kali渗透常用工具 dirbnetdiscover介绍 ffuf介绍 nmap介绍 sqlmaphydra介绍 msfconsolemsfconsole上线windows dirb dirb <目标URL> <字典文件> [选项] <目标URL>&#xff1a;要扫描的目标URL&#xff0c;例如&#xff1a;http://example.com。 <字典文件…

nodeiis部署步骤

用nodejs写了一个express框架的接口&#xff0c;记录一下它如何在iis上发布部署 nodeiis部署步骤 第一步 安装nodejs 安装步骤&#xff1a;略确认安装结果&#xff1a;在cmd执行命令node -v效果图 第二步 安装iisnode 下载地址&#xff1a;iisnode下载地址&#xff08;htt…

Sentinel针对IP限流

改造限流策略的针对来源选项 import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class Senti…

php 中文字符串反转【字符串】

场景&#xff1a;英文字符串反转 使用 方法 strrev($str) ,但是中文字符串怎么反转呢&#xff1f; 代码 /*** 多字符 字符串反转* param string $string 字符串* param string $encoding 编码* php > 7.4 否则需要实现 mb_str_split 多字符变成字符串*/ function mb_str…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Centos7安装cloudreve+onlyoffice

Centos7安装cloudreveonlyoffice 1.安装onlyoffice 1.1 安装onlyoffice镜像 docker run -i -t -d -p 801:80 --restartalways -e JWT_ENABLEDfalse --name onlyoffice \-v /home/xxx/important_onlyoffice/logs:/var/log/onlyoffice \-v /home/xxx/important_onlyoffice/dat…

Linux搭建Promtail + Loki + Grafana 轻量日志监控系统

一、简介 日志监控告警系统&#xff0c;较为主流的是ELK&#xff08;Elasticsearch 、 Logstash和Kibana核心套件构成&#xff09;&#xff0c;虽然优点是功能丰富&#xff0c;允许复杂的操作。但是&#xff0c;这些方案往往规模复杂&#xff0c;资源占用高&#xff0c;操作苦…

可视化时序输入与输出|python

请帮我生成可视化图的python代码&#xff0c;输入是xxx变量&#xff0c;输出是xxx变量&#xff0c;横坐标是时间&#xff0c;输入用蓝线表示&#xff0c;输出用黄线表示&#xff0c;然后输入和输出在时间维度上是分别一个在前&#xff0c;一个在后。 import matplotlib.pyplot…

安全狗深度参与编写的《云原生安全配置基线规范》正式发布!

7月25日&#xff0c;由中国信息通信研究院、中国通信标准化协会主办的2023可信云大会在北京顺利开幕。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c…

《算法竞赛·快冲300题》每日一题:“凹”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 凹…

Java SpringMvc

0目录 java SpringMvc拓展 1.SpringMvc 创建工程&#xff0c;导入依赖 配置 web.xml文件 配置Spring配置文件&#xff0c;resources目录下新建applicationContext.xml 控制层配置 新建list.jsp并测试 Web.xml详解 如果required是true必须要传参 设置默…

深度揭秘C++继承:理解面向对象编程的核心概念

目录 一.继承1.继承与面向对象2.继承方式访问权限3.切片&#xff08;赋值转换&#xff09;4.作用域5.默认成员函数6.友元与静态函数7.解决菱形继承的二义性与数据冗余8.继承与组合 一.继承 1.继承与面向对象 我们知道C语言是面向过程的编程语言&#xff0c;C在C语言的基础上进…

【TiDB理论知识06】PD架构与作用

目录 一 PD的架构与功能 PD架构 PD作用 名词解释 路由功能 二 TSO的分配 概念 分配过程 性能问题 高可用问题 三 PD的调度原理 总流程 1 信息收集 2 生成调度 3 执行调度 四 Label的作用 Label的配置 给TiKV打标签 PD配置 一 PD的架构与功能 PD架构 PD集群…

机器学习|学习类型-监督学习

让我们来讨论什么是机器学习如下所示&#xff1a; 如果机器在给定任务中的性能随着经验的改善而改善&#xff0c;则可以说机器正在从过去的经验&#xff08;数据馈入&#xff09;中学习某些类别的任务。例如&#xff0c;假设一台机器必须预测客户今年是否会购买特定的产品&…

指针进阶(三)

指针进阶&#xff08;三&#xff09; 指针习题组&#xff1a; 01&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }运行结果&#xff1a; 原因&#xff1a;这里a是数组名&a…

点云拟合球体

前言&#xff1a;在很多情况下&#xff0c;需要根据点云来拟合球体&#xff0c;本博文主要介绍各种方法的拟合情况及优缺点&#xff0c;希望对各位小伙伴有所帮助&#xff01; 目录 1. vtkFitImplicitFunction进行球拟合 2. 四点求解球 1. vtkFitImplicitFunction进行球拟合 …

汽车减震器弹簧阻尼模型及python代码

U为主动减震施加的力。 通过python control库&#xff0c;可以得到在单位脉冲激励下X1的响应曲线 import control import matplotlib.pyplot as pltM1 2500 M2 320 K1 80000 K2 500000 b1 350 b2 15020s control.TransferFunction.sH (b1*b2*s*s (b1*K2b2*K1)*s K1*…

foreverlasting and fried-chicken hdu7293

Problem - 7293 题目大意&#xff1a;给出一个n个点&#xff0c;m条边的图&#xff0c;问其中包含了几个下面这样的子图 1<n<1000; 思路&#xff1a;我们要找两个点u,v&#xff0c;他们至少有4个公共点&#xff0c;且至少有一个点的度数至少为6&#xff0c;其中还要判断…