【问题标题】:Design for fastest page download设计最快的页面下载
【发布时间】:2010-05-28 13:56:19
【问题描述】:

我有一个包含数百万个 URL/IP 的文件,并且必须编写一个程序来快速下载页面。连接速率应至少为 6000/s,文件下载速度至少为 2000,平均。 15kb 文件大小。网络带宽为 1 Gbps。

到目前为止,我的方法是:创建 600 个套接字线程,每个线程有 60 个套接字,并使用 WSAEventSelect 等待数据读取。文件下载完成后,将(下载文件的)内存地址添加到管道(简单向量)并触发另一个请求。当所有 socket 线程的总下载量超过 50Mb 时,将下载的所有文件写入磁盘并释放内存。 到目前为止,这种方法并不是很成功,我无法达到超过 2900 个连接/秒的速度,下载数据的速度甚至更低。

有人可以提出一种可以给我更好的统计数据的替代方法吗?我也在使用 8 Gig 内存的 windows server 2008 机器。此外,我们是否需要破解内核以便我们可以使用更多的线程和内存。目前我可以创建一个最大值。 1500 个线程和内存使用量不超过 2 gigs [技术上应该更多,因为这是一台 64 位机器]。 而且 IOCP 是毫无疑问的,因为我目前还没有这方面的经验,今天必须修复这个应用程序。

谢谢各位!

【问题讨论】:

  • 如果您需要处理超过 2 GB 的空间,请将其编译为 64 位(但您的代码可能还没有准备好),或者将 32 位应用程序与 /LARGEADDRESSAWARE 链接(这应该在 64 位系统上为 32 位应用程序提供 4GB 空间)

标签: c++ multithreading events sockets network-programming


【解决方案1】:

首先,您需要弄清楚是什么限制了您的应用程序。您是否受 CPU 限制、IO 限制、内存限制、网络限制……?您的线程之间是否存在锁定争用?等等……

从你的描述无法判断。您需要在分析器中运行您的应用程序才能了解瓶颈所在。

【讨论】:

    【解决方案2】:

    我没有看到使用额外套接字带来的任何性能提升。对于单个 CPU 处理器,它必须在各个套接字之间“共享”代码执行,从而划分性能。线程太多也是如此。

    要进行严格的性能处理,您将需要额外的硬件支持。您需要将传入(串行)数据转换为多个数据缓冲区(并行)。这不一定会提高你的表现。但是,如果您可以为每个物理连接下载一个页面,则可能会提高您的性能。

    大部分瓶颈(恕我直言)是接收数据包并分析其目的地。这些分析师越多,你的表现就越快;尽管当一个或多个导向器想要使用相同的内存区域(两个导向器正在下载相同的页面)时,您可能会遇到性能问题。

    如果您可以让硬件支持下载整个页面,而不会被 CPU 中断,那将是您将看到的最快性能。

    “这只是我的看法,我可能是错的。” -- 丹尼斯·米勒.

    【讨论】:

      猜你喜欢
      • 2016-05-17
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多