套接字recv缓冲区大小

d-d*_*d-d 2 python sockets linux buffer

我的问题是关于Python的socket编程在Linux上,但由于Python的socket模块只是一个包装过的系统调用(recv,recvfrom等),这不是强烈的Python.

所以,根据文档,当我们称之为recv方法时,

为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096

这是什么意思?

最符合硬件和网络现实

我最关心的是性能.

它是否是我的网络软件的瓶颈,如果我通过我的自定义缓冲区(我后来在我的代码中使用它作为数据容器,它只是一个内存视图,如果它重要)与一些不是2的自定义大小的套接字.recv_into方法?

它只是一行代码,清晰而简短.

但是我的缓冲区的大小可以是17或51或者其他什么,所以我想知道,我应该实现一些具有"好"大小的内部环状缓冲区(如4096)并使用它来从块中读取数据块中的数据这样一个"好"的大小并写在那里,然后复制到我的缓冲区?

在性能方面有任何意义吗?

或者我当前的方案(当我从插槽中读取具有"坏"大小的块中的数据时,与"2的幂"规则不匹配)是好的吗?

换句话说:如果我们从1023大小而不是1024的块中读取套接字,它会影响性能吗?

Shl*_*oim 6

为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096

您应该考虑以太网数据包的最大大小(~1500字节)和TCP数据包的最大大小(~64K).你真的想要一个大于第一个的缓冲区(所以1024,可能是不可能的)你可能不需要比后者更多.所以选择2K,4K,8K,16K,32K或64K.

他们还暗示内核使用大小为2的缓冲区(由于TCP最大数据包大小可能是64K),你需要付出努力并匹配它,这样就不会有一个小/中型的剩余(modulu)阅读时你的数据包大小).

示例:假设您使用的是1023字节缓冲区,并且由于正在发送大量数据,因此TCP数据包的最大值为64K.你将有64个1023字节的迭代和64字节的浪费额外迭代.

  • 另外,为1kb而不是1次64kb的系统调用进行64次系统调用会产生额外的成本.系统调用涉及更改大量内部处理器状态,这需要时间.这就是我们进行缓冲的原因:进行1次系统调用并在用户空间中分块,可以避免系统调用开销. (4认同)