まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:memory

とある目的で「CPU 負荷とメモリ利用状態を Node.js から取得する」プログラムを作ったので、github で公開してみました:
https://github.com/dotnsf/cpumem

2019020101



Git clone かダウンロードでソースコードをコピー&展開し、
$ node cpumem

で実行します。デフォルト設定だと5秒ごとに以下のようなフォーマットで結果をコンソールに出力します(赤字はコメント):
{
  "cpus": [
    {
      "user": 5.438012814200345, 1つ目のCPUコアのユーザープロセスによる利用率
      "nice": 0.6939879964053115,  1つ目のCPUコアの実行優先度を変更したユーザープロセスによる利用率
      "sys": 0.6002479372975158,  1つ目のCPUコアのシステムプロセスによる利用率
      "idle": 93.26775125209683,  1つ目のCPUコアのアイドル状態になっている割合
      "irq": 0
    },
      :
 (CPU コア数ぶん繰り返し)
      :
  ],
  "totalmem": 8284266496, 総メモリ量
  "freemem": 345624576, 空きメモリ量
  "uptime": 24193171, システム稼働時間(秒)
  "loadavg": [
    0.36669921875, 直近1分間の平均CPUおよびIO利用率
    0.4462890625, 直近5分間の平均CPUおよびIO利用率
    0.50439453125 直近15分間の平均CPUおよびIO利用率
  ],
  "timestamp": 1548947954556 記録したタイミングのタイムスタンプ値
}


2019020100


公開しているこのプログラムでは取得結果を単純にコンソール出力しているだけですが、実際にはこの結果を MQTT などでどこかに飛ばして記録したり、データベースに格納したりすることを想定しています。

中身はすごくシンプルで、単純に os パッケージを require し、os パッケージで提供されている機能をほぼそのまま使って CPU 利用率やメモリ使用量を求め、それを出力しているだけです。CPU 利用率のみ、いわゆる「パーセント」値で出力されるよう計算していますが、その程度です。


なお、デフォルトの取得間隔である5秒を変更する場合は、settings.js 内の exports.intervalms の値を変更してから実行してください(値はミリ秒で指定)。






Node.js を使っていると、たまにこんなエラーメッセージが出てサーバーが止まることがあります:
# node .
  :
  :

FATAL ERROR: JS Allocation failed - process out of memory
Aborted (core dumped)

"out of memory" と書かれているのでメモリ不足な状態になっているように見えます。が、これは物理メモリが足りないというメッセージではなく、Node.js の(1オブジェクトあたりの)ヒープサイズが足りなくなっている、というメッセージです。ちなみにデフォルトでは 512MB です。なので物理メモリを大量に搭載しているサーバーでも、サイズの巨大なファイルを扱ったり、大容量のアウトプットデータを取り扱おうとするとこのエラーは起こりうる、ということになります。

このヒープサイズを増やして利用するには node の実行時にパラメータを指定することで可能です。以下の例では 2048MB(=2GB) を指定しています:
# node --max-old-space-size=2048 .
  :
  :

あくまで「Node.js のヒープサイズ」の指定なので、他に使うサーバーアプリとの兼ね合いやスワップも含めた物理メモリサイズも含めて指定サイズを見積もる必要があります。


(参考)
http://stackoverflow.com/questions/29442965/fatal-error-js-allocation-failed-process-out-of-memory-aborted-core-dumped 


このページのトップヘ