如何将交换添加到EC2实例?

ajt*_*rds 281 out-of-memory amazon-ec2 amazon-web-services

我目前正在运行一个ec2微实例,我发现实例偶尔耗尽内存.

除了使用更大的实例大小外,还能做些什么呢?

ajt*_*rds 557

解决此问题的方法是向实例添加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
Run Code Online (Sandbox Code Playgroud)

如果您需要超过1024,那么将其更改为更高的值.

要在重新启动后默认启用它,请将此行添加到/ etc/fstab:

/var/swap.1   swap    swap    defaults        0   0
Run Code Online (Sandbox Code Playgroud)

  • `if`表示'输入文件',``表示'输出文件',`bs`表示'块大小',`count`表示你想要分配的块数...你可以阅读`man`页面命令获取更多信息:http://linux.die.net/man/1/dd (31认同)
  • 该dd命令行的意思是"从/ dev/zero复制到/var/swap.1.通过读取1024个大小为1兆字节的块"来执行此操作.这是创建一个充满零的1GB文件的快速方法. (4认同)
  • 足够旧,但我的交换内存仍然是0%使用,即使重启后,任何帮助? (3认同)
  • 如果要检查交换是否处于活动状态:`$> free -m` (3认同)
  • 您可以使用“fallocate”,它几乎是即时的(https://www.baeldung.com/linux/create-large-file),而不是“dd”,对于多个 GB 文件可能需要一段时间。`fallocate -l 20G /swapfile` 在 EKS AMI 上运行良好。 (2认同)

Dav*_*vid 211

交换应该在实例存储(临时)磁盘上进行,而不是在EBS设备上进行.交换将导致大量IO并且将增加EBS的成本.EBS也比Instance Store慢,而Instance Store可以免费提供某些类型的EC2实例.

它通常会挂载到/ mnt,但如果没有运行

sudo mount /dev/xvda2 /mnt
Run Code Online (Sandbox Code Playgroud)

然后,要在此设备上创建交换文件,请执行以下4GB交换文件

sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=4096
Run Code Online (Sandbox Code Playgroud)

确保没有其他用户可以查看交换文件

sudo chown root:root /mnt/swapfile
sudo chmod 600 /mnt/swapfile
Run Code Online (Sandbox Code Playgroud)

Make和Flag作为交换

sudo mkswap /mnt/swapfile
sudo swapon /mnt/swapfile
Run Code Online (Sandbox Code Playgroud)

添加/确保以下内容位于/ etc/fstab中

/dev/xvda2      /mnt    auto    defaults,nobootwait,comment=cloudconfig 0   2
/mnt/swapfile swap swap defaults 0 0
Run Code Online (Sandbox Code Playgroud)

最后启用交换

sudo swapon -a
Run Code Online (Sandbox Code Playgroud)

  • 根据http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#StorageOnInstanceTypes,不再可能将实例存储添加到t1/t2实例.无论如何尝试,它似乎是正确的. (8认同)
  • 这绝对是最全面的答案imo (6认同)
  • 要挂载文件系统,必须指定文件系统类型.要查找文件系统,命令为:$ df -T这将显示设备及其文件系统.主要是ext4.对我来说它是/ dev/xvda1,而不是2. (4认同)
  • @alfetopito您可以在现有分区上创建文字交换文件,而不是将另一个分区添加为交换.Centos 6的一个很好的指南 - https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-6 (3认同)
  • @muttonUp是否可以解决微型实例? (2认同)
  • “交换会导致大量 IO,并且会增加 EBS 的成本。” 某些卷类型可能会出现这种情况,但 gp2 则不然,它仅针对存储而变化。来自[文档](https://aws.amazon.com/ebs/pricing/):“I/O 包含在卷的价格中,因此您只需为预配的每 GB 存储付费。” 撇开延迟问题不谈,在设置 EBS 支持的交换量时,成本似乎可能不是问题。 (2认同)

Him*_*der 42

应用ajtrichards提到的步骤后,您可以使用此命令检查您的amazon免费层实例是否正在使用swap

cat /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

SwapTotal: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
Run Code Online (Sandbox Code Playgroud)


Dav*_*que 38

您可以使用以下命令为实例添加1 GB交换:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo mkswap /swapfile
sudo swapon /swapfile
Run Code Online (Sandbox Code Playgroud)

要在重新启动后默认启用它,请将此行添加到/etc/fstab:

/swapfile swap swap defaults 0 0
Run Code Online (Sandbox Code Playgroud)

  • 赞成这个答案,因为它是最短的并且可以完成工作。但是,应该添加 swapfile chmod 600 命令。 (3认同)

Ali*_*Ali 15

如果您对t2实例(t2.micro,t2.medium,t2.small),没有提供给您短暂的或实例存储.所以你需要创建你的交换EBS,根据你的用例,可能或可能不是一个好主意.否则,请关注@David的回答,并在短暂存储上创建交换,以避免支付EBS费用.

更多信息:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html有一个表格,显示您为每种实例类型获得的短暂存储空间.

  • 根据https://aws.amazon.com/ebs/pricing/,IO包含在除Provisioned IPOS SSD(io1)之外的所有EBS卷中.你只有每GB.这可能是最近定价模型的一个变化 - 但这意味着即使EBS比真正的Instance Storace慢得多,也不会有额外的读写费用. (3认同)
  • @ValterHenrique您引用的文本仅适用于具有预配置IOPS的卷,但您可以选择多种不同的卷类型.如果您使用没有预配置IOPS的"正常"卷(如称为"gp2"的通用SSD卷类型),则不会额外收取读写操作.也许更好的比较链接:https://aws.amazon.com/ebs/details/ (2认同)

min*_*s23 8

您可以使用以下步骤创建交换空间这里我们创建交换 /home/

  1. dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
    这里count是交换空间的千字节数

  2. mkswap /home/swapfile1

  3. vi /etc/fstab
    进入:
    /home/swapfile1 swap swap defaults 0 0

  4. 跑:
    swapon -a


小智 6

使用 David 的实例存储答案最初对我有用(在 m5d.2xlarge 上),但是,在停止 EC2 实例并将其重新打开后,我无法再次通过 ssh 连接到该实例。

实例日志报告:“您处于紧急模式。登录后,输入“journalctl -xb”查看系统日志,“systemctl reboot”重启,“systemctl default”或“exit”启动进入默认模式。按回车用于维护”

相反,我按照此链接中的 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
Run Code Online (Sandbox Code Playgroud)