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的接收端。