【问题标题】:How do you add swap to an EC2 instance?如何将交换添加到 EC2 实例?
【发布时间】:2013-06-14 23:14:25
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-ec2 out-of-memory


    【解决方案1】:

    解决此问题的方法是向实例添加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 和 =在参数列表中。
    • if 表示“输入文件”,of 表示“输出文件”,bs 表示“块大小”,count 是您要分配的块数……您可以阅读命令的man 页面了解更多信息:linux.die.net/man/1/dd
    • 该 dd 命令行的意思是“从 /dev/zero 复制到 /var/swap.1。通过读取 1024 个大小为 1 兆字节的块来做到这一点”。这是创建一个全零的 1GB 文件的快速方法。
    • 已经够老了,但是我的交换内存在重启后仍然是 0%,有什么帮助吗?
    • 如果要检查交换是否处于活动状态:$> free -m
    【解决方案2】:

    您可以使用以下命令向您的实例添加 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
    

    【讨论】:

    • 但是它将从我的哪个文件系统中占用空间来创建交换?
    • @Hussain 它将在根文件系统中创建交换,因为路径是/swapfile。但是您也可以挂载另一个文件系统并在那里创建交换文件,例如/mnt/blah/swapfile.
    • 可以确认这适用于 t2.micro 实例。我做了我的@/mnt/swap,因为我喜欢干净的根。
    • 赞成这个答案,因为它是最短的并且可以完成工作。但是,应添加 swapfile chmod 600 命令。
    【解决方案3】:

    应用 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
    

    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
    

    【讨论】:

      【解决方案4】:

      试试交换空间 http://pqxx.org/development/swapspace/

      大多数发行版都将其打包。

      在 EC2 上,您可能希望将“交换路径”更改为 /mnt 或高 iops 磁盘。

      【讨论】:

      • 来自文档:“在当前形式下,对于需要始终保持响应的系统而言,Swapspace 可能不是一个好的选择;”
      【解决方案5】:

      交换应该在实例存储(临时)磁盘而不是 EBS 设备上进行。 Swaping会造成大量的IO,会增加EBS的成本。 EBS 也比 Instance Store 慢,而 Instance Store 随 certain types of EC2 Instances 免费提供。

      它通常会被挂载到 /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
      

      【讨论】:

      • 这绝对是imo最全面的答案
      • 要挂载文件系统,必须指定文件系统类型。要查找文件系统,命令是: $df -T 这将显示设备及其文件系统。主要是 ext4。对我来说是 /dev/xvda1,而不是 2。
      • 根据docs.aws.amazon.com/AWSEC2/latest/UserGuide/…,无法再将实例存储添加到 t1/t2 实例。无论如何尝试之后,它似乎是正确的。
      • @alfetopito 您可能可以在现有分区上创建一个文字交换文件,而不是添加另一个分区作为交换。一个很好的 Centos 6 指南 - digitalocean.com/community/tutorials/…
      • 根据亚马逊的说法,不保证重启后你的实例存储会保留,那fstab不会失败吗?
      【解决方案6】:

      您可以使用以下步骤创建交换空间 在这里,我们在 /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

      【讨论】:

        【解决方案7】:

        如果您使用的是 t2 实例(t2.microt2.mediumt2.small),则没有可供您使用的临时或实例存储。所以你只需要在EBS 中创建你的交换,这取决于你的用例可能是也可能不是一个好主意。 否则请遵循@David 的回答,并在临时存储上创建交换以避免支付 EBS 成本。

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

        【讨论】:

        • 可以确认这通常是个坏主意。如果您有一个流氓进程(我有一个节点服务器这样做,并且有一个 python/celery 设置),那么当它在您不知道的情况下读取和写入您的 EBS 块时,您将产生大量费用: -)
        • 根据aws.amazon.com/ebs/pricing,IO 包含在除预配置 IPOS SSD (io1) 之外的所有 EBS 卷中。你只有每 GB。这可能是定价模型最近发生的变化——但这意味着即使 EBS 比真正的 Instance Storace 慢得多,也不会产生额外的读写费用。
        • @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会对读写操作收费。
        • @ValterHenrique 您引用的文本仅适用于具有预配置 IOPS 的卷,但您可以在几种不同的卷类型之间进行选择。如果您使用的是没有预置 IOPS 的“普通”卷(例如称为“gp2”的通用 SSD 卷类型),则读取和写入操作不收取额外费用。也许一个更好的比较链接:aws.amazon.com/ebs/details
        【解决方案8】:

        我们可以在任何服务器中添加交换空间

        使用dd命令创建文件

         #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 
        

        然后makeswap文件:

         #mkswap /swapfile 
        

        然后使用 swapon 命令启用交换文件:

         #swapon  /swapfile 
        

        使用 free 命令检查是否启用了交换:

         #free -h
         #swapon -s
        

        【讨论】:

          【解决方案9】:

          您可以使用以下脚本在 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
          

          如需完整教程,您可以访问:

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

          【讨论】:

          • 我看不出这个答案有什么贡献,除了只是一个基本上可以完成已接受答案已经解释的 shellscript。
          • 我刚刚创建了一个 shell 脚本,它可以节省时间,因此将有 2 个步骤来创建交换而不是运行 5 个命令,如果交换已经存在,它将显示交换已经存在。
          • 没错。我应该以 root 身份运行的 shellscript。由某人在某处制造,可能会在没有通知的情况下更改或消失。全部保存 5 年前发布并接受的 4-5 条命令行。
          【解决方案10】:

          使用 David 的 Instance Storage 答案最初对我有用(在 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-17
            • 2022-01-22
            • 2021-05-29
            • 2020-12-26
            • 1970-01-01
            • 1970-01-01
            • 2021-05-21
            相关资源
            最近更新 更多