インスタンスストアをLinuxのSwap領域として使う!
【前編】
背景
とあるデータ分析サーバで、一時的に物理メモリおよびSwap領域全てを利用しメモリ不足に陥っていました。
物理メモリ不足を解消したいが、処理速度向上を大きく求めておらず物理メモリもこれ以上増やしたくない。
そこで、Amazon EC2で提供されるインスタンスストアをSwap領域として利用し、この問題を解決することにしました。
目的
- LinuxのSwap領域をインスタンスストアで作成
- サーバ起動および再起動時、Swap領域の作成およびディスクマウントの自動化
機能説明
Swap領域とは
物理メモリ不足の際、ハードディスク(ストレージ)へ一時的にデータ退避させるための仮想メモリ領域です。
ただし、ハードディスク(ストレージ)はメモリよりもアクセス速度が遅いため、Swap領域利用時はシステム全体のパフォーマンスが低下する可能性があります。
例えば「free」コマンドで、物理メモリ及びSwap領域の利用状況を確認することができます。
※以下は出力例
total used free shared buff/cache available Mem: 129663920 5363988 122391756 10712 1908176 123219788 ←物理メモリ Swap: 927734368 0 927734368 ←Swap領域
- 簡易説明
- total:総メモリ量 used:使用中メモリ量 free:未使用メモリ量 shared:共有使用メモリ量
- buff/cache:buff/cache利用メモリ量 available:アプリ利用可能なメモリ量(free+buff/cache)
- Swap:「used」が0以上ならSwap領域を使っていることになります。
インスタンスストアとは
「r6id.4xlarge」のような「d(オプション:高密度ストレージ)」が付く Amazon EC2インスタンスタイプ で
提供される揮発性の一時ブロックストレージです。
特徴として以下があります。
- EBSよりも高いIOPS、スループット、低レイテンシーが提供され、頻繁に変更されるデータ(キャッシュやバッファ等)を扱うのに適したストレージ
- 揮発性の一時ブロックストレージのためEC2停止⇒EC2起動時はデータが失われる
※EC2再起動の場合、データは保持される
設定してみよう!
構成情報
- EC2インスタンスタイプ:r6id.4xlarge(vCPU:16、MEM:128GB、1x950GB NVMe SSD)
- EBS:ルートボリューム用EBSのみ(100GB)
- 注:EBSを2本以上アタッチして利用する構成は【後編】をご参照ください。
- OS:Redhat Enterprise Linux 8系
事前準備
(事前準備の操作は、本記事では割愛させて頂きます。)
- Amazno EC2インスタンスを「d」付きインスタンスタイプに変更
- Linuxから既存のSwap領域を削除
- セッションマネージャのコンソール接続 または ターミナルエミュレータからSSH接続した状態
設定の流れ
1.LinuxからEBSデバイス名の確認
2.Swap領域の作成
3.Swap領域の自動マウント設定
4.サーバ起動時にSwap領域作成設定
設定手順
注:作業は「#(root)」アカウントで行います。
1.LinuxからマウントされたEBSのデバイス名を確認する。
# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 100G 0 disk ←ルートボリューム用EBS nvme1n1 259:1 0 884.8G 0 disk ←これがインスタンスストアで「nvme1n1」がデバイス名 nvme0n1p1 259:2 0 1M 0 part nvme0n1p2 259:3 0 200M 0 part /boot/efi nvme0n1p3 259:4 0 98.8G 0 part /
2.Swap領域の作成する。
以下コマンド実行し、Swap領域を作成。
# mkswap /dev/nvme1n1
以下コマンド実行し、Swap領域を有効化。
# swapon /dev/nvme1n1
# swapon -s
ファイル名 タイプ サイズ 使用済み 優先順位 /dev/nvme1n1 partition 927734368 0 -2 ←表示されていれば、Swap有効化されている
# free
total used free shared buff/cache available Mem: 129663920 5363988 122391756 10712 1908176 123219788 Swap: 927734368 0 927734368 ←Swap領域として利用可能状態
◆この時点で、インスタンスストアをSwap領域とし利用可能な状態ですが
サーバの 停止⇒起動 または 再起動 を行うとSwap設定が解除状態となるため、後述の設定を施します。
3.Swap領域を自動マウントするよう設定する。
「/etc/cloud/cloud.cfg」ファイルの修正
# vi /etc/cloud/cloud.cfg
~割愛~ mounts: - [ ephemeral0, swap, swap ,"defaults", "0", "0"] ←左記行を追記する。
「/etc/fstab」ファイルの修正 # vi /etc/fstab
~最終行~ /dev/nvme1n1 none swap sw,nobootwait,comment=cloudconfig 0 2 ←左記行を追記する。
4.サーバ起動時に、Swap領域を作成するよう設定する。
「/etc/rc.d/rc.local」ファイルを修正
# vi /etc/rc.d/rc.local
~割愛~ touch /var/lock/subsys/local mkswap /dev/nvme1n1 ←左記行を追記する。 swapon /dev/nvme1n1 ←左記行を追記する。
「/etc/rc.d/rc.local」ファイルがサーバ起動時に実行される権限を変更します。
# chmod 755 /etc/rc.d/rc.local
動作確認
サーバ停止⇒起動後、Swap領域が作成され自動マウントされているかを確認します。
# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 100G 0 disk nvme1n1 259:1 0 884.8G 0 disk [SWAP] ←MOUNTPOINT が [SWAP]と表示されていれば成功 nvme0n1p1 259:2 0 1M 0 part nvme0n1p2 259:3 0 200M 0 part /boot/efi nvme0n1p3 259:4 0 98.8G 0 part /
終わりに
【前編】では、ルートボリューム用EBS+インスタンスストア構成での設定例を記載させて頂きました。
この設定は、「/dev/nvme1n1」デバイスを決めでSwap領域として利用する設定であるため、
EBSを2本以上アタッチして利用されてしまうと正常動作しないためご注意ください。
【後編】では、上記課題であるEBSを2本以上アタッチして利用する設定例について記載します。
インスタンスストアをLinuxのSwap領域として使う!【前編】 は以上になります。
ご一読いただき、ありがとうございました。