Smemを使用してLinuxRAMの使用状況を簡単に理解する

公開: 2022-01-29
赤い背景の上にBashシェルのロゴを表示するノートパソコンの画面
fatmawati achmad zaenuri / Shutterstock

Linuxのメモリ使用量は、解釈が難しく、理解しにくい場合があります。 smemを使用すると、プロセスが使用しているメモリと、最も使用しているプロセスを簡単に見つけることができます。

メモリ使用量

Linuxには、コンピューターのRAMで何が起こっているかを確認するための多くの方法があります。 問題は、メモリ管理がオペレーティングシステムにとって複雑な課題であるということです。 物理RAM、スワップスペースの形の仮想RAM、および一度に実行されているさまざまなタイプのプロセスの要求を調整する必要があります。

お使いのコンピュータはPCゲームにどのくらいのRAMを必要としますか?
関連あなたのコンピュータはPCゲームにどれくらいのRAMを必要としますか?

プロセスは、メモリにロードするときにRAMを消費します。 次に、RAMを追加して、設計されたタスクを実行するためのスペースを確保します。 RAMにほとんど影響を与えないプロセスもあれば、メモリを大量に消費するプロセスもあります。

カーネルとその他のオペレーティングシステム、デスクトップ環境、および実行するすべてのアプリケーションまたはコマンドラインセッションはすべて、コンピューターにインストールされている有限量のRAMの一部を要求しています。 一部のプロセスは他のプロセスを生成します。 一部のプロセスは他のプロセスとRAMを共有します。

Linux端末からメモリ使用量を確認する方法
関連Linuxターミナルからメモリ使用量を確認する方法

これらすべてを解読し、「このプログラムまたはプロセスはどのくらいのRAMを使用していますか?」という質問に対する簡単な答えを考え出そうとしています。 意外な挑戦になる可能性があります。 粒度は素晴らしく、その場所がありますが、同様に、情報の過剰殺害は障害になる可能性があります。

広告

たとえば、 catを使用して/ proc / meminfo疑似ファイルシステムを覗くと、この記事の調査に使用したマシンで50行の出力が返されました。 どこから始めますか?

 cat / proc / meminfo

そして、いくつかのLinuxユーティリティは異なる答えを出します。 テストマシンでは、実行がlessインスタンスがあり、プロセスIDは2183でした。

pmapユーティリティを-x (拡張)オプションとともに使用して、プロセスのメモリ使用量の全体像を取得できます。 lessのインスタンスのプロセスIDで使用します:

 pmap -x 2183 

単一プロセスのメモリマップのクエリ

出力の下部に、使用されているメインRAMの量である常駐セットサイズの合計が表示されます。

lessの単一インスタンスのpmap出力

次に、 psユーティリティを-o (出力)オプションとともに使用し、 RSS列を選択して、 lessの同じインスタンスのプロセスIDを渡しました。

 ps -o rss 2183 

psを使用してlessの同じインスタンスのRSSを表示する

別の結果が得られます。 これは、 ps作成者側の設計上の決定です。 これはpsmanページからです:

SIZEフィールドとRSSフィールドは、ページテーブル、カーネルスタック、struct thread_info、structtask_structなどのプロセスの一部をカウントしません。 これは通常、常に常駐する少なくとも20KiBのメモリです。 SIZEは、プロセスの仮想サイズ(コード+データ+スタック)です。
広告

他のユーティリティの作成者は、RAM使用量を測定する方法について独自の見解を持っています。

RSS、USS、およびPSS

常駐セットサイズ(RSS)は、プロセスに割り当てられたRAMの量です。スワップスペースは除きますが、プロセスが使用している共有ライブラリに必要なRAMは含まれます。

コンピュータのRAMがいっぱいであることが良い理由
関連コンピュータのRAMがいっぱいになっているのはなぜ良いのか

RSSは、ほとんどの場合、RAM使用量を過大報告します。 2つ以上のプロセスが1つ以上の共有ライブラリを使用する場合、RSSは各ライブラリのRAM使用量をそれらの各プロセスのRAM使用量のカウントに単純に追加します。 不正確さだけでなく、これにはある種の皮肉があります。 共有ライブラリとは、各プロセスがライブラリの独自のプライベートインスタンスをロードする必要がないことを意味します。 ライブラリがすでにメモリ内にある場合は、ライブラリを共有し、RAMのオーバーヘッドを削減します。

Proportional Set Sizeは、共有メモリの量を、それを共有しているプロセス間で分割することにより、これに対処しようとします。 一部のメモリを共有するプロセスが4つある場合、PSSは、共有RAMの25%がそれらの各プロセスによって使用されていると報告します。 これは概算ですが、RSSが描く絵よりも、何が起こっているかによく似ています。

一意のセットサイズは、プロセスによって直接消費されているか、プロセスによってのみ使用されているライブラリによって使用されているかに関係なく、プロセスによって排他的に使用されているRAMの量です。 ここでも、スワップスペースは無視されます。 本物の物理RAMにのみ関心があります。

USSとPSSは、smemの作者であるsmemによって提案された用語と概念です。

smemユーティリティ

