繁体   English   中英

将 GB 的字节写入 go 中的 TCP 套接字是一种好习惯吗?

[英]Is it a good practice to write a GB of byes into a TCP socket in one go?

我正在维护一些成熟的生产代码,这些代码通过 TCP sockets 发送数据。 它总是将大块数据分成许多数据包,每个数据包 1000 字节。 我只是想知道为什么这样做。 为什么我不能将一个 GB 的字节数组写入一个 go 的套接字中? 这样做有什么坏处?

根据底层实现,尝试批量发送 1GB 可能会导致 1GB 被复制到某个缓存中,然后在那里保留一段时间。 因此,如果没有足够的 memory 可用(即使有足够的可用 memory - 它可能不是使用它的最有效方式),这可能是一个问题。

尽管“手动”将其拆分为 1000 字节的段,但对我来说确实听起来有点矫枉过正。

有很多理由不一次投入大量资金。

首先:即使在非常快的网络上发送 1 GB 的数据也需要相当长的时间。 在 10Gbps 网络上,这将需要不到 1 秒的时间,这在计算机语言中是很长的时间。 并且假设这一操作具有可用的网络的所有带宽,并且不必与其他任何东西共享。

这意味着,如果您成功地对 TCP 套接字执行 1GB write调用,则需要一段时间才能实际发送后面的数据位。

同时,您必须将所有数据保存在 memory 中。 这意味着您需要为整个事务分配并保留 1GB 的数据。

相反,如果您在每次写入之前填充一个小的缓冲区并从源读取(或生成,取决于数据的来源),那么您只需要一点 memory (缓冲区的大小)。

对于今天的机器来说,所有这些听起来可能没什么大不了的,但考虑到许多服务器将同时为数百个客户端/请求提供服务,如果每个服务器都需要 1GB 缓冲区,那么这可能会很快失控。

1000 是该缓冲区的好大小吗? 我不是网络专家,但我怀疑这有点低。 也许大约 64k 的东西是合适的,但其他人可以在这里提供更好的细节。 找到一个好的缓冲区大小有时会有点棘手。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM