套接字缓冲区大小:较大与较小的优缺点

时间:2015-02-10 19:09:46

标签: c# sockets c#-4.0 tcp buffer

我之前从未真正使用过COM套接字,现在有一些代码正在监听相当稳定的数据流(500Kb / s - 2000Kb / s)。

我尝试过不同的尺寸,但我不确定我在概念上做了什么。

byte[] m_SocketBuffer = new byte[4048];
//vs
byte[] m_SocketBuffer = new byte[8096]; 

我正在使用的套接字是System.Net.Sockets.Socket,这是我的构造函数:

new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

我的问题是:

  1. 对于大缓冲区和小缓冲区是否存在一般权衡?
  2. 如何评估缓冲区的大小?你应该用什么作为衡量标准?
  3. 我正在检索这样的数据:

    string socketData = Encoding.ASCII.GetString(m_SocketBuffer, 0, iReceivedBytes)
    while (sData.Length > 0)
    { //do stuff }
    
    1. 当缓冲区已满时,我的阅读事件会发生吗?就像套接字缓冲区达到阈值时那样,那时我可以从中读取它?

1 个答案:

答案 0 :(得分:3)

简短版本:

  • 最佳缓冲区大小取决于很多因素,包括底层网络传输以及您自己的代码如何处理I / O.
  • 10的K可能适用于移动大量数据的大容量服务器。但如果您知道远程端点不会一次向您发送大量数据,则可以使用更小的数据。
  • 缓冲区在I / O操作期间被固定,这可能导致或加剧堆碎片。对于一个真正高容量的服务器,分配非常大的缓冲区(大于85,000字节)可能是有意义的,这样缓冲区就可以从大对象堆中分配(它没有碎片问题,或者处于永久状态碎片,取决于你如何看待:)),然后只使用每个大缓冲区的一部分进行任何给定的I / O操作。

回复:您的具体问题:

  
      
  1. 对于大缓冲区和小缓冲区是否存在一般权衡?
  2.   

可能最明显的是通常的情况:比实际需要的缓冲区更大的只是浪费空间。

使缓冲区太小会强制执行更多I / O操作,可能会强制执行更多线程上下文切换(取决于您执行I / O的方式),并确保增加必须执行的程序语句数。

当然还有其他权衡因素,但是对于这个论坛来说,进入每一个论坛都会有太多的讨论。

  
      
  1. 如何评估缓冲区的大小?你应该用什么作为衡量标准?
  2.   

我从一个似乎“合理”的大小开始,然后从那里进行实验。在各种负载测试场景中调整缓冲区大小,增加和减少,以查看对性能有何影响。

  
      
  1. 当缓冲区已满时,我的阅读事件会发生吗?就像套接字缓冲区达到阈值时那样,那时我可以从中读取它?
  2.   

当您从套接字读取时,网络层将尽可能多地将数据放入缓冲区。如果有更多数据可用,则填充缓冲区。如果可用的数据少于适合的数量,则操作将在不填充缓冲区的情况下完成(但总是在缓冲区中至少放入一个字节时...读取操作以零长度完成的唯一时间是连接时关闭)

相关问题