Smemを使用してLinuxRAMの使用状況を簡単に理解する
公開: 2022-01-29 Linuxのメモリ使用量は、解釈が難しく、理解しにくい場合があります。 smem
を使用すると、プロセスが使用しているメモリと、最も使用しているプロセスを簡単に見つけることができます。
メモリ使用量
Linuxには、コンピューターのRAMで何が起こっているかを確認するための多くの方法があります。 問題は、メモリ管理がオペレーティングシステムにとって複雑な課題であるということです。 物理RAM、スワップスペースの形の仮想RAM、および一度に実行されているさまざまなタイプのプロセスの要求を調整する必要があります。
プロセスは、メモリにロードするときにRAMを消費します。 次に、RAMを追加して、設計されたタスクを実行するためのスペースを確保します。 RAMにほとんど影響を与えないプロセスもあれば、メモリを大量に消費するプロセスもあります。
カーネルとその他のオペレーティングシステム、デスクトップ環境、および実行するすべてのアプリケーションまたはコマンドラインセッションはすべて、コンピューターにインストールされている有限量のRAMの一部を要求しています。 一部のプロセスは他のプロセスを生成します。 一部のプロセスは他のプロセスとRAMを共有します。
これらすべてを解読し、「このプログラムまたはプロセスはどのくらいのRAMを使用していますか?」という質問に対する簡単な答えを考え出そうとしています。 意外な挑戦になる可能性があります。 粒度は素晴らしく、その場所がありますが、同様に、情報の過剰殺害は障害になる可能性があります。
たとえば、 cat
を使用して/ proc / meminfo疑似ファイルシステムを覗くと、この記事の調査に使用したマシンで50行の出力が返されました。 どこから始めますか?
cat / proc / meminfo
そして、いくつかのLinuxユーティリティは異なる答えを出します。 テストマシンでは、実行がless
インスタンスがあり、プロセスIDは2183でした。
pmap
ユーティリティを-x
(拡張)オプションとともに使用して、プロセスのメモリ使用量の全体像を取得できます。 less
のインスタンスのプロセスIDで使用します:
pmap -x 2183
出力の下部に、使用されているメインRAMの量である常駐セットサイズの合計が表示されます。
次に、 ps
ユーティリティを-o
(出力)オプションとともに使用し、 RSS
列を選択して、 less
の同じインスタンスのプロセスIDを渡しました。
ps -o rss 2183
別の結果が得られます。 これは、 ps
作成者側の設計上の決定です。 これはps
のman
ページからです:
他のユーティリティの作成者は、RAM使用量を測定する方法について独自の見解を持っています。
RSS、USS、およびPSS
常駐セットサイズ(RSS)は、プロセスに割り当てられた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
Fedoraにsmem
をインストールするには、次のように入力する必要があります。
sudo dnf install smem
Manjaroにsmem
をインストールするには、次を使用します。
sudo pacman -Sy smem
オプションなしでsmem
を使用すると、RAMを使用しているプロセスのリストが表示されます。
smem
ターミナルウィンドウに情報の表が表示されます。
列は次のとおりです。
- PID :メモリを使用しているプロセスのプロセスID。
- ユーザー:プロセスを所有するユーザーのユーザー名。
- コマンド:プロセスを起動したコマンドライン。
- スワップ:プロセスが使用しているスワップスペースの量。
- USS :ユニークなセットサイズ。
- PSS :プロポーショナルセットサイズ。
- RSS :レジデントセットサイズ。
サイズをパーセンテージで表示するには、 -p
(パーセンテージ)オプションを使用します。
smem -p
バイト単位のサイズはパーセンテージに置き換えられました。
より人間にわかりやすい形式でレンダリングされた図を表示するには、 -k
(省略形)オプションを使用します。 これにより、数値が縮小され、ユニットインジケータが追加されます。
smem -k
生のバイトの代わりに、サイズはメガバイト、ギガバイトなどで表示されます。
合計行を追加するには、 -t
(合計)オプションを使用します。
smem -k -t
出力の最後の行には、各列の合計が表示されます。
レポートの精緻化
ユーザー、マッピング(ライブラリ)、またはシステム全体のメモリ使用量についてレポートするようにsmem
に依頼できます。 ユーザーで出力をフィルタリングするには、 -u
(ユーザー)オプションを使用します。 自分の使用法以上のものを確認したい場合は、 sudo
を使用してsmem
を実行する必要があることに注意してください。
smem -u
sudo smem -u
ご覧のとおり、8文字を超えるユーザー名の場合、出力の形が崩れます。
ライブラリを使用しているプロセスやそれらのプロセスを所有しているユーザーに関係なく、使用中のライブラリにマップされた使用状況を確認するには、 -m
(マッピング)オプションを使用します。
smem -m -k -t
また、人間が読める値と合計も求めました。
システム全体のメモリ使用量を確認するには、 -w
(システム全体)オプションを使用します。
smem -w -k -t
単一のプログラムに関するレポート
少しのコマンドラインの魔法で、単一のプログラムとそのすべてのサブプロセスについてレポートできます。 smem
からの出力をtail
にパイプし、 tail
に最後の行のみを表示するように依頼します。 smem
に、人間が読める値を使用して合計を提供するように指示します。 合計が最後の行になり、それが行のtail
に表示されます。
smem
で-c
(列)オプションを使用して、出力に含める列を指定します。 これを[プロポーショナルセットサイズ]列に制限します。 -P
(プロセスフィルター)オプションを使用すると、 smem
に検索文字列を指定できます。 一致する出力行のみが含まれます。
smem -c pss -P firefox -k -t | テール-n1
これは、プログラムとその子プロセスのRAM消費量をすばやく簡単に調べる方法です。
グラフの生成
--pie
または--bar
オプションを渡して、 smem
にグラフを生成させることができます。 カテゴリが多すぎると、グラフがすぐに理解できなくなりますが、視覚的な概要をすばやく確認するのに役立ちます。
コマンド形式は次のとおりです。
smem --pie name -s uss
円グラフは、独自のビューアウィンドウに表示されます。
他のプロットを表示するには、 uss
の代わりにpss
またはrss
を使用します。 棒グラフを表示するには、 --bar
の代わりに--pie
を使用します。
これを機能させるには、 matplotlib
ライブラリとともにPythonをインストールする必要があります。 これらは、テストしたUbuntu、Fedora、およびManjaroディストリビューションにすでにインストールされています。
良いものは小さなパッケージで提供されます
smem
ユーティリティには、さらにいくつかのトリックがありますman
ページを確認することをお勧めします。 その主なレパートリーは、ここで概説したものであり、CLIツールボックスにある素晴らしい小さなツールです。
関連:知っておくべき37の重要なLinuxコマンド