厦门建设公司网站,wordpress调用指定分类,代理网络怎么关闭,凡客网站建站教程目录
1. 为什么UDP接收或发送会丢包?
2. 使用 socket 接口时#xff0c;如何正确工作在非阻塞模式下#xff1f;
3. TOE 使能及使用注意事项
4. TOE 模式下使用 socket 接口时的注意事项 1. 为什么UDP接收或发送会丢包?
用户态应用程序在接收 UDP 数据时#xff0…目录
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 先做一下说明 阻塞IOsocket 的阻塞模式意味着必须要做完IO 操作包括错误才会返回。 非阻塞IO非阻塞模式下无论操作是否完成都会立刻返回需要通过其他方式来判断具体操作是否成功。 对于一个 socket 是阻塞模式还是非阻塞模式有两种方式来处理
方法1fcntl 设置用 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 的操作都是阻塞的。 方法2recv、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 EngineTCP 卸载引擎) 同时实现两个网络接口数据的接收和发送可以工作在 10/100/1000Mbit/s 模式下支持半双工和全双工工作模式提供 MII、RMII 和 RGMII 接口。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 hitoe1 由于这里保留空间增大了相应的 bootargs 中 MEM 的配置也要相应的增大否则会出现内存不够用的情况。 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 表示设置了虚拟内存回收 directory 和 i-node 缓冲的倾向缺省值为 100推荐设置为 200因为该参数的值越大回收的倾向越严重。这样 TOE 就会有更多的物理内存使用。Hi3536 ETH 使用时如果网口出现内存分配不足的情况下可以在 shell 下进行如下设置增大最小保留内存 echo 16384 /proc/sys/vm/min_free_kbyte TOE 不支持选择性重传功能而内核默认打开了网络模块的选择性重传为了 Hi3536 在 TOE 模式下能与对端设备协商一致需要关闭选择性重传 echo 0 /proc/sys/net/ipv4/tcp_sack TOE 接收描述子个数可以配置默认 4096消耗 8MB 内存每个描述子 2K。补充说明个数可以根据内存大小或应用场景配置。CPU 压力越大网络压力越大则配置描述子大可以提高性能其他情况下可以减少配置一般简单场景 256 即可可以节省内存配置范围 256~8192。配置方法举例 insmod stmmac.ko hitoe1 tnk_rx_fifo4096 增加 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 断开连接则不会出现此问题。