Node.js 网络爬虫无法同时处理 50 个以上的传出连接
Node.js webcrawler can't hanlde more than 50 simultaneous outgoing connections
我正在尝试处理大量 url(例如 50000)以检查某个字符串是否在页面上。我正在为列表中的每个 url 使用节点 0.10、npm request
模块和 async.eachLimit
,我的目标是确保此节点应用程序将 url 的列表处理为尽可能快。
我已将超时设置为 20 秒。问题是一旦我将 eachLimit 值(例如请求并发)设置为高于 50-100 的任何值,几分钟后大多数 urls 就会超时。我已验证这些 url 确实有效。 nload
没有显示任何高网络使用率,服务器上有大量 cpu 和内存剩余(没有别的是 运行),那么为什么节点不能稳定处理 500 url一次?
即使 url 位于不同的 IP 上,我也尝试将 globalAgent.maxSockets
设置为 200k 无济于事。
所以我不确定内部工作原理,但我已经解决了问题。
之前 - 我遇到超时,网络使用率最多不超过 2 mbps。我已经尝试将进程分叉到 16 个(8 核处理器,但它不受 cpu 限制,并且增加分叉数量超过核心数量被证明是有益的)而不是我得到大约 10 倍的任务每秒网络使用率平均为 35 mbps。
我正在尝试处理大量 url(例如 50000)以检查某个字符串是否在页面上。我正在为列表中的每个 url 使用节点 0.10、npm request
模块和 async.eachLimit
,我的目标是确保此节点应用程序将 url 的列表处理为尽可能快。
我已将超时设置为 20 秒。问题是一旦我将 eachLimit 值(例如请求并发)设置为高于 50-100 的任何值,几分钟后大多数 urls 就会超时。我已验证这些 url 确实有效。 nload
没有显示任何高网络使用率,服务器上有大量 cpu 和内存剩余(没有别的是 运行),那么为什么节点不能稳定处理 500 url一次?
即使 url 位于不同的 IP 上,我也尝试将 globalAgent.maxSockets
设置为 200k 无济于事。
所以我不确定内部工作原理,但我已经解决了问题。
之前 - 我遇到超时,网络使用率最多不超过 2 mbps。我已经尝试将进程分叉到 16 个(8 核处理器,但它不受 cpu 限制,并且增加分叉数量超过核心数量被证明是有益的)而不是我得到大约 10 倍的任务每秒网络使用率平均为 35 mbps。