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的块中读取套接字,它会影响性能吗?
为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096
您应该考虑以太网数据包的最大大小(~1500字节)和TCP数据包的最大大小(~64K).你真的想要一个大于第一个的缓冲区(所以1024,可能是不可能的)你可能不需要比后者更多.所以选择2K,4K,8K,16K,32K或64K.
他们还暗示内核使用大小为2的缓冲区(由于TCP最大数据包大小可能是64K),你需要付出努力并匹配它,这样就不会有一个小/中型的剩余(modulu)阅读时你的数据包大小).
示例:假设您使用的是1023字节缓冲区,并且由于正在发送大量数据,因此TCP数据包的最大值为64K.你将有64个1023字节的迭代和64字节的浪费额外迭代.
| 归档时间: |
|
| 查看次数: |
18222 次 |
| 最近记录: |