

node.jsを使い開発を行っており, 動作テストでselenuimを動かしたところseleniumかテストサイトのバグで大量のメモリを消費し,
およそ22時間PCが動かない状況となっております.

メモリ使用過多によるPCの操作不能はどのように解決出来ますか.  
可能であれば再起動等, 既存の未保存のデータを消去せずに問題を解決したいです.  
OSはwindows7, メモリは8ギガバイトとなっております.

今回はwindowsですが, 他osでも使用可能な解決策があれば, 後学のために回答頂ければ幸いです.

また, このようなメモリ過多による動作不能を回避するソフトウェア開発上の手法やツールがありましたら, 同様の問題の回避に努めたいため, 回答頂きたいです.

以上, 夜遅くに失礼いたしました. ご回答よろしくお願いいたします.


CC BY-SA 4.0
2019-11-27T16:46:46.563
60897
2019-11-28T02:26:23.527
36817
question
linux windows node.js
動作テスト中にメモリを大量に消費するバグに遭遇し、PCが動作しなくなった解決策は何ですか


消費メモリ量が実メモリ量をはるかに超えた結果として
[スラッシング](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0)
が発生している状況なわけです。

その「メモリを大量に食うソフト」の未保存データは保存するすべがないのであきらめましょう（数年間その状態で放置しておけば保存されているかもしれないが、それなら再起動後に再入力するほうが手早い）。

他のプロセス、例えばエディタなどの未保存データであれば原因プロセスを強制終了させれば動作が回復し保存できるはず。

が、実マシンがこの状況に陥ったら事実上操作不能で、オイラならあきらめて電源を切ります（ `Ctrl+Alt+Del`
でタスクマネージャが開けますが、１操作に数時間とかかかる可能性がある。それが待てるなら試してみる価値はある）

* * *

スラッシングを起こさせないためには

  * Linux 系 OS では

`ulimit` というコマンドでプロセスの資源の上限を制約できます。事前にメモリ量等を制約しておくとよいでしょう。

  * Linux / Windows 共通

仮想化ソフトウェアを使って (Hyper-V 等)
当該「メモリを使うプログラム」を仮想マシン上で動かします。スラッシングして死ぬのは仮想マシンだけですので、実マシンから強制終了させることができます。仮想マシンに物理資源を全部割り当てないことが重要っす。

  * Windows OS では

昔は Windows System Resource Manager ってのがあったらしいのですが今は削除されているとのこと。上記手順 (Hyper-V)
でやれ、ということらしいです。


CC BY-SA 4.0
2019-11-28T02:20:12.227
60898
2019-11-28T02:20:12.227
8589
60897
answer


> メモリ使用過多によるPCの操作不能はどのように解決出来ますか.

タスクマネージャーで、CPU 消費の多いプロセスの優先度を下げます。

[![タスクマネージャーの例](https://i.stack.imgur.com/vJX1z.png)](https://i.stack.imgur.com/vJX1z.png)

この「詳細」タブから CPU を消費しているプロセスを右クリックして  
優先度を「低」に設定します。

[![優先度](https://i.stack.imgur.com/SJLac.png)](https://i.stack.imgur.com/SJLac.png)

うまくいくと、システム全体をフリーズ状態にしていたプロセスの優先度が下がって  
作業がやりやすくなります。

全てのプロセスで優先度を変更できるわけではありませんし、  
速度低下の原因が メモリ不足による 仮想メモリのスワップが原因の場合は  
それほど効果はありません。  
CPU の消費 や ディスクアクセスを見て判断します。

> 既存の未保存のデータを消去せずに問題を解決したいです.

アプリがどのように内部メモリーを保持しているのかわからないため難しいと思います。  
アプリ側で定期的にデータを保存するような作りでないと難しいでしょう。

タスクマネージャから プロセスを選択して、「ダンプファイルの作成」で 実行中のアプリのメモリの状態を取得できます。  
Visual Studio で 取得した ダンプファイルを開くと、プロセスが実行していた場所等がわかります。  
しかし、ここから 未保存のデータを取り出すことはむつかしいと思います。  
バイナリエディタで コアダンプを確認して 使えそうな文字列が 少し見つかる程度だと思います。

私は node.js には詳しくないのですが、調べてみると 実行中のプロセスにアタッチして  
変数の値を見るようなことが可能なようです。

<https://stackoverflow.com/questions/24927233/nodejs-process-hang-how-could-i-
debug-it-or-collect-dump>  
では  
<https://www.npmjs.com/package/why-is-node-running>  
や  
<https://stackoverflow.com/questions/1911015/how-do-i-debug-node-js-
applications/16512303#16512303>

> メモリ過多による動作不能を回避するソフトウェア開発上の手法やツール

まずは、アプリ側の問題を調査する必要があるでしょう。

node.js にデバッグ接続して原因調査をする手法か  
Visual Studio で 実行中のプロセスにアタッチして デバッグする手法を試してみてください。  
ソースコードが無いと原因の特定まではむつかしいかもしれませんが・・。

<https://docs.microsoft.com/ja-jp/visualstudio/javascript/debug-
nodejs?view=vs-2019>

<https://nodejs.org/api/debugger.html>

SysInternals にも ハングアップした時に自動的にダンプを取得するツールとかあります。  
<https://docs.microsoft.com/en-us/sysinternals/downloads/procdump>  
アプリ起動前に 設定が必要なので 今回は使えませんが、参考まで・・。


CC BY-SA 4.0
2019-11-28T02:26:23.527
60900
2019-11-28T02:26:23.527
18851
60897
answer