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