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()
まず、タスクマネージャのパフォーマンスを比較用に記載します。
タスクマネージャを見ると下記のようになっていました。ほぼ何も動いていない状況です。
■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
以上。