Node.jsのアクティブハンドルとは何ですか?質問する

Node.jsのアクティブハンドルとは何ですか?質問する

アプリケーションのアクティブ ハンドル数が増え続けています。アクティブ ハンドルの数は正確にはいくつですか? これは、アプリがクラッシュしないようにするために注意する必要があることでしょうか?

ベストアンサー1

アクティブハンドル

ハンドルは、開かれたファイル、データベース接続、リクエストなどの開かれたリソースへの参照です。ハンドルが閉じられているはずなのにアクティブになっている理由を理解するために、簡単な例を挙げます。

const http = require('http');

http.createServer((req, res) => {
    if (req.url === '/secret-url') {
        return; // nobody should have access to this part of our page!
    }

    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World!');
}).listen(3000);

このコードは何をするのでしょうか? ポートでサーバーを実行し3000Hello World「秘密の URL」へのリクエストを除くすべてのリクエストに対してメッセージを返します。しかし、このコードには問題があります。「秘密」の if 句に遭遇すると、接続が閉じられません。つまり、クライアントは必要なだけ接続を開いたままにします。代わりに接続を閉じるべきでした。この間違いにより、アクティブなハンドルの数が増え、メモリ リークが発生します。

通常、アクティブ ハンドルが 1 つの関数から別の関数に渡される可能性があるため、メモリ リークを検出するのは非常に困難であり、どのコードが接続を閉じる責任があるかを追跡することが困難になります。

アクティブハンドル数の増加は何を意味しますか?

開いているハンドルが常に増加している場合は、コードのどこかにメモリリークが発生している可能性があります。例のように、リソースを閉じるのを忘れた可能性があります。

Web サーバーのように長時間実行されるスクリプトを開発する予定がある場合、メモリ リークは特に非常に危険です...

メモリリークをチェックするにはどうすればいいですか?

メモリリークをチェックするにはさまざまなテクニックがあります。最も簡単な方法は、もちろんメモリを監視することです。pm2には、メモリが特定のポイントに達した場合にプロセスを再起動するオプションも組み込まれています。このトピックの詳細については、このガイド

これは操り人形師とどう関係があるのですか?

2つあります。まず、リクエストは非常に安価です。Node.jsサーバーアプリケーションでメモリリークが発生しても、数千のリクエストが行われた後でのみメモリ上で確認できるようになります。それとは対照的に、Puppeteerはとても高価です。Chromiumブラウザを開くと、50〜100メガバイトのメモリを消費します。そのため、起動するすべてのブラウザを閉じるようにしてください。次に、他の回答で既に言及されているように、オブジェクト(elementHandle) を手動で破棄してリソースをクリアする必要があります。

おすすめ記事