下午验证一个高流量发包问题时,发现了一个值得记录的问题:socket的收发buffer尺寸是会影响收发包的效率的,高流量通讯时,若socket的收发buffer尺寸过小会一定程度降低收发包效率。

自己先分别获取了一下Windows/Linux系统中默认的收发包尺寸值
在x86 Win7环境里实际程序验证结果为

$ ./sockopt.exe
UDP socket options:
receive buffer: 0x2000
send buffer: 0x2000
TCP socket options:
receive buffer: 0x2000
send buffer: 0x2000

只有8KiB。
在cubieboard2环境(Linux cubieboard2 3.4.79 #1 SMP PREEMPT Fri Dec 19 17:51:20 CST 2014 armv7l GNU/Linux)里程序验证结果为

cubie@cubieboard2:~$ ./sockopt_linux
UDP socket options:
receive buffer: 0x28000
send buffer: 0x28000
TCP socket options:
receive buffer: 0x15554
send buffer: 0x4000

可见在Windows下默认的socket收发buffer尺寸都比较小,后续的结果表明,对应对收发包的效率影响更为明显。实际测试代码如下

 #include "net/udp_peer.h"
#include "util/log.h" #include <stdlib.h>
#include <string.h> static inetaddr_t addr;
static char data[]; static void on_message(udp_peer_t *peer, void *message, unsigned size, void* userdata, const inetaddr_t *peer_addr)
{
return;
} static void on_writable(udp_peer_t *peer, void* userdata)
{
udp_peer_send(peer, data, sizeof(data), &addr); return;
} int main(int argc, char *argv[])
{
loop_t *loop;
udp_peer_t *peer; #ifdef WIN32
WSADATA wsa_data;
WSAStartup(MAKEWORD(, ), &wsa_data);
#endif log_setlevel(LOG_LEVEL_INFO); inetaddr_initbyipport(&addr, argv[], ); loop = loop_new();
peer = udp_peer_new(loop, "0.0.0.0", , on_message, on_writable, NULL);
udp_peer_expand_send_buffer(peer, (**));
/* udp_peer_expand_recv_buffer(peer, (2*1024*1024)); */ loop_loop(loop); udp_peer_destroy(peer);
loop_destroy(loop); #ifdef WIN32
WSACleanup();
#endif return ;
}

在cubieboard和Windows系统上互相通过UDP进行快速收发包,通过不同方式调节socket收发包buffer尺寸,并进行流量统计,最终得出的结果分别如下(在Windows上利用NetWorx进行流量统计)
1,保持默认的收发buffer尺寸,进行快速发包,直至将百兆带宽打满,流量图如下

2,仅将两端发包buffer尺寸增加2MiB,同样将百兆带宽打满,流量图如下

3,将两端收发包都增加2MiB,将百兆带宽打满,流量图下

可见将socket的发包buffer增大之后,在Windows下发包流量有明显的提升(峰值增加了大概2MiB,约20%)。
自己分析认为这是因为默认情况下Windows下socket发包Buffer较小,发包流量高时,出现发包Buffer满的情况概率较高,而使得后续的sendto()调用失败的概率也对应升高,从而就降低了发包效率,在此处就形成了一个瓶颈,限制了发包流量的进一步升高。而增大socket的发包Buffer之后,此处的限制得到解除,而使得最终的限制就落在网口的最大速率带宽上。

~~ end ~~

UDP收发buffer尺寸对收发包流量的影响的更多相关文章

  1. udp之关于linux udp收发包缓冲区大小

    1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...

  2. 交换芯片收发包的 DMA 实现原理

    交换芯片支持:报文.计数.表项3种DMA类型,其中报文DMA包括系统从芯片到接收报文或发送报文到交换芯片,计数DMA用来从片上获取统计计数,表项DMA功能分为SLAM DMA(系统内存DMA到片上交换 ...

  3. kernel笔记——网络收发包流程

    本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建一个 ...

  4. [development][dpdk][pktgen] 网卡收发包性能测试

    一: 多队列及中断信息收集 [root@T185 ~]# ethtool -g eth0 Ring parameters for eth0: Pre-set maximums: RX: RX Mini ...

  5. DPDK收发包全景分析

    前言:DPDK收发包是基础核心模块,从网卡收到包到驱动把包拷贝到系统内存中,再到系统对这块数据包的内存管理,由于在处理过程中实现了零拷贝,数据包从接收到发送始终只有一份,对这个报文的管理在前面的mem ...

  6. C#实现的UDP收发请求工具类实例

    本文实例讲述了C#实现的UDP收发请求工具类.分享给大家供大家参考,具体如下: 初始化: ListeningPort = int.Parse(ConfigurationManager.AppSetti ...

  7. python 爬虫 ~ 查看收发包的情况

    DebugLog 可以用来查看收发包的情况,比较有意思,现特意记录下来: Sample: import urllib2 httpHandler = urllib2.HTTPHandler(debugl ...

  8. linux系统上用户态pppoe收发包过程

    花了几天看了一下ppp/pppoe有关的东西,画了一下用户态pppoe收发包的示意图.

  9. 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

    UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

随机推荐

  1. android 打包失败

    如果在打包时提示: proguard returned with error code 1   并且在控制台中输出:'java'不是内部或外部程序或批处理文件 那么就说明你的环境变量出问题了,之前用的 ...

  2. http get/post解决乱码问题

    <form method="默认为get"-> <s:form mothod="默认为post"-> ================= ...

  3. android开发-mvp模式理解

    看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的 ...

  4. 初探bootstarp

    目录1.下载Bootstrap2.引入Bootstrap相关的css.js3.一个最简单的Bootstrap页面4.浏览器支持 1.下载BootstrapBootstrap官网下载地址Bootstra ...

  5. 重读高程3: c2-3 script元素

    1. 异步脚本一定会在页面的load事件前执行,但可能会在domC ontentLoaded事件触发之前或者之后执行.

  6. shell 简单计算脚本

  7. 编写可维护的JavaScript代码

    1.  1)for-in循环用来遍历对象属性.不仅遍历对象的实例属性,还遍历从原型继承来的属性. 所以最好使用hasOwnProperty()方法来过滤. 2) for in循环遍历出的对象属性不能保 ...

  8. iOS仿直播带有气泡动画的UIButton

    现在直播软件确实很火,因为需要就写了一个带有动画气泡的按钮,代码中的部分动画有参考到其他童鞋,在这里万分感谢! .h文件 @interface YYBubbleButton : UIButton @p ...

  9. HTML5在VS2010中的智能提示

    按照baidu首页的方法是行不通的,于是尝试下面的方法 原文来自这里,我翻译以下   下载这个文件 this archive 并解压. 复制 html_5.xsd to D:\Program File ...

  10. [转]Scrapy入门教程

    关键字:scrapy 入门教程 爬虫 Spider 作者:http://www.cnblogs.com/txw1958/ 出处:http://www.cnblogs.com/txw1958/archi ...