ROS:8个进程接收数据的带宽

将接收端和发送端的套接字缓冲区设置为【8MB, 8MB】,接收端是while循环recv的directrecv模式下,8个ROS进程,每个ROS处理一个socket, 发送和接收包长为2KB, 运行了大约12个小时的带宽曲线如下:

计算得到每个接收进程的平均带宽,以及8个进程的平均带宽的和为:

2.61563
3.5609
3.50985
3.12713
3.22121
3.13252
3.00344
3.99146
sum ave bw: 26.16214

总的平均带宽为26Gb/s,且接收端的CPU idle 为0,发送端的CPU idle 为80%。此时的瓶颈为接收端的CPU。

通过top -H -p pid 命令可以查看进程的线程数,通过gstack pid可以看到线程的函数调用栈。用前面两条命令可以查看到每个ROS进程都有三个线程在执行:一个是ROS::UDPChannels, 一个是ROS::RequestHandler; 一个是Recv。其中只要Recv是当前接收数据线程。可以将另外两个线程disable掉,释放一部分CPU资源,增加线程数,看看带宽会不会继续增加。

问题是:如何disable掉UDPChannels?

时间: 2024-10-03 14:01:59

ROS:8个进程接收数据的带宽的相关文章

守护进程接收终端输入的一种变通性方法

说明 本文主要介绍某嵌入式产品中DSL用户态驱动模块作为守护进程时,如何接收终端输入的变通性方法. 出于信息安全考虑,文中涉及系统方面的接口函数未给出实现细节,但不影响表述的完整性. 相关性文章参见<GNU Readline库函数的应用示例>. 一  背景知识 init进程(如Busybox init)是嵌入式系统内核自举时启动的第一个也是惟一的用户进程.init进程是后续所有其他进程的父进程(其进程ID为1),在系统运行期间以守护进程的形式一直存在.它主要负责启动各运行层次特定的系统服务(如

关于原子哥ENC28J60网络通信模块接收数据代码的一点失误

这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时间板子就死机了. 直接源码 struct netbuf *recvbuf;//接收buf struct pbuf *q; err_t recv_err;//接收数据返回信息 u32 data_len = 0; //客户端接收数组的长度 u8 tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区 mem

android蓝牙(二)——接收数据

在蓝牙开发中,我们有这样的一个需求:我们的android客户端要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,android客户端就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持android客户端和蓝牙之间的连接.这个时候我们就要采取socket来实现和蓝牙之间的连接.做项目使用过http轮询去获取数据,但是发现那样总是有一定的弊端.于是就才用了socket方式去获取数据. 实现步骤:1.启动一个service去监听是否有数据返回.一旦有数据返回就启动一个线程去处理数据 2.处理完数据

WebService(二)发送数据+接收数据并进行处理操作

(一)使用WebService发送数据 1.定义webService接口 import java.util.List; import javax.jws.WebParam; import javax.jws.WebService; import com.mxz.fvp.dto.ADto; @WebService public interface MxzReceiveService { public boolean addExpressBarRecord(@WebParam(name = "rec

Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协议发送数据: • 创建发送端的Socket对象• 这一步如果成功,就说明连接已经建立成功了.• 获取输出流,写数据• 释放资源 2. 代码实现: (1)发送端: 1 package cn.itcast_06; 2 3 import java.io.IOException; 4 import java

c# 串口发送接收数据

/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { UTF8Encoding uTF8Encoding = new UTF8Encoding(); byte[] readBytes = new byte[this.SerialPort.BytesToRe

蓝牙连接后,启动子线程接收数据,主线程卡住了

============问题描述============ 我看了下google的bluetoothchat的demo,它那里把蓝牙建立客户端连接的部分也放在子线程里执行的. 我目前的程序,蓝牙建立连接的步骤是在UI线程里,但是bluetoothSocket接收数据的部分是在子线程中的,但是现在碰到一个问题,开启子线程后,主线程不接着往下执行了. 根据我的日志记录,connectedThread.run();之后的日志方法LogHelper.Write("已经运行过子线程");就一直卡着

发送和接收数据包

发送和接收数据包 原文:Game Networking系列,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 概述 在之前的网游中的网络编程系列1:UDP vs. TCP中(推荐先看前面那篇),我们经过讨论得出:网游中传输数据应该使用UDP而不是TCP.我们选择UDP是为了不需要等待重发数据包,从而达到数据的实时性. 注意,因为接下来英文原文中所有的代码是C++写的,而我是个pythoner,我的计划是:通过理解文章,我用python实现UDP收发数据包.虚拟连接(原文后两章的

Indy10 Tcp接收数据问题

在做Delphi开发时,使用Indy组件来做网络通讯是一种比较快捷的方式.今天要说一下indy10中tcp接收数据的问题. 我们在测试时经常使用Wrinteln来发送数据,用Readln来接收数据.用这个两个函数来测试Server端和Client端的通讯 是否正常.但在实际使用中我们很多时候发送的数据包都是比较复杂的,并不会带有回车键.也有可能用来接收XML报文, 在报文中是可能包含多次的回车键的.这种情况下显然没有办法用ReadLn来处理. 我们可以用以下方法来接收数据: procedure