为什么node.js没有使用所有可用带宽?

时间:2014-02-22 14:48:01

标签: node.js amazon-s3 coffeescript

我在 coffescript 中有 node.js 的示例代码。我想要做的是从S3并行下载很多对象。

我有一个包含朋友列表的用户列表,我希望尽快下载所有这些朋友。示例代码等待1秒钟以模拟下载用户对象的花费,并从S3下载对象以模拟朋友对象的下载。

async = require 'async'
aws = require 'aws-sdk'
cluster = require 'cluster'
config = require './config'

USERS   = 30
FRIENDS = 300

class TestSpeed

  constructor: () ->
    @s3 = new aws.S3 accessKeyId:config.S3_KEY, secretAccessKey:config.S3_SECRET

  start: (next) =>
    async.map([0...USERS], @downloadUser, next)

  downloadUser: (x, next) =>
    console.log "Starting to download user #{x}"
    setTimeout(
      =>
        console.log "User downloaded"
        @downloadFriends(next)
      , 1000
    )

  downloadFriends: (next) =>
    console.log "Starting to download friends"
    async.map([0...FRIENDS], @downloadFriend, next)

  downloadFriend: (x, next) =>
    console.log "Starting to download friend #{x}"
    @s3.getObject Bucket:config.BUCKET, Key:config.UID, (err, data) ->
      return console.log err if err? 
      console.log "Friend downloaded"
      next()

if cluster.isMaster
  console.log("starting at master process...")
  cluster.fork() for [0...4]

console.log "init"
new TestSpeed().start (err, result) =>
  return console.trace err if err?
  console.log "OK"

我期望发生的是节点使用所有可用带宽,因为我在4核机器中创建了4个进程。但我得到的是大约50Mbps的下载量,通过8个进程(超过可用核心数量)增加到100Mbps。

我认为node.js使用了所有可用资源,但CPU和网络都没有100%工作。我错过了什么?

1 个答案:

答案 0 :(得分:1)

我猜你受到maxSockets的限制。

在文件的开头尝试require('http').globalAgent.maxSockets = 1000

看看这个问题Optimizing Node.js for a large number of outbound HTTP requests?