zoukankan      html  css  js  c++  java
  • 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                        
  • 相关阅读:
    C#微信开发之旅(二):基础类之HttpClientHelper(更新:SSL安全策略)
    讨论区:一个数学方差题目
    python 打包exe注意的问题
    AIX学习笔记(更新中)
    哈工大游戏设计复习题
    SQL Sever 2012 如何建立数据库连接
    我的所有代码
    vc如何编译链接opengl库
    2013年哈工大软件学院 算法设计与分析 期末考试
    哈工大算法分析作业
  • 原文地址:https://www.cnblogs.com/zengtx/p/6535785.html
Copyright © 2011-2022 走看看