我目前正在运行一个ec2微型实例,但是我发现这个实例偶尔会出现内存不足的情况。
除了使用更大的实例尺寸外,还有什么其他的解决方法吗?
我目前正在运行一个ec2微型实例,但是我发现这个实例偶尔会出现内存不足的情况。
除了使用更大的实例尺寸外,还有什么其他的解决方法吗?
解决这个问题的方法是为实例添加swap
(即分页
)空间。
分页的工作原理是在硬盘上创建一个区域并将其用作额外的内存,这种内存比普通内存慢得多,但更多的可用空间。
要将此额外空间添加到您的实例中,请键入:
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
$> free -m
。 - hervefallocate
命令来创建大文件,这个命令几乎是瞬间完成的(https://www.baeldung.com/linux/create-large-file),相比之下,使用 dd
命令创建多个 GB 大小的文件可能需要一段时间。在 EKS AMI 上,使用 fallocate -l 20G /swapfile
命令效果非常好。 - markfickett应该将交换文件放在实例存储(临时)磁盘上,而不是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
你可以使用以下命令将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
/swapfile
,它将在根文件系统中创建交换空间。但是您也可以挂载另一个文件系统并在那里创建交换文件,例如/mnt/blah/swapfile
。 - David Levesque按照ajtrichards提供的步骤执行后,您可以使用以下命令检查您的亚马逊免费套餐实例是否在使用交换空间
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
可用交换空间: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
t2
实例(t2.micro
、t2.medium
、t2.small
),那么你将无法使用临时或实例存储。因此,你需要在 EBS
上创建交换分区,具体取决于你的使用情况,这可能是个好主意也可能不是。
否则,可以按照 @David 的答案,在临时存储上创建交换分区以避免支付 EBS 成本。一开始我使用了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
/home/
上创建交换空间。
dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
这里的count是交换空间的千字节计数。
mkswap /home/swapfile1
vi /etc/fstab
添加以下内容:
/home/swapfile1 swap swap defaults 0 0
运行:
swapon -a
#dd if=/dev/zero of=/swapfile bs=1M count=2048
or
#dd if=/dev/zero of=/swapfile bs=1024M count=2
bs表示块大小,count指的是以MB或GB为单位的大小
我们可以反过来使用
创建后更改文件权限:
#chmod 600 /swapfile
#mkswap /swapfile
#swapon /swapfile
使用 free 命令检查 swap 是否已启用:
#free -h
#swapon -s
尝试 swapspace http://pqxx.org/development/swapspace/
大多数发行版都已经打包好了。
在EC2上,您可能希望将"swappath"更改为/mnt或高IOPS磁盘。