ROS取数线程分析(4): 不带组装: socket选项SO_SNDBUF,SO_RCVBUF对带宽和CPU的影响


昨天用ROS, iperf, nettest测试了cmm02node06——>cmm02node01的带宽和cpu占用率,发送的包长为2KB,测试的结果为:

        带宽       发送端CPU占用率      接收端CPU占用率

ROS     4.42Gb/s,       80%            100%

iperf      4.66Gb/s,       100%            70%

nettest    4.38Gb/s,        100%            71%

发现iperf和nettest都是发送端cpu达到100%, 而接受端只占到70%;ROS是接收端cpu达到了100%,发送端cpu占80%。为什么ROS的cpu占用率与其他两个软件不同呢?

为什么ROS接收端的CPU占用率为100%呢?先排除ROS的查询,判断,buffer等的影响,将ROS的取数线程简化为一个直接recv的线程:

1. SequentialInputHandler_directrecv.cpp文件,将requriment里的SequentialInputHandler替换成SequentialInputHandler_directrecv,主要是将readyToReadout和ReleaseFragment注释掉了. 见:

http://files.cnblogs.com/files/zengtx/ROS_SequentialInputHandler_directrecv.pdf

2. SequentialDataChannel.cpp里的inputFragment函数注释掉,换成简单的:

/*****************************************************/
unsigned int SequentialDataChannel::inputFragment(void)
/*****************************************************/
{
// if(!buffer) buffer = new char[m_robPageSize*100000*401] ;
char buffer[2048*20];
this->getNextFragment((unsigned int*)buffer, (unsigned long)m_robPageSize);
return 0 ;
}

这样ROS接收端的取数模型简化为阻塞recv的while循环。

此时的测试结果为:(msg_size = 2048)带宽为6.7Gb/s,接收端的cpu占用率仍为100%,发送端cpu占用率为83%。

              带宽       发送端CPU占用率      接收端CPU占用率

ROS           4.42Gb/s,       80%            100%

ROS_directrecv      6.7Gb/s         83%            100% 

iperf            4.66Gb/s,       100%            70%

nettest          4.38Gb/s,        100%             71%

接收端线程简化后,用来recv的时间比例增加,使得发送端的cpu占用率提高了一些。但是接收端cpu为什么比发送端cpu先达到100%呢?为什么ROS_directrecv的带宽比iperf,nettest的带宽更高呢?

通过比较了nettest和ROS的代码后发现,ROS的代码中多了两个socket选项设置:SO_SNDBUF,SO_RCVBUF,这两个值都被设置为256*1024。将这两个设置选项注释掉,再进行一次测试。

                  带宽       发送端CPU占用率      接收端CPU占用率

ROS               4.42Gb/s,       80%            100%

ROS_directrecv          6.7Gb/s         83%            100% 

ROS_directrecv_nosetsockopt  4.64Gb/s        100%            70%

iperf                4.66Gb/s,       100%            70%

nettest               4.38Gb/s,        100%             71%

发现注释掉SO_SNDBUF,SO_RCVBUF选项设置后,测得的带宽变小了,发送端的CPU占用率为100%,接收端的CPU为70%,与iperf,nettest的测试结果接近。

查阅:http://bbs.csdn.net/topics/310236933

“SO_SNDBUF和SO_RCVBUF设置系统缓冲区的大小,在接受和发送数据时直接影响系统遍历缓冲区的行为,比如你实际发送的数据比较少,接收缓冲区却很大,系统做无效遍历的内容会增多,肯定会影响效率的。”

SO_SNDBUF, SO_RCVBUF在传输包长小,cpu为瓶颈时,这两个选项值会影响系统性能,具体值设为多少最优,需要做具体的测试确定。

优质内容筛选与推荐>>
1、故障排查顺序
2、线程的同步操作
3、c与c++相互调用机制分析与实现
4、面试算法整理(1)
5、12.19 用压测模拟并发、并发处理(synchronized,redis分布式锁)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号