javascript - nodejs process.hrtime() 挂掉是什么原因?

标签 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 更新:

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

这是测试结构:

我有一个处理连接的 Node 服务器。客户端将在“连接”事件上发送一个“设置”事件。将在服务器端创建一个 Redis 订阅 channel ,然后从数据库进行一些查询,然后调用客户端对“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 次。但是后来我把请求次数提高到like 2000次(没有hrtime()代码),又无法完成。

我完全糊涂了。昨天还以为跟hrtime有关,当然不是,随便死循环都会挂。我被 hrtime 误导了。

但是现在有什么问题呢?

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

我解决了这个问题。

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

在这种情况下,服务器可能无法识别断开连接的旧套接字。您必须删除您的套接字对象并新建另一个对象。

所以你可能会发现连接计数不等于断开连接计数,这将阻止我们的代码与redis断开连接,从而导致整个循环因为redis没有响应而挂起。

最佳答案

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

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

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

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

关于javascript - nodejs process.hrtime() 挂掉是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567312/

相关文章:

javascript - CKEDITOR 的初始化函数不执行

javascript - 从 Chrome 扩展 AJAX 加载页面运行注入(inject)的 JS 函数

node.js - 为什么 Node.js Postgres Wiki 示例会在每个 http 请求中插入多条记录?

linux - 在 OS X 上运行 Linux shell

arrays - Mongoose $elemMatch 与多个相同属性

javascript - api调用Nodejs之间的延迟

javascript - 我正在尝试使用reduce...重新组合数组数组,但失败了

javascript - 提交表单后刷新页面

linux - 如何传递带有特殊字符的参数来调用 shell 脚本

linux - 使用 Ansible provisioner 重启 Vagrant 机器时同步文件夹丢失