我正在使用 Amazon EC2,希望能够在实例启动时快速生成大型交换文件 (~10+GB)。不幸的是,我的实例 (c1.xlarge) 上的 I/O 速度很慢 (20 MB/s),因此此操作需要 10 多分钟,这对于我的使用情况来说是不可接受的。
我知道必须预先分配交换文件才能使用,这样我就不能使用稀疏文件。
但是,是否有一些命令可以分配块,而无需花费大量时间将块清零?此外,如果此命令存在,我是否可以正确地假设交换文件中的页面在用户进程访问它之前就被清零(减轻安全问题)?
答案1
您没有指出您想要避免哪种方法。
传统上,你会发出一个dd
命令,该命令会依次抽出一个适当大小的零文件,然后运行mkswap
,将条目添加到/etc/fstab
,然后swapon
激活它。我附上了一个匆忙编写的示例 shell 脚本,我确信它有错误(我当时已经很晚了,条目fstab
远非完美)
#!/bin/bash
# --- allocate 10Gbyte of swap space as 10 separate 1Gbyte files
# --- that are brought online sequentially during processing
for swpidx in 01 02 03 04 05 06 07 08 09 10
do
dd if=/dev/zero of=/swapfile.$swpidx bs=16738 count=65536
mkswap /swapfile.$swpidx
echo "/swapfile.$swpidx swap swap default 0 0" >> /etc/fstab
swapon -a
done
swapon -s
不过,听起来您正在尝试避免这种方法。 我能提供的最快的解决方案是使用交换分区,它不需要清零过程,并且可以在几分钟内上线。 如果您的实例正在运行 LVM,并且您有一个可以从中划分分区的现有卷组,那么这也同样有效,并且分配只需几分钟即可完成。
我想我应该提一下,即使对于服务器来说,划分出这么大的交换空间也有点不寻常;我之所以这么说,是因为大多数服务器在处理这种大小的程序/数据时都附带几 GB 的 RAM。不是想打探什么的,但你真的需要那么多交换空间吗?
您可能希望考虑的另一件事是重新调整您的工作负载,而不是尝试动态分配交换空间。虽然拥有这么多的“按需”空间很棒,但正如您自己指出的那样,由于服务器实例上的 I/O 吞吐量较慢,它很快就会成为瓶颈。当您耗尽内存并且您基本上“生活在交换中”时,您会发现 20Mbyte/sec 的传输速率将您的实例变成了 386SX。
答案2
我成功使用了“fallocate”命令。它花费的时间不到 1 秒。
sudo fallocate -l 10G /swapfile
之后,您可以运行 mkswap。有关更多信息,您可以使用此处的适用于 ubuntu 的出色 Digital Ocean 教程,该教程可能无需修改即可适用于其他 Linux 版本,网址为https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04。
答案3
事实证明,您可以使用环回设备将交换放在稀疏文件上: http://www.option-c.com/xwiki/Loop_Mounting_Swap_Partition
答案4
您的 c1.xlarge 实例应该具有或能够具有一些实质性的本地实例存储(短暂的,不会在启动后持续存在)。您可能必须确保在启动时分配空间。我没有这样做,所以我无法向您提供详细信息。我绝对不会使用交换文件。