我正在开发一项新服务来为我们公司的多个 Web 资产运行 QA,并且遇到了一个有趣的网络并发问题。为了提高性能,我使用 TPL 根据大量 url 创建 HttpWebRequest,以便它们可以并行运行;但是,我似乎无法找到过程中的瓶颈所在。
到目前为止我的观察:
- 我最多可以通过 TPL 获得大约 25-30 个并行线程
- 服务的 CPU 永远不会中断 5-6%(在 1 - 4 个内核上运行,有和没有 H/T)
- NIC 使用率从不中断 2-3%
- 整体网络流量似乎没有受到影响(其他用户没有抱怨,同时运行的速度测试没有显示出太大的影响)
- 在我们的办公网络 (15Mbps) 或我们的数据中心 (100+Mbps) 上运行之间的速度变化不大
- 通过一次从多台主机下载而不是从一台主机下载大量页面,我获得了一点性能提升。
可能的痛点:
- CPU(内核或硬件线程数)
- 网卡
- 最大允许并发 HttpWebRequest 数
- 局域网
- 广域网
- 路由器/交换机/负载均衡器
所以问题是:
显然,现在可以在几分钟内下载整个互联网,但我很想知道在这种情况下瓶颈在哪里,以及可以采取什么措施来克服它。
附带说明一下,我们目前正在使用 3rd 方服务进行抓取,但我们在某些方面受到它们的限制,并且希望获得更大的灵活性。关于公司秘密酱汁或箭尖上的毒药...... :)