我在 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%工作。我错过了什么?
答案 0 :(得分:1)
我猜你受到maxSockets的限制。
在文件的开头尝试require('http').globalAgent.maxSockets = 1000
。
看看这个问题Optimizing Node.js for a large number of outbound HTTP requests?