是什么导致process.hrtime()挂在nodejs中?

时间:2016-04-12 08:13:19

标签: javascript linux node.js ubuntu

以下是代码:

var process = require('process')
var c = 0;
while (true) {
    var t = process.hrtime();
    console.log(++c);
}

这是我的环境:

在Windows 7中运行的Oracle VM virtualbox v5.0.4 r102546上的nodejs v4.2.4,Ubuntu 14.04 LTS

此循环在挂起之前只能运行大约60k到80k次。之后没有任何事情发生。

在我同事的电脑里可能有4万到6万次。但这个循环不应该永远持续下去吗?

我是第一次运行基准测试来测试建立连接的平均执行时间,所以我不能只是在完成所有事情后首先获得开始时间,然后结束时间。

这与我使用的操作系统有关吗?

如果有人知道这个问题,谢谢。

=============================================== ===========

更新2016.4.13:

在我提出这个问题后的一天,我意识到这是一个多么愚蠢的问题。这不是我真正想做的事情。所以我会进一步解释。

这是测试结构:

我有一个处理连接的节点服务器.Client将在'connect'事件上发送'setup'事件。 Redis订阅频道将在服务器端进行,然后从db进行一些查询,然后调用客户端的'setup'事件回调。客户端在'setup'回调中断开套接字,并在'disconnect'事件上重新连接。

客户端代码使用socket.io-client在后端和集群中运行以模拟高并发性。

代码如下: (这里没有列出一些功能)

[server]
socket.on('setup', function(data, callback) {
  queryFromDB();
  subscribeToRedis();
  callback();
}

[client]
var requests = 1000;
if (cluster.isMaster) {
  for (var i = 0; i < 100; ++i) {
    cluster.fork();
  }
} else {
  var count = 0;
  var startTime = process.hrtime();
  socket = io.connect(...);
  socket.on('connect', function() {
    socket.emit('setup', {arg1:'...', arg2:'...'}, function() {
      var setupEndTime = process.hrtime();
      calculateSetupTime(startTime, setupEndTime);
      socket.disconnect();
    }
  }

  socket.on('disconnect', function() {
    if (count++ < requests) {
      var disconnectEndTime = process.hrtime();
      calculateSetupTime(startTime, disconnectEndTime);
      socket.connect();
    } else {
      process.exit();
    }
  }
}

首先,连接只能进行500次或600次。不知怎的,我删除了所有的hrtime()代码,它使它达到了1000次。但是后来我把请求的数量增加了2000次(没有hrtime()代码),它再也无法完成了。

我完全糊涂了。昨天我认为它与hrtime相关,但当然不是,任何无限循环都会挂起。我被时间误导了。

但现在的问题是什么?

=============================================== ==================== 更新2016.4.19

我解决了这个问题。

原因是我的客户端代码使用socket.disconnect和socket.connect来模拟新用户。这是错的。

在这种情况下,服务器可能无法识别断开的旧套接字。你必须删除你的套接字对象和新的套接字对象。

因此,您可能会发现连接计数不等于断开连接计数,这将阻止我们的代码断开连接到redis,因此整个循环因为redis没有响应而挂起。

1 个答案:

答案 0 :(得分:0)

您的代码是无限循环 - 在某些时候,这将总是耗尽系统资源并导致应用程序挂起。

除了导致您的应用程序挂起之外,您发布的代码几乎没有其他功能。基本上,它可以这样描述:

For the rest of eternity, or until my app hangs, (whichever happens first):
    Get the current high-resolution real time, and then ignore it without doing anything with it.
    Increment a number and log it
Repeat as quickly as possible

如果这真的是你想要做的 - 你已经实现了它,但它总会在某个时刻挂起。否则,您可能希望进一步解释您想要的结果。