不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

Node.jsのOSモジュールについて

Node.jsで運用ツール何かつくれないかと思って今日はosモジュールを簡単にいじっていました。
メモしたことをまとめます。

■環境
 OS: Windows 10 Home 64bit
 node: v8.9.1
 os: 0.1.1
 CPU: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
 Memory: 16GB

■結論
 監視目的でOSの値をとりたいときは、osは利用しないほうが無難です。
 監視で見たい項目としては、CPU使用率、空きメモリ量、NW使用量、ディスク使用率を見たいかと思います。
 osでは、NW使用量、ディスク使用率は取得できないようです。
 お手軽に値をとってモックを作りたいという場合は、最適かもしれません。

■実行してみたこと
 ・os.cpus()
 ・os.freemem(), os.totalmem()
 ・os.loadavg()

まず、タスクマネージャのパフォーマンスを比較用に記載します。
タスクマネージャを見ると下記のようになっていました。ほぼ何も動いていない状況です。
f:id:hiyo-ac:20180305101015p:plain

■os.cpus()
 os.cpus()はCPUの値を取得します。
 単純にos.cpus()を実行すると下記のようにコア数分のオブジェクトが返ってきました。

console.log(os.cpus());
/* 実行結果
[ { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times:  { user: 5499656, nice: 0, sys: 4311468, idle: 69397328, irq: 1271859 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 3436765, nice: 0, sys: 849812, idle: 74921703, irq: 105546 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 3931750, nice: 0, sys: 2558750, idle: 72717781, irq: 35125 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 2238031, nice: 0, sys: 994328, idle: 75975937, irq: 16343 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 3262421, nice: 0, sys: 1734968, idle: 74210890, irq: 27828 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 2070062, nice: 0, sys: 827625, idle: 76310609, irq: 13906 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times: { user: 2958625, nice: 0, sys: 1474734, idle: 74774921, irq: 23687 } },
  { model: 'Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz',
    speed: 3408,
    times:
     { user: 3471812, nice: 0, sys: 1371281, idle: 74365187, irq: 15843 } } ]
*/

 
これだと少し見づらいのでコアごとの使用率と全体のidleを見てみます。
実行結果は下記のようになりました。注目いただきたいのが、total_idleが93%?となり、
パフォーマンスモニタの値と差異がでています。こちらの希望としては、98ないし99になってほしかったんですが…
何がさになってしまったのでしょうか不明です。ここまででos.cpus()の検証は終わりにしました。

function calcCPU(){
  var cpus = os.cpus();
  var total_all = 0;
  var total_idle = 0;

  for(var i = 0, len = cpus.length; i < len; i++) {
    console.log("CPU %s:", i);
    var cpu = cpus[i], total = 0;
    
    for(var type in cpu.times) {
        total += cpu.times[type];
    }

    for(type in cpu.times) {
        console.log("\t", type, Math.round(100 * cpu.times[type] / total));
    }
    total_all += total;
    total_idle += cpu.times.idle;
  }

  console.log("total idle:",  Math.round(100 * total_idle / total_all));
}

/*結果
CPU 0:
         user 7
         nice 0
         sys 5
         idle 86
         irq 2
CPU 1:
         user 4
         nice 0
         sys 1
         idle 94
         irq 0
CPU 2:
         user 5
         nice 0
         sys 3
         idle 92
         irq 0
CPU 3:
         user 3
         nice 0
         sys 1
         idle 96
         irq 0
CPU 4:
         user 4
         nice 0
         sys 2
         idle 94
         irq 0
CPU 5:
         user 3
         nice 0
         sys 1
         idle 96
         irq 0
CPU 6:
         user 4
         nice 0
         sys 2
         idle 94
         irq 0
CPU 7:
         user 4
         nice 0
         sys 2
         idle 94
         irq 0
total idle: 93
*/

■os.freemem(), os.totalmem()
 OSの空きメモリ量を表示するのがos.freemem()、マシン全体のメモリを表示するのがos.totalmem()です。
 それぞれ実行してみると下記値になりました。こちらの値はとりたい値が取れているのでOKです。
 バイトで表示されるため、GBなどで表示したい場合は1024で割ってください。

function calcMemory(){
  var memory = {};
  memory.free = os.freemem();
  memory.total = os.totalmem();
  memory.freepercent = memory.free / memory.total * 100;
  console.log("Free Mem:" + memory.free + ", Total Mem:" + memory.total + ", Free(%):" + memory.freepercent);
}
/*結果
Free Mem:12274393088, Total Mem:17120821248, Free(%):71.69278219894886
*/

■os.loadavg()
 ロードアベレージWindowsには概念があるかわかりません。
 apiドキュメントを見ると、Windowsの場合は常に0を返すと記載がありました。
 そのため、期待した結果が返ってくるかの確認しました。
”The load average is a UNIX-specific concept with no real equivalent on Windows platforms. On Windows, the return value is always [0, 0, 0].”

console.log(os.loadavg())
/*結果
[0, 0, 0]
*/

■参考
 os apiのドキュメントは下記となります。
OS | Node.js v9.7.1 Documentation



以上。