ROS取数线程分析(2): 不带组装

http://files.cnblogs.com/files/zengtx/%E4%B8%8D%E5%B8%A6%E7%BB%84%E8%A3%85%E5%8F%96%E6%95%B0%E7%BA%BF%E7%A8%8B%E6%97%B6%E9%97%B4%E5%88%86%E6%9E%90.pdf

上图是ROS取数线程的程序流程图。在判断事例收齐的if语句后面,加上了releaseFragment释放该事例占的buffer, 去掉了向L2SV发送L1id message的过程。

由流程图可知,在线程内部一共有6个主要过程,其中1,2,3,4是对每个dataChannel都要执行的:

1. readyToReadout

2. inputFragment

3. areFragmentsThere

4. releaseFragment

5. 取数线程yield的时间

6. printf 打印log信息的时间

在线程开始执行时,计时t0, 当收到第N个完整事例时(N%40000==1), 计时t1,  (t1-t0)即为收取N个完整事例的总时间, N/(t1-t0-t_printf)即为事例率;在(t1-t0-t_printf)这段时间内,将所有执行1,2,3,4的时间分别累加起来得到:收到N个完整事例时,readyToReadout执行所占用的时间t_readToReadout; inputFragment所占用的时间t_inputFragment; areFragmentsThere所占用的时间t_areFragmentsThere;releaseFragment所占用的时间t_releaseFragment; 取数线程yield的时间t_yield, 分别用这几个时间除以(t_tot-t_printf)即得到各个过程占用的时间比。

在单ROS, 单个dataChannel取了一段时间数后,在log文件里得到各个时间的打印:

t_readyToReadout : 1100.017164 s
t_inputFragment : 536.691869 s
t_areFragmentsThere : 2.042579 s
t_releaseFragment : 5.410533 s
t_yield : 674.699180 s
t_printf : 2.721191 s
t_tot : 2531.596965 s
L1 rate : 14267.209711

各部分所花的时间比例t_*/(t_tot-t_printf)为:

t_readyToReadout: 43.4%

t_inputFragment:  21.2%

t_areFragmentsThere: 0.08%

t_releaseFragment: 0.21%

t_yield: 26.7% 

这四个过程花的总时间占: 91.6% , 取数线程其他部分(bool 判断,变量定义,赋值,自加操作,计时)所花时间忽略不计的情况下,还有8.4%的时间花在了线程切换中。(应该是吧?)

所以得出的结论是,单个ROS,单个dataChannel时,花在readyToReadout 时间最多,取数线程yield的时间第二多,第三是inputFragment时间,仅占总时间的21.2%。

由此也导致了单ROS单dataChannel取数时的低带宽:

刀片2单ROS单线程                    
ROS个数    每个ROS通道数    平均事例率    每个通道数据长度    总带宽Gb/s    cpu idle
1          1        14239.9Hz        2KB     0.21751    83.00%

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 0 28064744 194244 3074712 0 0 0 140 20878 2292 4 13 83 0 0
4 0 0 28064716 194244 3074708 0 0 0 0 20948 1319 4 13 83 0 0
5 0 0 28064600 194244 3074716 0 0 0 0 20776 4728 4 13 83 1 0
5 0 0 28064860 194244 3074712 0 0 0 0 20251 10543 4 12 84 0 0
4 0 0 28064824 194244 3074712 0 0 0 4 20861 2166 4 13 83 0 0
4 0 0 28064856 194244 3074712 0 0 0 136 20631 6131 4 12 84 0 0
5 0 0 28064892 194244 3074712 0 0 0 0 20929 2874 4 13 83 0 0
4 0 0 28064888 194244 3074716 0 0 0 0 20528 5264 4 12 84 0 0

而在iperf 单线程发送数据时,server(接收)端的带宽为:

刀片2 iperf 包长2KB           procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----                        
iperf 线程个数    总带宽Gb/s     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us  sy  id  wa  st                        
      1      3.36       1  0    0   29175324 193736 2570300   0    0     0     0    27102 22193  0  2 98  0  0                        
原文地址:https://www.cnblogs.com/zengtx/p/6535785.html