EC2インスタンスにどのようにスワップを追加しますか?


293

現在ec2マイクロインスタンスを実行していますが、インスタンスがメモリ不足になることが時々あります。

より大きなインスタンスサイズを使用する以外に、他に何ができますか?

回答:


574

この問題の修正は、インスタンスにスペースを追加するswap(つまりpaging)ことです。

ページングは​​、ハードドライブ上に領域を作成し、それを追加のメモリとして使用することで機能します。このメモリは通常のメモリよりもかなり低速ですが、より多くのメモリを使用できます。

この余分なスペースをインスタンスに追加するには、次のように入力します。

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo /sbin/swapon /var/swap.1

1024を超える数が必要な場合は、それをより高い値に変更してください。

再起動後にデフォルトで有効にするには、次の行を/ etc / fstabに追加します。

/var/swap.1   swap    swap    defaults        0   0

「if = ...」、「of = ...」、bs = 1M、count = 1024の意味を説明してください。引数リストでif、of、=を見たことがないためです。
アレックス

31
if「入力ファイル」をof意味し、「出力ファイル」をbs意味し、「ブロックサイズ」を意味countし、割り当てるブロックの数です。man詳細については、コマンドのページを参照してください:linux.die.net/man/1/ DD
ファビオ・バティスタ

4
そのddコマンドラインは、「/ dev / zeroから/ var / swapにコピーします。1メガバイトのサイズの1024ブロックを読み取ることでそれを行います」を意味します。これは、ゼロでいっぱいの1GBファイルをすばやく作成する方法です。
ネルソン

3
十分古いですが、再起動後もスワップメモリ​​が0%使用されたままです。何か助けはありますか?
Girdhari Agrawal 2017

3
スワップがアクティブかどうかを確認する場合:$> free -m
herve

216

スワップは、EBSデバイスではなく、インスタンスストレージ(エフェメラル)ディスクで行う必要があります。スワッピングは大量のIOを引き起こし、EBSのコストを増加させます。EBSはインスタンスストアよりも低速であり、インスタンスストアは特定のタイプのEC2インスタンスで無料で提供されます。

通常は/ mntにマウントされますが、実行されない場合

sudo mount /dev/xvda2 /mnt

次に、このデバイス上にスワップファイルを作成するには、4GBのスワップファイルに対して次の手順を実行します

sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=4096

他のユーザーがスワップファイルを表示できないようにする

sudo chown root:root /mnt/swapfile
sudo chmod 600 /mnt/swapfile

スワップとして作成してフラグを付ける

sudo mkswap /mnt/swapfile
sudo swapon /mnt/swapfile

追加/以下が/ etc / fstabにあることを確認してください

/dev/xvda2      /mnt    auto    defaults,nobootwait,comment=cloudconfig 0   2
/mnt/swapfile swap swap defaults 0 0

最後にスワップを有効にする

sudo swapon -a

6
これは間違いなく最も包括的な答えですimo
Jon B

4
ファイルシステムをマウントするには、ファイルシステムタイプを指定する必要があります。ファイルシステムを見つけるコマンドは次のとおりです。$ df -Tこれにより、デバイスとそのファイルシステムが表示されます。主にext4。私にとっては、2ではなく/ dev / xvda1でした
user1452686

8
docs.aws.amazon.com/AWSEC2/latest/UserGuide/…によると、インスタンスストアをt1 / t2インスタンスに追加することはできなくなりました。関係なく試した後、それは正しいようです。
muttonUp 2014

3
@alfetopito別のパーティションをスワップとして追加する代わりに、既存のパーティションにリテラルスワップファイルを作成することができます。CentOSに6のための素晴らしいガイド- digitalocean.com/community/tutorials/...
muttonUp

1
Amazonによると、再起動後にインスタンスストレージを保持することは保証されていません。その場合、fstabは失敗しませんか?
2015

42

