Nodejs实战体会

作为一个异步、非阻塞的框架,Nodejs在处理I/O bound任务时,表现出很好的性能。由于Nodejs出现时间较短,也存在一些不太为人知的问题。这里简单描述我在使用Nodejs中碰到的问题

语言问题

Nodejs不能正确处理64bit的整数

问题描述:Nodejs不能正确处理较大的64bit整数,如下述代码所示:
> 0xf000000000000000
17293822569102705000

实际上0xf000000000000000的十进制应该是17293822569102704640

问题原因:Javascript使用双精度浮点数表示数值,因此准确表达的整数范围为-(2**53-1 到 2**53) - 1,具体参考Number.MAX_SAFE_INTEGER

问题解决:使用第三方库,例如cuint

实现问题

一些node版本的setInterval调用间隔不正确

大多数情况下,setInterval的调用间隔为以下情况:
- 参数delay:大部分浏览器的行为
- (参数delay + 执行回调函数时间):老node版本(例如0.12.14) 、node当前(2017年5月9日)master分支的行为

但是node某些版本(例如4.4.5)存在bug,其调用间隔为(参数delay + 2 * 执行回调函数时间)。我们可以通过执行如下代码验证:

"use strict";

const sleep = require('sleep');

const delayTime = 100,
      sleepTime = 80;

let p = Date.now();
setInterval(() => {
  let c = Date.now();
  console.log(c - p);
  p = c;
  sleep.msleep(sleepTime);
} ,delayTime);

代码输出:

100
290
276
262
261
261
260
261
260
261

对测试的解释:
- 测试代码参数delay为100毫秒
- 测试代码执行回调函数时间为80毫秒
- 从输出来看,setInterval的调用间隔大致为260毫秒=(参数delay + 2 * 执行回调函数时间)

参考链接:
- setInterval interval includes duration of callback

性能问题

性能测试

benchmarkjs既可以用于Web前端性能,也可以用于Nodejs性能测试,基本工作原理如下:
- analysis phase:多次运行测试程序,预估程序运行时间
- sampling phase:多次运行测试程序,并保存运行时间

相关资料包括:
- 官方资料:benchmarkjs官网
- 工作原理简介:benchmark.js: how it works

PM2未能线性扩充Nodejs的性能

问题描述:在虚拟机上(8核CPU,CPU型号Intel Xeon E5-2420 0 @ 1.90GHz,8G内存)运行一个Nodejs实例作为web server,每秒可以处理1000个请求(1000rps);使用PM2运行7个Nodejs实例,只能处理3000rps,而不是7000rps。

问题原因:PM2进程本身限制了集群的扩展性。当处理3000rps时,PM2进程CPU使用率占到将近100%

你可能感兴趣的:(Nodejs实战体会)