この記事では、Linux のメモリ管理の概要と、free コマンドでメモリ使用量を監視する方法を確認します。あわせて、スワップファイルを作成して有効にする手順と、スワップの使用量の見かたも確認します。
freeコマンドの各列の意味と、メモリが足りているかをavailableで判断する方法free -mと/proc/swapsで、スワップの状態を確認する方法- スワップファイルを追加して、再起動後も有効にする手順
ホスト名は 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | free | オプションなしで実行したコマンド。単位は KiB |
| 2 | Mem: の行 | 物理メモリの状態。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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | free -m | MiB 単位で表示するコマンド |
| 2 | Mem: の行 | 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 | スワップせずに、新しいプログラムの起動に使えるメモリの見積もり |
空きメモリは 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | free -m | MiB 単位で表示するコマンド |
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | cat /proc/swaps | 現在有効なスワップの一覧を表示するコマンド |
/swap.img | type は file、size は 2097148(KiB)、used は 268(KiB)、priority は -2 |
free -m は MiB、/proc/swaps の Size と Used は KiB で表示されます。/swap.img の Used は 268KiB なので、free -m では 0 と表示されています。
スワップファイルを追加する
スワップを広げるために、4GiB のスワップファイルを追加します。手順は次の5つです。
ファイルを作る前に、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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 | 4GiB のファイルを作成するコマンド |
| 2 | 4294967296 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=(伏せています)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | sudo mkswap /swapfile | ファイルをスワップ領域として設定するコマンド |
| 2 | size = 4 GiB (4294963200 bytes) | スワップ領域のサイズ。ファイルの 4294967296 バイトより 4096 バイト少ない |
/etc/fstab に追記する
OS を再起動したあとも、スワップが有効になるように、/etc/fstab に次のエントリーを追加します。
/etc/fstab
/swapfile none swap sw 0 0
⋮(中略)/swap.img none swap sw 0 01/swapfile none swap sw 0 0
| No. | 表示 | 意味 |
|---|---|---|
| 1 | /swapfile none swap sw 0 0 | 追加した行。上の /swap.img が、もともとあるスワップファイルの行 |
各項目の意味は次のとおりです。
| 項目 | 値 | 意味 |
|---|---|---|
| 1列目 | /swapfile | スワップとして使うファイル |
| 2列目 | none | マウントポイント。スワップでは none を指定する |
| 3列目 | swap | ファイルシステムの種類。スワップでは swap を指定する |
| 4列目 | sw | オプション |
| 5列目 | 0 | dump の対象にするかどうか。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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | free -m | MiB 単位で表示するコマンド |
| 2 | Swap: の行 | total が 6143、free が 6143。スワップが約 6GiB に拡張された |
図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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | cat /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 のスワップを有効にする |
コメント