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 
...

スワップメモリ使用量の降順でソートされた上位10プロセスを出力するとします。 -sまたは–sortオプションを使用してこれを行うことができます

$ 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ツールを使用して実現しました。