ajtrichardsによって言及された手順を適用した後、このコマンドを使用して、amazon無料階層インスタンスがスワップを使用しているかどうかを確認できます

cat /proc/meminfo

結果:

ubuntu@ip-172-31-24-245:/$ cat /proc/meminfo
MemTotal:         604340 kB
MemFree:            8524 kB
Buffers:            3380 kB
Cached:           398316 kB
SwapCached:            0 kB
Active:           165476 kB
Inactive:         384556 kB
Active(anon):     141344 kB
Inactive(anon):     7248 kB
Active(file):      24132 kB
Inactive(file):   377308 kB
Unevictable:           0 kB
Mlocked:               0 kB

スワップ合計:1048572 kB

SwapFree:1048572 kB

Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        148368 kB
Mapped:            14304 kB
Shmem:               256 kB
Slab:              26392 kB
SReclaimable:      18648 kB
SUnreclaim:         7744 kB
KernelStack:         736 kB
PageTables:         5060 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1350740 kB
Committed_AS:     623908 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7420 kB
VmallocChunk:   34359728748 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      637952 kB
DirectMap2M:           0 kB

40

次のコマンドを使用して、インスタンスに1 GBのスワップを追加できます。

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo mkswap /swapfile
sudo swapon /swapfile

再起動後にデフォルトで有効にするには、次の行を追加します/etc/fstab

/swapfile swap swap defaults 0 0

しかし、私のファイルシステムのどれからスワップを作成するためのスペースが必要でしょうか?
フセイン2016

@Hussainパスがであるため、ルートファイルシステムにスワップが作成されます/swapfile。ただし、別のファイルシステムをマウントして、そこにスワップファイルを作成することもできます/mnt/blah/swapfile
David Levesque

これがt2.microインスタンスで動作することを確認できます。私はクリーンなルートが好きなので、@ / mnt / swapを実行しました。
Mike Purcell

1
この回答は最短で仕事をするため、賛成しました。ただし、swapfile chmod 600コマンドを追加する必要があります。
Soberの

15

あなたが上にある場合t2のインスタンス(t2.microt2.mediumt2.small)、あなたに利用可能な一時的またはインスタンスストレージがありません。そのためEBS、ユースケースに応じて適切な場合とそうでない場合があるスワップを作成する必要があります。それ以外の場合は、@ Davidの回答に従い、EBSコストの支払いを回避するために、一時ストレージにスワップを作成します。

詳細:http : //docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html各インスタンスタイプで取得できる一時ストレージの量を示す表があります。


1
これは一般的に悪い考えであると確認できます。不正なプロセスがある場合(ノードサーバーでそれを実行していて、python / celeryのセットアップを行っている場合)、知らないうちにEBSブロックに対して読み取りと書き込みを行うと、毎週大量の料金が発生します。 -)
ZachM 2016年

3
aws.amazon.com/ebs/pricingによると、IOはプロビジョニングされたIPOS SSD(io1)を除くすべてのEBSボリュームに含まれています。GBあたりのみ。これは最近の料金モデルの変更である可能性がありますが、それは、EBSが実際のInstance Storaceよりはるかに遅いにもかかわらず、読み取りと書き込みに追加料金が発生しないことを意味します。
bobsoap

@bobsoap明確にしていただけませんか?リンクを確認したところ、こちらが見つかりましたFor example, if you provision a volume with 1000 IOPS, and keep this volume for 15 days in a 30 day month, then in a Region that charges $0.10 per provisioned IOPS-month, you would be charged $50 for the IOPS that you provision ($0.10 per provisioned IOPS-month * 1000 IOPS provisioned * 15 days/30). You will be charged for the IOPS provisioned on a volume even when the volume is detached from an instance.。AWSは読み取りと書き込みの操作に課金するようです。
Valter Silva

