Linuxのプロセスによるスワップメモリ使用量の検索
1. 概要
このチュートリアルでは、スワップメモリを使用するプロセスを確認する方法について説明します。 まず、 / proc ディレクトリについて説明し、そこに含まれる内容と、そこからプロセスの情報を抽出する方法を確認します。 その後、プロセスで使用されるスワップ使用状況情報を自動的に抽出するシェルスクリプトを記述します。
最後に、スワップメモリを使用するプロセスをチェックするための代替手段としてsmemツールを使用します。
2. /procディレクトリ
Linuxでは、procは、Linuxカーネル、その構成、および物理メモリにロードされたプロセスに関する情報を含む特別なディレクトリです。 Linuxマシンを起動すると、オペレーティングシステムがこのディレクトリを作成します。 さらに、このディレクトリ内の仮想ファイルには、ディスク上の物理サイズがありません。 これらのファイル内の情報は、それらを読み取るとその場で生成されます。
proc ディレクトリについてのアイデアが得られたので、その中身を見てみましょう。
$ ls -l /proc
total 0
dr-xr-xr-x 9 root root 0 Feb 17 15:35 1
dr-xr-xr-x 9 root root 0 Feb 17 15:35 10
dr-xr-xr-x 9 root root 0 Feb 17 15:35 100
...
dr-xr-xr-x 9 hey hey 0 Feb 17 22:12 34160
...
このディレクトリ内のアイテムのリストを確認すると、番号付きのディレクトリ、名前付きディレクトリ、およびその他の仮想ファイルが多数あることがわかります。 ただし、実行中の各プロセスに対応しているため、番号付きのディレクトリのみに関心があります。 ディレクトリの番号は、実際にはプロセスのPIDです。
上記のスニペットでわかるように、ユーザープロセスも一覧表示されます。 それでは、「34160」ディレクトリ内のアイテムをリストして、何が含まれているかを確認しましょう。
$ ls -l /proc/34160
total 0
...
-r--r--r-- 1 hey hey 0 Feb 17 22:12 stat
-r--r--r-- 1 hey hey 0 Feb 17 22:12 statm
-r--r--r-- 1 hey hey 0 Feb 17 22:12 status
...
ディレクトリ内の仮想ファイルには、プロセスに関する大量の情報が含まれます。 ただし、この例では、 status 仮想ファイルに関心があります。これには、メモリ使用量の情報が含まれているためです。
スワップの使用法のみに関心があるため、ファイルからVmSwapフィールドをgrepします:
$ cat /proc/34160/status | grep VmSwap
VmSwap: 0 kB
プロセスで使用されているスワップメモリを確認する方法がわかったので、シェルスクリプトを記述して、スワップメモリを使用しているプロセスのリストを出力できます。
2.1. スワップメモリを使用してプロセスを一覧表示するシェルスクリプト
シェルスクリプトは、 proc ディレクトリ内の番号が付けられた各ディレクトリを調べ、statusファイルから抽出したスワップ使用量を出力します。 プロセスの名前とPIDも出力されます。
#!/bin/bash
overall=0
for status_file in /proc/[0-9]*/status; do
swap_mem=$(grep VmSwap "$status_file" | awk '{ print $2 }')
if [ "$swap_mem" ] && [ "$swap_mem" -gt 0 ]; then
pid=$(grep Tgid "$status_file" | awk '{ print $2 }')
name=$(grep Name "$status_file" | awk '{ print $2 }')
printf "%s\t%s\t%s KB\n" "$pid" "$name" "$swap_mem"
fi
overall=$((overall+swap_mem))
done
printf "Total Swapped Memory: %14u KB\n" $overall
スクリプトはかなり自明です。 ターミナルで実行してみましょう:
$ ./swp.sh
1658 Discord 41448 KB
1681 Xwayland 15772 KB
18621 firefox 213204 KB
18872 WebExtensions 60912 KB
...
Total Swapped Memory: 1177212 KB
column ツールなどを使用すると、出力をさらに簡単にカスタマイズできます。
3. smemユーティリティの使用
smem ツールは、プロセスのメモリ使用量を表示します。 RSS、PSS、およびUSSメモリを表示するほかに、スワップメモリも表示できます。
デフォルトでは、ほとんどのLinuxディストリビューションには付属していません。 そのため、ディストリビューションの公式リポジトリからインストールする必要があります。
3.1. インストール
smem ユーティリティは、smemパッケージ名で利用できるようになります。 yumやaptなどのパッケージマネージャーを使用してインストールできます。
Debianとその派生物の場合:
# apt install smem
Fedora、OpenSUSE、およびRHELの場合:
# yum install smem
3.2. 使用法
smem がインストールされたら、ターミナルで試すことができます。
$ smem
PID User Command Swap USS PSS RSS
494 hey swaybg -o DVI-I-1 -i /home/ 15136 4 86 2304
1665 hey /opt/discord/Discord --type 8800 0 96 820
589 hey /usr/lib/pulse/gsettings-he 1224 20 122 2372
37348 hey /bin/sh /usr/bin/android-st 204 164 180 1220
...
$ smem -s swap -r | head -n10
PID User Command Swap USS PSS RSS
18943 hey /usr/lib/firefox/firefox -c 385536 161836 165339 213496
18621 hey /usr/lib/firefox/firefox 225660 458788 479474 576556
1748 hey /opt/discord/Discord --type 84652 130220 137640 153064
1658 hey /opt/discord/Discord 76108 28336 34916 51324
18872 hey /usr/lib/firefox/firefox -c 65172 133824 135810 169480
33599 hey /usr/lib/firefox/firefox -c 55012 261264 266269 324880
20578 hey megasync 52252 13272 15308 24040
35605 hey /usr/lib/firefox/firefox -c 46584 504264 507708 554040
1705 hey /opt/discord/Discord --type 41236 13876 18735 29988
-r オプションは出力を逆にし、リストを降順で印刷します。
4. 結論
この簡単なチュートリアルでは、Linuxのプロセスで使用されるスワップメモリを表示する方法を説明しました。 これは、 proc ディレクトリ内のプロセスの情報を表示し、smemツールを使用して実現しました。