这个问题专门针对 Nodejitsu,但类似的效果似乎也发生在其他 VPS 上。我有一个使用 socket.io 的实时游戏,我注意到的一件事是服务器偶尔会在响应之前等待过多的时间。如果在该时间范围内发送了多个请求,它们的行为就好像它们都已排队并立即处理。我怀疑它与共享硬件上其他用户的存在模糊相关(就像任何 VPS 的情况一样)。
无论如何,为了测试这一点(并确保它不是由于我的游戏代码造成的),我构建了一个最小的测试用例:
express = require('express')
http = require('http')
app = express()
server = http.Server(app)
io = require('socket.io').listen(server)
io.sockets.on('connection', function(sock){
sock.on('perf', function(data, cb){
cb([Date.now()]); //respond with the current time
})
})
app.get('/', function(req, res){
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Methods", "HEAD,GET,PUT,POST,DELETE")
res.header("Access-Control-Allow-Headers", "X-Requested-With")
res.end(JSON.stringify([Date.now().toString()])); //http equivalent of perf function
})
server.listen(process.env.PORT || 6655, function(){
console.log('listening now')
})
我有一个带有 socket.io 的简单空白 HTML 页面,它会定期发送一个perf
事件以及回调触发所需的时间。它仍然显示相同的内容:
请注意,条形长度表示时间量的平方根,而不是线性量。
当我不依赖 socket.io 时,我使用 XHR 对当前响应时间进行类似的测量,结果非常相似,有很多低延迟响应(尽管基线比 websockets 高,正如预期的那样)和一些偶尔看起来堆积的尖峰。
奇怪的是,如果你在多个浏览器窗口和不同的浏览器中打开它,不同的浏览器之间似乎存在相关性(事实上它在某些服务器上完全不存在或频率显着降低),这似乎意味着它是服务器端现象。但是,某些浏览器会出现延迟峰值,而其他浏览器不会出现延迟峰值,并且同一会话的两个 Chrome 窗口似乎几乎完全相同,这表明这是本地发生的事情(每台计算机,或每台浏览器,网络明智的)。
从左到右:Chrome Incognito、Chrome(常规)、Firefox、Chrome(常规)
无论如何,这几个月来一直让我感到困惑,我真的很想了解导致它的原因以及如何解决它。