smemユーティリティは、プロセス、ユーザー、マッピング、またはシステム全体で使用されているメモリについてレポートします。 テストしたすべてのディストリビューションで、インストールが必要でした。 Ubuntuにインストールするには、次のコマンドを使用します。

 sudo apt install smem 

Ubuntuにsmemをインストールする

Fedoraにsmemをインストールするには、次のように入力する必要があります。

 sudo dnf install smem 

Fedoraにsmemをインストールする

Manjaroにsmemをインストールするには、次を使用します。

 sudo pacman -Sy smem 

Manjaroにsmemをインストールする

広告

オプションなしでsmemを使用すると、RAMを使用しているプロセスのリストが表示されます。

 smem 

コマンドラインオプションなしでsmemを呼び出す

ターミナルウィンドウに情報の表が表示されます。

smemのデフォルト出力

列は次のとおりです。

  • PID :メモリを使用しているプロセスのプロセスID。
  • ユーザー:プロセスを所有するユーザーのユーザー名。
  • コマンド:プロセスを起動したコマンドライン。
  • スワップ:プロセスが使用しているスワップスペースの量。
  • USS :ユニークなセットサイズ。
  • PSS :プロポーショナルセットサイズ。
  • RSS :レジデントセットサイズ。

サイズをパーセンテージで表示するには、 -p (パーセンテージ)オプションを使用します。

 smem -p 

smem-pオプションを使用してパーセンテージを要求する

バイト単位のサイズはパーセンテージに置き換えられました。

パーセンテージを示すsmem出力

より人間にわかりやすい形式でレンダリングされた図を表示するには、 -k (省略形)オプションを使用します。 これにより、数値が縮小され、ユニットインジケータが追加されます。

 smem -k 

smem -kオプションを使用して、単位インジケーターでサイズを表示する

生のバイトの代わりに、サイズはメガバイト、ギガバイトなどで表示されます。

K、M、Gなどの単位インジケーターを使用したsmem出力

広告

合計行を追加するには、 -t (合計)オプションを使用します。

 smem -k -t 

smem -tオプションを使用して、合計行を出力に追加します

出力の最後の行には、各列の合計が表示されます。

smem出力の下部にある合計行

レポートの精緻化

ユーザー、マッピング(ライブラリ)、またはシステム全体のメモリ使用量についてレポートするようにsmemに依頼できます。 ユーザーで出力をフィルタリングするには、 -u (ユーザー)オプションを使用します。 自分の使用法以上のものを確認したい場合は、 sudoを使用してsmemを実行する必要があることに注意してください。

 smem -u
 sudo smem -u 

sudoを使用した場合と使用しない場合のsmem-uオプションの使用

ご覧のとおり、8文字を超えるユーザー名の場合、出力の形が崩れます。

ライブラリを使用しているプロセスやそれらのプロセスを所有しているユーザーに関係なく、使用中のライブラリにマップされた使用状況を確認するには、 -m (マッピング)オプションを使用します。

 smem -m -k -t 

smem-mオプションを使用してマッパーレポートを取得する

また、人間が読める値と合計も求めました。

ライブラリによるメモリ使用量を示すsmemマップレポート

システム全体のメモリ使用量を確認するには、 -w (システム全体)オプションを使用します。

 smem -w -k -t 

smemシステム全体のレポート

単一のプログラムに関するレポート

少しのコマンドラインの魔法で、単一のプログラムとそのすべてのサブプロセスについてレポートできます。 smemからの出力をtailにパイプし、 tailに最後の行のみを表示するように依頼します。 smemに、人間が読める値を使用して合計を提供するように指示します。 合計が最後の行になり、それが行のtailに表示されます。

広告

smem-c (列)オプションを使用して、出力に含める列を指定します。 これを[プロポーショナルセットサイズ]列に制限します。 -P (プロセスフィルター)オプションを使用すると、 smemに検索文字列を指定できます。 一致する出力行のみが含まれます。

 smem -c pss -P firefox -k -t | テール-n1 

smemを使用して、プロセスとその子によるメモリの使用法を示します

これは、プログラムとその子プロセスのRAM消費量をすばやく簡単に調べる方法です。

グラフの生成

--pieまたは--barオプションを渡して、 smemにグラフを生成させることができます。 カテゴリが多すぎると、グラフがすぐに理解できなくなりますが、視覚的な概要をすばやく確認するのに役立ちます。

コマンド形式は次のとおりです。

 smem --pie name -s uss 

smemに円グラフの作成を依頼する

円グラフは、独自のビューアウィンドウに表示されます。

独自のビューアウィンドウにあるsmem円グラフ

他のプロットを表示するには、 ussの代わりにpssまたはrssを使用します。 棒グラフを表示するには、 --barの代わりに--pieを使用します。

広告

これを機能させるには、 matplotlibライブラリとともにPythonをインストールする必要があります。 これらは、テストしたUbuntu、Fedora、およびManjaroディストリビューションにすでにインストールされています。

良いものは小さなパッケージで提供されます

smemユーティリティには、さらにいくつかのトリックがありますmanページを確認することをお勧めします。 その主なレパートリーは、ここで概説したものであり、CLIツールボックスにある素晴らしい小さなツールです。

関連:知っておくべき37の重要なLinuxコマンド