【Linux】メモリ使用量とスワップ管理について

この記事では、Linux のメモリ管理の概要と、free コマンドでメモリ使用量を監視する方法を確認します。あわせて、スワップファイルを作成して有効にする手順と、スワップの使用量の見かたも確認します。

この記事でわかること
  1. free コマンドの各列の意味と、メモリが足りているかを available で判断する方法
  2. free -m と /proc/swaps で、スワップの状態を確認する方法
  3. スワップファイルを追加して、再起動後も有効にする手順
検証環境

ホスト名は ubuntu-1、ユーザー名は hirotano で、OS は Ubuntu です。搭載メモリは約 2GB(free -m の total が 1974)です。以降の実行結果は、この環境のものです。

画面イメージについて

この記事の画面は、実際の画面ではなく、実行時の画面から見るポイントを抜き出して描いたイメージです。長い出力は途中を省略しています。

メモリ管理の基本

Linux は、物理メモリを、プログラムが使うメモリと、ファイルシステムのキャッシュに使います。プログラムが読み書きしたファイルのデータは、再び読み込むときにストレージへアクセスせずに済むよう、メモリ上にキャッシュ(ページキャッシュ)として残されます。このキャッシュは、メモリが足りなくなると回収して、プログラムのために使えます。

物理メモリに収まらないデータは、ストレージ上のスワップ領域に退避できます。スワップがあると、メモリが不足したときにも、システムが動き続けやすくなります。

メモリ使用量の監視

サーバが使っているメモリの量は、free コマンドで確認します。オプションなしで実行すると、キビバイト(KiB)単位で表示されます。

$ free
ターミナル画面イメージ
1hirotano@ubuntu-1:~$ free             total        used        free      shared  buff/cache   available2Mem:       2021764      214964     1088120        1128      718680     1609032Swap:      2097148           0     2097148
図1 free の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1freeオプションなしで実行したコマンド。単位は KiB
2Mem: の行物理メモリの状態。total は 2021764 KiB(約 1974 MiB)

-m オプションを付けると、メビバイト(MiB)単位で表示されます。KiB より読みやすくなります。

$ free -m
ターミナル画面イメージ
1hirotano@ubuntu-1:~$ free -m             total        used        free      shared  buff/cache   available2Mem:          1974         210        1062           1         701        1571Swap:         2047           0        2047
図2 free -m の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1free -mMiB 単位で表示するコマンド
2Mem: の行total 1974、used 210、free 1062、buff/cache 701、available 1571

各列の意味

表示意味
totalシステムで使えるメモリの総量
used使用中のメモリ。この記事の出力では、total − free − buff/cache(1974 − 1062 − 701)にほぼ一致する。新しいバージョンの procps では、total − available で計算される
free全く使われていないメモリ
shared主に tmpfs(temporary file system)が使うメモリ
buff/cacheバッファとキャッシュの合計。ディスクのデータをキャッシュするために使われているメモリ
availableスワップせずに、新しいプログラムの起動に使えるメモリの見積もり
total(搭載メモリの総量)usedfreebuff/cache2101062701(単位は MiB)available(新しいプログラムに使えるメモリの見積もり)free に加えて、必要なときにカーネルが回収できるキャッシュなどを含む
図3 free -m の各列の関係(used 210、free 1062、buff/cache 701。単位は MiB)

空きメモリは available で見る

図2の free の列は 1062(MiB)で、メモリが 1062MiB だけ空いているように見えます。実際にプログラムが使えるメモリの目安は、available の列の 1571MiB です。

available には、free に加えて、カーネルが必要なときに回収できるキャッシュなどが含まれます。プログラムがメモリを必要とすると、カーネルはキャッシュを解放して、そのメモリを使わせます。

Linux は、使っていないメモリをファイルシステムのキャッシュに使います。ストレージから毎回読み込むより、メモリ上のデータを使うほうが速いため、処理速度が上がります。キャッシュは、読み込んだデータだけでなく、ストレージに書き込む前のデータも一時的に保持します。

