Linux
 Computer >> コンピューター >  >> トラブルシューティング >> Linux

Ubuntu でのメモリ リークの検出と修正:ステップバイステップ ガイド

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

メモリ リークが心配な場合は、ターミナルに「free」と繰り返し入力してみてください。 RAM の使用量が突然急速に増加し始めた場合は、すでにメモリ リークが検出されています。これを実行中に「bash:メモリが不足しています」のようなエラーが表示され、ターミナルしか開いていない、あるいは仮想コンソールだけが開いている場合は、ほぼ間違いなくエラーに対処していることになります。一部のメモリ リークはもう少し微妙な場合がありますが、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 に関する異常なエラーを表示した場合は、このプログラムのさらに単純なバージョンにアクセスするために、代わりにbusybox top を発行してみてください。リストを取得したら、%MEM または同様の列を見て、どのアプリケーションに最も多くのメモリが割り当てられているかを確認します。 PID を書き留めて、その PID の正確な番号に対して kill コマンドを発行することもできますが、これは単にアプリケーションを強制的に終了するだけです。これを実行しても、使用されているメモリがまだ解放されない可能性がありますが、もちろん試してみる価値はあります。

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

この問題が継続的に発生するプログラムを見つけた場合は、今後その動作が発生しないようにそのプログラムを構成できます。もちろん、個々のプログラムには異なる手段が必要になりますが、これは単にメモリ リークを検出するというタスクを超えています。

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

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

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

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

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

著者について

Ubuntu でのメモリ リークの検出と修正:ステップバイステップ ガイド

ケビン・アロウズ

Kevin Arrows は、10 年以上の業界経験を持つ、経験と知識が豊富なテクノロジー スペシャリストです。彼は Microsoft Certified Technology Specialist (MCTS) 認定を取得しており、最新の技術開発について常に最新の情報を入手することに深い情熱を持っています。 Kevin は、ソフトウェア開発、サイバーセキュリティ、クラウド コンピューティングなどの分野での専門知識と専門知識を示し、テクノロジー関連の幅広いトピックについて幅広く執筆しています。テクノロジー分野への彼の貢献は同僚から広く認められ、尊敬されており、複雑な技術概念を明確かつ簡潔に説明する能力が高く評価されています。


  1. Linuxで大きなファイルを見つける方法は?

    Linuxのオペレーティングシステムファミリは、1991年に開発およびリリースされたLinuxカーネルに基づくオープンソースオペレーティングシステムのグループです。Linuxは、ソフトウェア開発者およびプロユーザーの間で最も人気のあるオペレーティングシステムの1つです。この記事では、特定のディレクトリで大きなファイルを見つけて分離するために使用できるいくつかの方法について説明します。競合を避けるために、手順を注意深く正確に実行してください。 Linuxで大きなファイルを見つける方法 Linuxで大きなファイルを見つけるために使用できる方法はたくさんありますが、以下に最も便利な方法のいくつか

  2. Build a Linux .desktop Launcher for XAMPP Control Panel in 5 Easy Steps

    XAMPP は、Apache Friends によって配布されている人気のオープンソース Web サーバー スタック ソリューションです。 It aids in integrating the MariaDB database, Apache HTTP Server, and Perl interpreters with a PHP script interpreter. This integration facilitates developers in setting up local servers to test and deploy web content. Installing t