2
@ValterHenrique引用したテキストは、IOPSがプロビジョニングされたボリュームにのみ適用されますが、いくつかの異なるボリュームタイプから選択できます。プロビジョニングされたIOPSのない「通常の」ボリューム(「gp2」と呼ばれる汎用SSDボリュームタイプなど)を使用している場合、読み取りおよび書き込み操作は追加で課金されません。多分比較するためのより良いリンク:aws.amazon.com/ebs/details
bobsoap

8

次の手順を使用してスワップ領域を作成できます。ここでは、スワップを作成しています /home/

  1. dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
    ここでのカウントは、スワップ領域のキロバイト数です

  2. mkswap /home/swapfile1

  3. vi /etc/fstab
    エントリーする:
    /home/swapfile1 swap swap defaults 0 0

  4. 実行:
    swapon -a


4

どのサーバーにもスワップ領域を追加できます

ddコマンドを使用してファイルを作成する

 #dd if=/dev/zero of=/swapfile bs=1M count=2048
                    or
 #dd if=/dev/zero of=/swapfile bs=1024M count=2

bsはブロックサイズでカウントMBまたはGBのサイズを指します

私たちはその逆も使用できます

作成後、ファイルの権限を変更します。

 #chmod 600 /swapfile 

次に、ファイルをmakewapします。

 #mkswap /swapfile 

次に、swaponコマンドでスワップファイルを有効にします。

 #swapon  /swapfile 

スワップが有効になっているかどうかをfreeコマンドで確認します。

 #free -h
 #swapon -s

3

Davidのインスタンスストレージを使用すると、最初は(m5d.2xlargeで)動作しましたが、EC2インスタンスを停止して再びオンにした後、インスタンスに再度SSH接続できませんでした。

次のインスタンスログが報告されました:「緊急モードです。ログイン後、「journalctl -xb」と入力してシス​​テムログを表示し、「systemctl reboot」を再起動して「systemctl default」または「exit」と入力してデフォルトモードで起動します。Enterキーを押します。メンテナンスのために"

代わりに、私はこのリンクのAWSの指示に従いました。インスタンスをオフにしてから再びオンにした後も含め、すべてが完全に機能しました。

https://aws.amazon.com/premiumsupport/knowledge-center/ec2-memory-swap-file/

sudo dd if=/dev/zero of=/swapfile bs=1G count=4

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

sudo swapon -s

sudo vi /etc/fstab
/swapfile swap swap defaults 0 0

1

swapspace http://pqxx.org/development/swapspace/をお試しください

ほとんどのディストリビューションにはパッケージ化されています。

EC2では、「swappath」を/ mntまたはhigh-iops diskに変更する必要がある場合があります。


1
ドキュメントから:「現在の形式では、Swapspaceは、常に応答性を維持する必要があるシステムにはおそらく適していません。」
デイブアルバート

-3

次のスクリプトを使用して、Amazon Linuxにスワップを追加できます。

https://github.com/chetankapoor/swap

wgetを使用してスクリプトをダウンロードします。

wget https://raw.githubusercontent.com/chetankapoor/swap/master/swap.sh -O swap.sh

次に、次の形式でスクリプトを実行します。

sh swap.sh 2G

完全なチュートリアルについては、次のURLにアクセスしてください。

https://installvirtual.com/shell-script-to-create-swap/


私はこの回答が何を貢献するのかはわかりません。基本的に、受け入れられた回答がすでに説明したことを基本的に行うシェルスクリプトであるだけです。
Nils Werner

時間を節約できるシェルスクリプトを作成したばかりなので、5つのコマンドを実行する代わりに、2つのステップでswapを作成できます。swapがすでに存在する場合は、swapがすでにあることがわかります。
Chetan kapoor

3
丁度。rootとして実行することになっているシェルスクリプト。どこかで、予告なしに変更または消失する可能性がある誰かによって作成されました。5年前に投稿および承認された4〜5個のコマンドラインを保存するためのすべて。
Nils Werner、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.