Python 套接字recv缓冲区大小

Python 套接字recv缓冲区大小,python,linux,sockets,buffer,Python,Linux,Sockets,Buffer,我的问题是关于Linux上Python中的套接字编程,但由于Python的socket模块只是系统调用的包装器(recv,recvfrom等),因此它与Python的关系不大 因此,根据,当我们调用recv方法时 为了最好地匹配硬件和网络现实,bufsize的值应该是相对较小的2次方,例如4096 这是什么意思 与硬件和网络现实最匹配 我最关心的是表演 如果我将自定义缓冲区(稍后在代码中用作数据容器,如果重要的话,它只是一个内存视图)传递给方法,而不是两个自定义大小,这会成为我的网络软件的瓶颈吗

我的问题是关于Linux上Python中的套接字编程,但由于Python的
socket
模块只是系统调用的包装器(
recv
recvfrom
等),因此它与Python的关系不大

因此,根据,当我们调用
recv
方法时

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

这是什么意思

与硬件和网络现实最匹配

我最关心的是表演

如果我将自定义缓冲区(稍后在代码中用作数据容器,如果重要的话,它只是一个内存视图)传递给方法,而不是两个自定义大小,这会成为我的网络软件的瓶颈吗

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

但是我的缓冲区的大小可以是17或51,或者其他,所以我想知道,我是否应该实现一些具有“良好”大小(如4096)的内部环形缓冲区,并使用它从具有“良好”大小的套接字中读取数据,然后将其写入,然后复制到我的缓冲区

它在性能方面有什么意义吗

或者我当前的方案(当我以“坏”大小的块从套接字读取数据时,与“2的幂”规则不匹配)是好的

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

为了与硬件和网络现实最佳匹配 bufsize应该是相对较小的2次方,例如4096

<>你应该考虑以太网数据包的最大大小(1500字节)和TCP数据包的最大大小(~64K)。您确实需要一个比第一个大的缓冲区(因此1024,可能是不可能的),并且您可能不需要比第一个大的缓冲区。所以选择2K、4K、8K、16K、32K或64K

他们还暗示,内核使用的缓冲区大小为2次方(可能是64K,因为TCP最大数据包大小),您需要努力匹配它,这样在读取时就不会有中小型剩余(按数据包大小计算)


示例:假设您使用的是1023字节的缓冲区,由于发送了大量数据,因此TCP数据包的最大值为64K。您将有1024字节的64次迭代和64字节的浪费额外迭代。

如果这真的让您感到不舒服,您可以在套接字上创建一个。它将确保阅读以合理的方式进行,同时让你阅读自己喜欢的内容。另请参阅完整的历史记录,包括这些文字的作者。:)此外,用1kb进行64次系统调用而不是用64kb进行1次系统调用会产生额外的成本。系统调用涉及更改许多内部处理器状态,这需要时间。这就是我们进行缓冲的原因:执行1系统调用并在用户空间中划分块可以避免系统调用开销。