本記事では、Azure上のLinux Virtual Machines(以下、Linux VM)におけるSwapの設定方法について解説します。
Swapとは
Swapとは、OSが物理メモリ(RAM)以上のメモリを必要とした時に、ディスクの一部を仮想メモリとして使用する技術です。これにより、アプリケーションは使用中のメモリが物理メモリの容量を超えても動作を続けることができます。
しかし、ディスクアクセスはRAMアクセスに比べて遅いため、パフォーマンスのバランスを考慮してSwap領域のサイズを設定する必要があります。
Azure Linux VMにおけるSwap
Azure上のLinux VMにおいては、OSやアプリケーションのパフォーマンスへの影響から、OSディスクやデータディスクにSwapを設定することが推奨されておらず、VMに既定で接続される一時ディスクに設定することが推奨となります。
そのため、Linux VMのサイズを選定する際は、Swapを構成するかどうかの確認することも重要です。
※一時ディスクのないVMサイズから、一時ディスクを持つVMサイズへの変更はできない点も留意が必要となります。
Azure Linux VMにおけるSwap設定方法
Azure Linux VMにおいて、一時ディスクにSwapを設定する方法は以下の2パターンとなります。
1. cloud-initによる構成
2. Azure Linux エージェントによる構成
現状、上記のどちらの方法でもSwapの構成は可能ですが、現在はcloud-initによる構成が主流になっているようです。
オンプレミスでcloud-initが導入されていないLinuxサーバーをAzureに移行した場合など、Azure上でcloud-initを使用できない場合を除き、cloud-initを使用する方が無難かと思います。
また、注意点として、cloud-initとAzure Linux エージェントの双方でSwap構成が有効の場合、競合が発生することでSwapが適切に構成されないことがあるため、留意が必要です。
Swap構成手順
実際にSwapを構成していきます。
今回は以下のようなLinux VMを利用しています。
- OS:Red Hat Interprise Linux 7.8
- インスタンスサイズ:Standard B2s (2 vcpu 数、4 GiB メモリ)
- 一時ディスクサイズ:8 GB
Tera Termを使用して、VMに接続しています。また管理者権限が必要のため、rootに昇格して実施しています。
cloud-initによる構成
Microsoftの公開情報では、cloud-initを使ったSwapの構成方法として3つのオプションが紹介されています。
今回は上記リンク先記載の「オプション 2: cloud-init を使用してリソース ディスク パスの下に SWAP パーティションを作成する」の手順を解説します。
前述の通り、Azure Linux エージェントでもSwap構成が有効化されている場合は、事前に無効化する必要があるため、Azure Linux エージェントの設定ファイルが以下の通りのパラメーターとなっていることを確認します。
# Format if unformatted. If 'n', resource disk will not be mounted.
ResourceDisk.Format=n
# Create and use SWAPfile on resource disk.
ResourceDisk.EnableSWAP=n
#Mount point for the resource disk
ResourceDisk.MountPoint=/mnt
#Size of the SWAPfile.
ResourceDisk.SWAPSizeMB=0
1. システム環境変数を設定し、cloud-initが設定を読み込む際に、Swap構成が含まれる特定のファイルを参照するようにします。
echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
2. cloud-initによるSwap構成を定義する設定ファイルを作成します。
cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
#cloud-config
disk_setup:
ephemeral0:
table_type: mbr
layout: [66, [33, 82]]
overwrite: True
fs_setup:
- device: ephemeral0.1
filesystem: ext4
- device: ephemeral0.2
filesystem: swap
mounts:
- ["ephemeral0.1", "/mnt"]
- ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
EOF
※disk_setupセクションのlayoutフィールドでSwapサイズを決定しており、上記では一時ディスクの33%をSwapに設定しています。例えば、layout: [50, [50, 82]]とすることで、一時ディスクの50%をSwapと指定することも可能です。
3. 一度VMを割り当て解除する必要があるため、VMを停止して起動するか、再デプロイして一時ディスクにSwapを作成します。
4. 再度VMに接続し、Swapが構成されていることを確認します。
free -m
一時ディスク(/dev/sdb)にSwapが構成されていることが分かります。
lsblk
cloud-initによる構成は以上となります。
Azure Linux エージェントによる構成
次にAzure Linux エージェントでSwapを構成する手順を解説します。
本手順は、オンプレミス環境でcloud-initが導入されていないLinuxサーバーをAzureに移行した場合などで利用を想定しています。cloud-initが利用可能なLinux VMでこの設定を行う場合、意図しない動作を引き起こす可能性がありますのでご注意ください。
1. Azure Linux エージェントの設定ファイルを編集します。
vi /etc/waagent.conf
2. 以下のパラメータとなるように編集します。
# Format if unformatted. If 'n', resource disk will not be mounted.
ResourceDisk.Format=y
# Create and use SWAPfile on resource disk.
ResourceDisk.EnableSWAP=y
#Size of the SWAPfile.
ResourceDisk.SWAPSizeMB=<任意のサイズ>
3. VMを再起動し、指定した"ResourceDisk.SWAPSizeMB"で指定したサイズでSwapが構成されていることを確認します。
おわりに
この記事では、Azure Linux VMにおけるSwap領域の設定方法について解説しました。
cloud-initを用いてSwapを設定する手順について、公式ドキュメントを除くと情報が少ないため、Linux VMのOSの初期設定時などに本記事が参考になればと思います。