Smemを使ってLinuxのRAM使用状況を簡単に理解する
Linuxのメモリ使用状況は解釈が難しく、理解するのが難しいことがあります。smemを使えば、プロセスが使用しているメモリや、どのプロセスが最も多くのメモリを使用しているかを簡単に調べることができます。
メモリ使用量
Linuxは、コンピュータのRAMで何が起こっているかを確認するための多くの方法を提供します。しかし、メモリ管理はオペレーティングシステムにとって複雑な課題です。それは物理的なRAM、スワップスペースの形の仮想RAM、そして同時に実行されているさまざまなタイプのプロセスの要求を調整しなければなりません。
プロセスは、自身をメモリに読み込む際にRAMを消費します。そして、目的の作業を実行するために必要な空間を確保するために、さらにRAMを要求します。一部のプロセスはRAMにほとんど影響を与えませんが、他のプロセスは非常にメモリを消費します。
カーネルとオペレーティングシステムの残り、デスクトップ環境、そしてあなたが実行するすべてのアプリケーションやコマンドラインセッションは、すべてあなたのコンピューターにインストールされている限られた量のRAMの一部を求めています。いくつかのプロセスは他のプロセスを生成します。いくつかのプロセスは他のプロセスとRAMを共有します。
これをすべて解読し、「このプログラムまたはプロセスはどれだけのRAMを使用していますか?」という質問に対する簡単な答えを見つけるのは、驚くべき挑戦となることがあります。細かさは素晴らしく、重要な役割がありますが、同時に情報が過剰になることは障害になることもあります。
たとえば、使用すること
catこの論文の研究に使ったマシンで、/proc/meminfo 擬似ファイルシステムを覗いてみると、50行の出力が得られました。どこから始めればよいですか?
cat /proc/meminfoそして、一部のLinuxユーティリティは異なる回答を示します。私たちのテストマシンでは、プロセスIDが2183のlessのインスタンスが動いていました。
私は、プロセスのメモリ使用量の全体像を把握するために、pmapユーティリティを-x(拡張)オプションと共に使用できます。私たちは、lessのインスタンスのプロセスIDと共にこれを使用します:
pmap -x 2183出力の下部には、使用されている主なRAMの量であるレジデントセットサイズの合計が表示されます。
その後、psユーティリティを使用し、-o(出力)オプションを指定し、RSS列を選択し、同じインスタンスのlessのプロセスIDを渡しました:
ps -o rss 2183
私たちは異なる結果を得ます。これはpsの作者による設計上の決定です。これはpsmanページからのものです:
SIZEおよびRSSフィールドは、ページテーブル、カーネルスタック、struct thread_info、struct task_structを含むプロセスの一部をカウントしません。これは通常、常に常駐しているメモリの少なくとも20 KiBです。SIZEはプロセスの仮想サイズ(コード+データ+スタック)です。
他のユーティリティの著者たちは、RAM使用量を測定する方法についてそれぞれの見解を持っています。
RSS、USS、PSS
レジデントセットサイズ(RSS)とは、プロセスに割り当てられたRAMの量を指し、スワップスペースは除外されますが、プロセスが使用している共有ライブラリに必要なRAMは含まれます。
RSSはほぼ常にRAM使用量を過大報告します。二つ以上のプロセスが一つ以上の共有ライブラリを使用している場合、RSSは各ライブラリのRAM使用量をそのプロセスのRAM使用量に加算します。非精度だけでなく、これにはある種の皮肉もあります。共有ライブラリを使用することで、各プロセスは自分専用のライブラリインスタンスをロードする必要がありません。ライブラリがすでにメモリに存在する場合、それを共有し、RAMのオーバーヘッドを減らします。
比例セットサイズは、これに対処するために、共有メモリを共有しているプロセス間で分割します。メモリを共有しているプロセスが4つある場合、PSSはそれぞれのプロセスが共有RAMの25%を使用していると報告します。これは近似値ですが、RSSが描く図よりも実際の状況により近いものです。
ユニークセットサイズとは、プロセスによって専用に使用されているRAMの量であり、それがプロセスによって直接消費されているか、またはそのプロセス専用のライブラリによって使用されているかです。再度言うと、スワップスペースは無視されます。本当に物理的なRAMのみに関心があります。
USSとPSSは、smemの著者であるマット・マッカルが提案した用語と概念です。
smemユーティリティ
smemユーティリティは、プロセス、ユーザー、マッピング、またはシステム全体のメモリ使用状況を報告します。私たちがテストしたすべてのディストリビューションでは、インストールが必要でした。Ubuntuにインストールするには、次のコマンドを使用します:
sudo apt install smem
Fedoraにsmemをインストールするには、以下のように入力する必要があります:
sudo dnf install smemManjaroにsmemをインストールするには、以下のコマンドを使用します:
sudo pacman -Sy smemsmemをオプションなしで使用すると、RAMを使用しているプロセスのリストが表示されます。
smem端末ウィンドウに情報のテーブルが表示されています。
列は次のとおりです:
- PID: メモリを使用しているプロセスのプロセスID。
- プロセスを所有しているユーザーのユーザー名です。
- コマンド: プロセスを起動したコマンドライン。
- スワップ: プロセスが使用しているスワップ領域の量。
- USS: ユニークセットサイズ。
- PSS: 比例的セットサイズ。
- RSS: レジデントセットサイズ。
サイズをパーセンテージで表示するには、-p(パーセンテージ)オプションを使用してください。
smem -pサイズはバイトからパーセンテージに置き換えられました。
数字をより人間に優しい形で表示するには、-k(短縮)オプションを使用してください。これにより数字が縮小され、単位指標が追加されます。
smem -k生のバイトの代わりに、サイズはメガバイト、ギガバイトなどで表示されます。
合計行を追加するには、-t(合計)オプションを使用します。
smem -k -t出力の最終行は各列の合計を示しています。
レポートの精緻化
ユーザー、マッピング(ライブラリ)、またはシステム全体のメモリ使用量を報告するには、smem を使用できます。出力をユーザーでフィルタリングするには、-u(ユーザー)オプションを使用してください。自分の使用量だけでなく、他のユーザーの使用量も見る必要がある場合は、sudo を使って smem を実行する必要があります。
smem -usudo smem -uご覧のとおり、ユーザー名が8文字を超えると出力が歪んでしまいます。
使用されているライブラリにマッピングされた使用状況を確認するには、どのプロセスがライブラリを使用しているか、またはどのユーザーがそれらのプロセスを所有しているかに関係なく、-m(マッピング)オプションを使用してください。
smem -m -k -t人間が読み取れる値と合計も求めました。
システム全体のメモリ使用量を確認するには、-w(システム全体)オプションを使用します。
smem -w -k -t単一プログラムの報告
少しのコマンドラインの魔法を使えば、特定のプログラムとそのすべてのサブプロセスについて報告できます。smemの出力をtailに渡し、tailに最後の行だけを表示するように頼みます。smemには人間が読みやすい値を使用し、合計を提供するように伝えます。合計は最後の行になり、その行をtailが私たちに表示します。
私たちは、-c (列)オプションをsmemで使用し、出力に含めたい列を指定します。これを比例セットサイズ列に制限します。-P (プロセスフィルター)オプションを使用すると、smemに検索文字列を指定できます。出力の一致する行のみが含まれます。
smem -c pss -P firefox -k -t | tail -n 1プログラムとその子プロセスのRAM消費を知るための、迅速で簡潔な方法です。
グラフを生成する
「--pie」または「--bar」オプションを指定することで、smemがグラフを生成します。ただし、あまりにも多くのカテゴリになると、グラフはすぐに理解できなくなりますが、迅速な視覚的概要には役立つことがあります。
コマンドの形式は次のとおりです:
smem --pie name -s uss円グラフは独自のビューアウィンドウに表示されます。
他のプロットを見るには、ussの代わりにpssまたはrssを使用してください。棒グラフを見るには、--pieの代わりに--barを使用してください。
これが動作するためには、Pythonがインストールされている必要があり、さらにmatplotlibライブラリも必要です。これらは私たちがテストしたUbuntu、Fedora、そしてManjaroのディストリビューションには既にインストールされていました。
良いものは小さなパッケージに入っている
smem ユーティリティには、いくつかのトリックがあり、その man ページをチェックすることをお勧めします。ここで説明したのが主な機能であり、CLI ツールボックスに持っておくと便利なツールです。