このように、free の出力を見ると、システムがメモリ不足になっていないかを確認できます。判断には、free の列ではなく、available の列を使います。

スワップの管理

スワップは、物理メモリに収まらないデータを一時的に退避するために、OS が使うストレージ上の領域です。スワップがあると、メモリが不足したときにも、システムが動き続けやすくなります。

現在のスワップを確認する

この環境には、もともと約 2GB のスワップファイルが作成されています。free -m で確認します。

$ free -m
ターミナル画面イメージ
1hirotano@ubuntu-1:~$ free -m             total        used        free      shared  buff/cache   availableMem:          1974         210        1062           1         701        1571Swap:         2047           0        2047
図4 スワップの状態(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1free -mMiB 単位で表示するコマンド
Swap: の行total が 2047、used が 0、free が 2047。スワップはまだ使われていない

現在のスワップファイルは、/proc/swaps でも確認できます。/swap.img という約 2GB のスワップファイルが見つかります。

$ cat /proc/swaps
ターミナル画面イメージ
1hirotano@ubuntu-1:/$ cat /proc/swapsFilename      Type          Size    Used  Priority/swap.img     file       2097148     268        -2
図5 /proc/swaps の表示(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1cat /proc/swaps現在有効なスワップの一覧を表示するコマンド
/swap.imgtype は file、size は 2097148(KiB)、used は 268(KiB)、priority は -2
補足:free と /proc/swaps の単位

free -m は MiB、/proc/swaps の Size と Used は KiB で表示されます。/swap.img の Used は 268KiB なので、free -m では 0 と表示されています。

スワップファイルを追加する

スワップを広げるために、4GiB のスワップファイルを追加します。手順は次の5つです。

STEP 1dd領域を確保STEP 2chmod権限を 0600 にSTEP 3mkswapスワップ領域にするSTEP 4fstab再起動後も有効にSTEP 5swapon有効にする/swapfile を新しいスワップ領域として追加する流れ
図6 スワップファイルを追加する手順

ファイルを作る前に、df などで、ファイルを作るファイルシステムに空き容量があることを確認しておきます。

dd でファイルを作成する

dd コマンドで、必要なサイズのファイルを作成します。次のコマンドは、4GiB のファイル /swapfile を作ります。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
ターミナル画面イメージ
1hirotano@ubuntu-1:/$ sudo dd if=/dev/zero of=/swapfile bs=1M count=40964096+0 records in4096+0 records out24294967296 bytes (4.3 GB, 4.0 GiB) copied, 9.03534 s, 475 MB/s
図7 dd の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1sudo dd if=/dev/zero of=/swapfile bs=1M count=40964GiB のファイルを作成するコマンド
24294967296 bytes (4.3 GB, 4.0 GiB) copiedコピーされたサイズ。4096 × 1MiB = 4294967296 バイトで、count の指定と一致する

指定したパラメータの意味は次のとおりです。

パラメータ意味
ddファイルをコピーするコマンド。ブロックサイズを指定したり、変換したりできる
if=/dev/zero入力ファイル。/dev/zero は、ゼロ(0)のバイトを無限に生成する特殊なファイル
of=/swapfile出力ファイル。/swapfile に書き込む。このファイルを、物理メモリが不足したときに使うスワップ用にする
bs=1M読み書きするブロックのサイズ。M は 1048576 バイト(1MiB)
count=4096コピーするブロックの数。1MiB × 4096 で、4GiB のファイルになる。この値でスワップファイルのサイズが決まる

ファイルの権限を設定する

作成したファイルに、所有者だけが読み取りと書き込みをできる権限を設定します。権限の指定方法は、chmod の記事を参照してください。

$ sudo chmod 0600 /swapfile

mkswap でスワップ領域にする

mkswap コマンドで、このファイルをスワップ領域として設定します。

$ sudo mkswap /swapfile
ターミナル画面イメージ
1hirotano@ubuntu-1:/$ sudo mkswap /swapfile2Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)no label, UUID=(伏せています)
図8 mkswap の実行結果(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1sudo mkswap /swapfileファイルをスワップ領域として設定するコマンド
2size = 4 GiB (4294963200 bytes)スワップ領域のサイズ。ファイルの 4294967296 バイトより 4096 バイト少ない

/etc/fstab に追記する

OS を再起動したあとも、スワップが有効になるように、/etc/fstab に次のエントリーを追加します。

/etc/fstab

/swapfile  none  swap  sw  0 0
/etc/fstab画面イメージ
⋮(中略)/swap.img         none    swap    sw      0       01/swapfile         none    swap    sw      0       0
図9 /etc/fstab に追加した行(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1/swapfile none swap sw 0 0追加した行。上の /swap.img が、もともとあるスワップファイルの行

各項目の意味は次のとおりです。

項目値意味
1列目/swapfileスワップとして使うファイル
2列目noneマウントポイント。スワップでは none を指定する
3列目swapファイルシステムの種類。スワップでは swap を指定する
4列目swオプション
5列目0dump の対象にするかどうか。0 は対象にしない
6列目0起動時の fsck の順番。0 はチェックしない

swapon でスワップを有効にする

最後に、swapon コマンドでスワップを有効にします。-a オプションを付けると、/etc/fstab に swap として書かれているデバイスのうち、noauto が付いていないものが有効になります。すでに有効なものは、そのままです。

$ sudo swapon -a

スワップの拡張を確認する

free -m を確認すると、スワップの total が 6143(MiB)になり、約 6GiB に拡張されています。もともとの 2047 に、追加した 4096 を足した値です。

$ free -m
ターミナル画面イメージ
1hirotano@ubuntu-1:/$ free -m             total        used        free      shared  buff/cache   availableMem:          1974         210          78           1        1685        15712Swap:         6143           0        6143
図10 スワップ拡張後の free -m(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1free -mMiB 単位で表示するコマンド
2Swap: の行total が 6143、free が 6143。スワップが約 6GiB に拡張された
補足:dd のあとで free が減っている理由

図2では 1062 だった free が、図10では 78 に減り、buff/cache が 701 から 1685 に増えています。dd が書き込んだデータが、キャッシュとしてメモリに残ったためです。available は 1571 のままなので、プログラムが使えるメモリの目安は変わっていません。

/proc/swaps でも、/swapfile がスワップとして追加されたことを確認できます。

$ cat /proc/swaps
ターミナル画面イメージ
1hirotano@ubuntu-1:/$ cat /proc/swapsFilename      Type          Size    Used  Priority/swap.img     file       2097148     268        -22/swapfile     file       4194300       0        -3
図11 スワップ追加後の /proc/swaps(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1cat /proc/swaps有効なスワップの一覧を表示するコマンド
2/swapfile追加したスワップファイル。size は 4194300(KiB)、used は 0、priority は -3

priority は、複数のスワップがあるときの使われる順番を決める値で、大きいほど優先されます。優先度を指定しないと、カーネルが負の値を割り当てます。この例では、/swap.img が -2、追加した /swapfile が -3 なので、/swap.img が先に使われます。

スワップファイルを有効にすると、メモリが不足したときに、システムがスワップを使い始めます。パフォーマンスが落ちたときは、free コマンドで Swap の used を見て、スワップが使われすぎていないかを確認します。

まとめ

メモリの空きは、free の列ではなく、available の列で判断します。スワップは、free -m と /proc/swaps で確認できます。スワップファイルの追加は、dd、chmod、mkswap、/etc/fstab への追記、swapon の順に行います。

コマンド・ファイル用途
freeメモリとスワップの使用量を、KiB 単位で表示する
free -mメモリとスワップの使用量を、MiB 単位で表示する
cat /proc/swaps有効なスワップの一覧を表示する
ddスワップ用のファイルを作成する
chmod 0600所有者だけが読み書きできる権限にする
mkswapファイルをスワップ領域として設定する
/etc/fstab再起動後も、スワップが有効になるように設定する
swapon -a/etc/fstab のスワップを有効にする

コメント