Ubuntuでメモリリークを検出する方法



問題を排除するために楽器を試してください

Ubuntuでメモリリークが発生する理由はいくつかありますが、幸いなことに、いつ発生するかは明らかです。多くの場合、バグのあるコードが最大の理由です。プログラマーは、不要になったメモリが解放されていることを確認する機会がなかった可能性があるためです。不安定なパッケージをインストールしたり、ソースからコードをコンパイルしたりしている場合は、この理由でメモリリークに対処している可能性があります。十分な数の物理RAMがインストールされていると、ソフトウェアアプリケーションパッケージがメモリ不足について不平を言うようになるため、おそらくそれらに気付くでしょう。



メモリリークが心配な場合は、端末に「free」と繰り返し入力してみてください。 RAMの使用量が急増し始めた場合は、すでにメモリリークが検出されています。 bashのようなエラーが表示された場合:これを実行しているときにメモリが不足していて、ターミナルまたは仮想コンソールしか開いていない場合は、ほぼ間違いなく1つを処理しています。一部のメモリリークは少し微妙な場合がありますが、Ubuntuとそのさまざまなスピンオフ機能は、これらの検出に役立つツールとパッケージを備えています。



Ubuntuでのメモリリークの検出

メモリリークの検出に使用されるツールは主にCLIプロンプトに基づいているため、実行するUbuntuのバージョンは関係ありません。これらは、通常のUbuntuのUnityターミナル内、Ubuntu Serverの仮想コンソール、Lubuntuのlxterm、KubuntuのKonsole、またはXubuntuのXfce内でも正常に機能するはずです。 sudo -sのような簡単なタスクを実行し、パスワードを入力して開始してください。



これにより、正しく実行された場合はルートシェルが取得されますが、すでに行き過ぎているリークを処理している場合は、メモリエラーが発生する可能性があります。実際にルートシェルにアクセスできる場合は、echo 3> / proc / sys / m / drop_cachesと入力し、Enterキーを押してから、exitと入力してみてください。 freeまたはfree-mをもう一度実行して、メモリの解放に役立つかどうかを確認してください。

一部のプログラマーは、追加の物理メモリが必要になるとすぐにキャッシュをフラッシュして再利用する必要があるため、カーネルにキャッシュを強制的に削除しても意味がないと主張します。ただし、これらのキャッシュを強制的にフラッシュするとシステムパフォーマンスが低下しますが、これは単なるテストであることに注意してください。システムを再起動すると、Linuxカーネルはメモリキャッシュを最初の状態と同じようにアセンブルする必要があります。

数人の人々がライン同期を追加することを提案しました。 sudo echo 3> / proc / sys / vm / drop_cachesは、cronが一貫して実行されるスクリプトになりますが、これはそもそもメモリキャッシュの目的を無効にします。空きメモリ自体は単に未使用のRAMであり、データをはるかに遅い速度からロードする必要があることを意味します電気機械 またはNANDストレージデバイス。これらのデバイスはどれほど高速であっても、RAMほど高速ではありません。つまり、メモリリークを修正する必要がありますが、最適な設定に設定した後は、実際にキャッシュシステムを改ざんしないでください。



マシンの使用中に定期的に発生する一貫したメモリリークが実際にあり、それを具体的に絞り込むことができないと判断したが、それでもCLIアクセスがある場合は、topコマンドを実行してみてください。これにより、実行中のプロセスのリストが表示されます。

Ubuntuでtopに関する異常なエラーが発生した場合は、このプログラムのさらに単純なバージョンにアクセスするために、代わりにbusyboxtopを発行してみてください。リストができたら、%MEMまたは同様の列を調べて、最も多くのメモリが割り当てられているアプリケーションを確認します。 PIDを記録し、PIDの正確な数に対してkillコマンドを発行することもできますが、これは単にアプリケーションを強制的に閉じるだけです。もちろん、一見の価値はありますが、これを行った後でも、使用しているメモリが解放されない可能性があります。

大量のメモリを使用しているアプリケーションを見つけた場合は、qを押して終了し、前の画面のPID番号を使用して####を強制終了してみてください。システムプロセスをこの方法で強制終了したり、保存していないものを強制終了したりしないでください。これは、Ctrl + Alt + Delタスクリストを使用して何かを強制終了するのと同じように考えてください。これは、同じプロセスにも使用できます。

これが一貫して発生しているプログラムを見つけたら、将来の動作を防ぐようにプログラムを構成できます。もちろん、個々のプログラムにはそれぞれ異なる手段が必要です。これは、単にメモリリークを検出するというタスクを超えています。

アプリケーションのトラブルシューティングだけでなく、実際にコードを操作する場合は、他にもいくつかの手段があります。 Ubuntuとその派生物は、プログラミング用のmemberrier、memusage、およびmemusagestatCルーチンを提供します。

man membarrier、man memusage、またはman memusagestatを使用するだけで、これらの重要なルーチンに関するLinuxプログラマーズマニュアルのページを表示できます。 Ubuntuの新しいバージョンがリリースされたときにライブラリの将来のバージョンでアップグレードがある場合、変更は常にここで概説されます。

グラフィックコンテンツが必要な場合、memusagestatには、メモリ使用量のグラフィック表現をPNGファイルに保存するオプションもあります。これは、メモリリークを定期的にチェックするアプリケーションを作成するために使用できるため、ユーティリティの作成者にとっても魅力的な機能になります。

また、メモリリークを見つけるのに役立つように、メモリ使用量をプロファイリングするためのツールであるmemprofをインストールすることもできます。作成しているプログラムの各関数が割り当てるメモリの量に関するプロファイルを生成します。また、既存のメモリをスキャンして、割り当てられているが本物の参照を備えていないブロックを見つけることもできます。これは、標準Cライブラリのメモリ割り当て機能を上書きするためにライブラリをプリロードすることによって行われます。

これを使用する場合は、リリースする前に、コードの先頭からincludememprof行を削除してください。これは、リークがないことを確認するために使用されますが、コードをパッケージ化してリポジトリにリリースする場合、依存関係になることはありません。

読んだ4分