【问题标题】:how does the performance gets increased when I use large size files using socket programming in c当我在 c 中使用套接字编程使用大尺寸文件时,性能如何提高
【发布时间】:2015-04-14 09:02:18
【问题描述】:

我有一个代码(c 中的 TCP 套接字编程),它将文件从源系统发送到目标系统。我已经用 10 个 8KB 大小的文件进行了测试,另一个用 10 个 8MB 大小的文件进行了测试。与 8KB 文件相比,8MB 块文件的吞吐量更高。从小到大的文件的吞吐量呈线性增长。

有人可以解释一下,无论我们使用套接字编程发送小文件还是大文件,性能是如何改变的。

注意:我使用的是 sendfile()(不使用 TCP_CORK 和 TCP_NODELAY 选项)

【问题讨论】:

  • 如果您只是查看 throghput,您将不那么频繁地打开/关闭文件,因此进行的系统调用更少,您实际上会花费更多时间来发送文件。此外,如果您天真地发送数据(即调用大小为 8MB 的 send),那么 send 调用将再次使用更少的系统调用并在内核领域花费更长的时间。
  • 是的,我同意,但我已经多次重复测试给了我相同的结果..无论我使用 send 和 write () 调用还是Sendfile() ..性能上是小文件还是大文件有什么关系
  • 显示您的代码。有多种可能的解释,但首先要发布您正在谈论的代码。

标签: c sockets


【解决方案1】:

假设您为每个文件打开一个新连接,我认为您观察到的吞吐量差异可能是由于:

  • 系统调用时间:打开文件、打开连接、发送文件等。它们的数量取决于文件的数量,所以如果你有大文件,它们的影响会减少。
  • 连接时间:TCP 连接需要时间来打开(因为三向握手,这至少需要一个往返时间)并且它们需要时间才能达到全速(查看slow start algorithm 的示例)。

因此,与要发送的数据量无关,您必须等待一些固定的时间,如果您发送的数据越少,这会产生更大的影响。

我猜在正常情况下,打开连接的速度比增加的系统调用数量要慢得多。加快程序速度的一些方法是并行打开连接或将文件数据多路复用到单个长时间运行的连接中。

【讨论】:

  • 为什么会有更多的系统调用或连接?在这两种情况下,OP 发送 10 个文件,即打开、套接字、连接、接受、读取、发送文件、关闭和关闭 10 次。
  • 你是对的。无论如何,当我说它们对更大文件的影响比例较低时,我最好解释一下我的意思。
  • @alk 您正在通过更长的传输来分摊连接握手成本。
  • 我认为主要原因是TCP的慢启动机制。无论如何+1
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2018-09-19
  • 2014-08-10
  • 2020-10-30
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多