Nodejs実戦体験

2137 ワード

非同期・非閉塞の枠組みとして、NodejsはI/O boundタスクを扱う際に、優れた性能を発揮します.Nodejsの出現時間が短いため、あまり知られていない問題もあります.ここで簡単に説明します.Nodejsを使っています.
言語の問題
Nodejsは64 bitの整数を正確に処理できません.
問題の説明:Nodejsはより大きな64 bitの整数を正確に処理できません.下記のコードの通りです.
実際に0 xf 000000の10進数は1729382256910270640であるべきです.
問題の原因:Javascriptはダブル精度の浮動小数点を使って数値を表していますので、正確に表現する整数範囲は-(2*53-1から2*53)-1で、具体的にはNumber.MAX_を参照してください.SAFE_INTEGER
問題解決:サードパーティライブラリを使用して、例えばcuint
問題を実現する
いくつかのnodeバージョンのsetInterval呼び出し間隔が正しくないです.
ほとんどの場合、setIntervalの呼び出し間隔は以下の場合である.-パラメータdelay:大部分のブラウザの挙動-(パラメータdelay+実行コール関数時間):古いnodeバージョン(例えば、0.1.14)、node現在(2017年5月9日)master分岐の動作
しかし、nodeのいくつかのバージョン(例えば、4.4.5)は、呼び出し間隔が(パラメータ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*コールコールバック関数時間)です.
参照リンク:-set Interval interval includes duration of calback
性能の問題
性能テスト
benchmarkjsはWebフロントエンド性能にも使えるし、Nodejs性能テストにも使えます.基本的な動作原理は以下の通りです.-anlysis phase:複数のテストプログラムを実行して、プログラムの実行時間をあらかじめ見積もってください.
関連資料は以下の通りです.-公式資料:benchmarkjs公式サイト-仕事原理紹介:benchmark.js:how it works
PM 2はNodejsの性能を線形に拡張できませんでした.
問題の説明:仮想マシン(8コアCPU、CPUタイプIntel Xeon E [email protected] GHz、8 Gメモリ)で、Nodejsのインスタンスを実行してウェブserverとして、毎秒1000個の要求(1000 rps)を処理できます.PM 2を使用して7つのNodejsのインスタンスを実行すると、7000 rpsではなく3000 rpsしか処理できない.
問題の原因:PM 2プロセス自体がクラスタの拡張を制限している.3000 rpsを処理すると、PM 2プロセスのCPU使用率はほぼ100%になります.