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


    下面测试了四种情况下ROS的带宽:

    1.  ROS和发送端都不设置SO_RCVBUF/SO_SNDBUF值。

    2.  ROS 将SO_RCVBUF/SO_SNDBUF设置为256KB, 发送端都不设置。

    3.  ROS只设置SO_RCVBUF为256KB, 发送端都不设置。

    4.  ROS只设置SO_SNDBUF为256KB,发送端都不设置。

    5.  ROS将SO_RCVBUF设置为256KB,发送端将SO_SND设置为256KB.

    6.  ROS和发送端都将SO_RCVBUF/SO_SNDBUF设置为256KB.

    1.  ROS和发送端都不设置SO_RCVBUF/SO_SNDBUF值.

    不设置socket选项时,通过getsockopt得到的SO_SNDBUF和SO_RCVBUF值为:

    接收端:
    recv buf size: 87380 send buf size: 16384 seg tcp size: 1448
    发送端:

    recv buf size: 87380
    send buf size: 19800
    seg tcp size: 1448

    测试得到的带宽如下图(上图为发送端,下图为接收端):发送端CPU占用率为100%,接收端CPU占用率为79%.

    2.  ROS 将SO_RCVBUF/SO_SNDBUF设置为256KB, 发送端不设置.

    将SO_SNDBUF和SO_RCVBUF在ROS程序里设置为256*1024字节,实际上通过getsockopt得到的值为244*1024字节,即下面的rmem_max和wmem_max限制值的2倍:

    [root@cmm02node01 part_dk_ef]#  sysctl -a |grep mem |grep net.core
    net.core.wmem_max = 124928
    net.core.rmem_max = 124928
    net.core.wmem_default = 124928
    net.core.rmem_default = 124928
    net.core.optmem_max = 20480

    测试得到的接收端和发送端的带宽为:在接收端曲线的横坐标为(5000,10000)之间的下降的点是因为当时用qperf同时测了一把cmm02node01和cmm02node06两个节点之间的带宽。

    3. ROS只设置SO_RCVBUF为256KB. 

    ROS只设置SO_RCVBUF,不设置SO_SNDBUF时,接收端CPU占用率为100%, 发送端CPU占用率为84%(与设置SO_RCVBUF,SO_SNDBUF两个选项的CPU占用率相同)。通过getsockopt得到的buf size 为:

    recv buf size: 249856
    send buf size: 16384
    seg tcp size: 1448

    测试得到的带宽为:

    4. ROS只设置SO_SNDBUF为256KB.

    只设置SO_SNDBUF时, 不设置SO_RCVBUF时,接收端CPU占用率为76.4%,发送端CPU占用率为100%(与不设置这两个选项时的cpu占用率比较相近).通过getsockopt得到的设置值为:

    recv buf size: 87380
    send buf size: 249856
    seg tcp size: 1448

    测试得到的接收端的带宽为:

    5. ROS设置SO_RCVBUF为256KB, 发送端程序设置SO_SNDBUF为256KB.

    设置发送方的SO_SNDBUF为256*1024,接收方的SO_RCVBUF为256*1024.

    发送方:
    recv buf size: 87380
    send buf size: 249856
    seg tcp size: 1448
    
    接收方:
    recv buf size: 249856
    send buf size: 16384
    seg tcp size: 1448

    发送端的cpu占用率为90%,接收方的cpu占用率为80%, 接收端的带宽为:

    6. ROS和发送端都设置SO_SNDBUF和SO_RCVBUF为256KB.

    将发送方和接收方都设置两个buf值,

    发送方:
    recv buf size: 249856
    send buf size: 249856
    seg tcp size: 1448
    
    接收方:
    recv buf size: 249856
    send buf size: 249856
    seg tcp size: 1448

    此时,发送端cpu占用率为90%,接收端cpu占用率为80%, 接收端的带宽为:

    上面的几组测试表明:

    1.  5和6的测试结果小于1~4的测试结果,说明发送端设置SO_SNDBUF和SO_RCVBUF为256KB后,传输带宽反而变小了。

    2. 接收端起主要作用的是SO_RCVBUF,设置该选项后,接收端CPU占用率变为100%,发送端CPU占用率下降到80%。

    3. 接收端同时设置SO_RCVBUF和SO_SNDBUF选项为256KB, 发送端都不设置时,带宽曲线最稳定,性能较好。

    另外,用iperf测试带宽时,-w选项可以用于修改socket的发送/接收缓存大小,可以先用iperf测试得到窗口对带宽性能的影响,找到窗口的最优值,再将结论运用到ROS的接收端。

  • 相关阅读:
    驴的故事
    leetcode125. Valid Palindrome
    C#处理Excel的帮助类
    用SVN进行团队开发协作生命周期详解
    .net反编译原理
    科学使用Log4View2查看日志
    NLog日志框架使用探究-2
    NLog日志框架使用探究-1
    从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
    十分钟学会 Markdown 基本语法
  • 原文地址:https://www.cnblogs.com/zengtx/p/6585700.html
Copyright © 2020-2023  润新知