Como você adiciona swap a uma instância do EC2?


293

Atualmente, estou executando uma micro instância ec2 e descobri que a instância ocasionalmente fica sem memória.

Além de usar um tamanho de instância maior, o que mais pode ser feito?

Respostas:


574

Uma correção para esse problema é adicionar swap(ou seja paging) espaço à instância.

A paginação funciona criando uma área no disco rígido e usando-a para obter memória extra. Essa memória é muito mais lenta que a memória normal, mas há muito mais disponível.

Para adicionar esse espaço extra à sua instância, digite:

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

Se você precisar de mais de 1024, mude isso para algo mais alto.

Para habilitá-lo por padrão após a reinicialização, adicione esta linha ao / etc / fstab:

/var/swap.1   swap    swap    defaults        0   0

Você poderia, por favor, explicar o que significa "se = ...", "of = ...", bs = 1M e count = 1024 porque nunca vi se, de e = na lista de argumentos.
アレックス

31
ifsignifica 'arquivo de entrada', ofsignifica 'arquivo de saída', bssignifica 'tamanho do bloco' e counté o número de blocos que você deseja alocar ... você pode ler a manpágina do comando para obter mais informações: linux.die.net/man/1/ dd
Fábio Batista

4
Essa linha de comando dd significa "copiar de / dev / zero para /var/swap.1. Faça isso lendo 1024 blocos de tamanho 1 megabyte". É uma maneira rápida de criar um arquivo de 1 GB cheio de zeros.
Nelson

3
idade suficiente, mas minha memória de troca permanece 0% usada mesmo após a reinicialização, alguma ajuda?
Girdhari Agrawal 31/03

3
Se você deseja verificar se a troca está ativa:$> free -m
herve

216

A troca deve ocorrer no disco de armazenamento de instância (efêmero) e não em um dispositivo EBS. A troca causará muito IO e aumentará o custo no EBS. O EBS também é mais lento que o Repositório de Instâncias e o Repositório de Instâncias é fornecido gratuitamente com certos tipos de Instâncias do EC2 .

Geralmente ele será montado em / mnt, mas se não for executado

sudo mount /dev/xvda2 /mnt

Para criar um arquivo de troca neste dispositivo, faça o seguinte para um arquivo de troca de 4 GB

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

Certifique-se de que nenhum outro usuário possa visualizar o arquivo de troca

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

Fazer e sinalizar como swap

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

Adicione / verifique se o seguinte está no seu / etc / fstab

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

por fim, ativar a troca

sudo swapon -a

6
esta é definitivamente a resposta mais abrangente imo
Jon B

4
Para montar um sistema de arquivos, é necessário especificar o tipo de sistema de arquivos. Para localizar o sistema de arquivos, o comando é: $ df -T Isso mostra os dispositivos e seus sistemas de arquivos. Principalmente ext4. Para mim era / dev / xvda1, não 2.
user1452686

8
De acordo com docs.aws.amazon.com/AWSEC2/latest/UserGuide/… , não é mais possível adicionar repositórios de instâncias a instâncias t1 / t2. Depois de tentar de qualquer maneira, parece estar correto.
muttonUp

3
@alfetopito Você provavelmente pode criar um arquivo de swap literal em uma partição existente, em vez de adicionar outra partição como swap. Um guia bom para Centos 6 - digitalocean.com/community/tutorials/...
muttonUp

1
De acordo com a Amazon, não é garantido que você mantenha o armazenamento da instância após a reinicialização. O fstab falhará?
dualed

42

Após aplicar as etapas mencionadas por ajtrichards, você pode verificar se sua instância do Amazon Free Tier está usando swap usando este comando

cat /proc/meminfo

resultado:

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

Total da troca: 1048572 kB

Troca grátis: 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

Você pode adicionar uma troca de 1 GB à sua instância com estes comandos:

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

Para habilitá-lo por padrão após a reinicialização, adicione esta linha a /etc/fstab:

/swapfile swap swap defaults 0 0

Mas de qual sistema de arquivos será necessário o espaço para criar o Swap?
Hussain

@Hussain Ele criará a troca no sistema de arquivos raiz, já que o caminho é /swapfile. Mas você também pode montar outro sistema de arquivos e criar o arquivo de troca lá, por exemplo /mnt/blah/swapfile.
David Levesque 04/02

Pode confirmar que isso funciona em uma instância t2.micro. Eu fiz o meu @ / mnt / swap embora como eu gosto de uma raiz limpa.
5606 Mike Purcell

1
Votou esta resposta porque é a mais curta e faz o trabalho. No entanto, o comando swapfile chmod 600 deve ser adicionado.
Sober

15

Se você estiver em t2casos ( t2.micro, t2.medium, t2.small), não há efêmera ou instância de armazenamento disponível para você. Portanto, você precisa apenas criar seu swap no EBSqual, dependendo do seu caso de uso, pode ou não ser uma boa idéia. Caso contrário, siga a resposta de @David e crie sua troca no armazenamento efêmero para evitar pagar os custos do EBS.

Mais informações: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html, existe uma tabela que mostra a quantidade de armazenamento efêmero que você obtém para cada tipo de instância.


1
Pode confirmar que isso geralmente é uma má ideia. Se você tiver um processo desonesto (eu tive um servidor de nó fazendo isso e uma configuração de python / aipo), você incorrerá em uma tonelada de cobranças quando ele ler e gravar no seu bloco EBS durante toda a semana sem que você saiba: -)
ZachM 29/03

3
De acordo com aws.amazon.com/ebs/pricing , o IO está incluído em todos os volumes do EBS, exceto SSD IPOS provisionado (io1). Você apenas por GB. Isso pode ter sido uma mudança recente no modelo de precificação - mas significa que, embora o EBS seja muito mais lento que o verdadeiro Instance Storace, não há cobranças adicionais por leituras e gravações.
bobsoap

@bobsoap Você gostaria de esclarecer isso? Eu verifiquei seu link e encontrei isso 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.. Parece que a AWS cobrará pelas operações de leitura e gravação.
Valter Silva

2
@ValterHenrique O texto que você citou se aplica apenas a volumes com IOPS provisionado, mas você pode escolher entre vários tipos de volumes diferentes. Se você estiver usando um volume "normal" sem IOPS provisionado (como o tipo de volume SSD de uso geral chamado "gp2"), as operações de leitura e gravação não serão cobradas extra. Talvez uma melhor ligação para comparar: aws.amazon.com/ebs/details
bobsoap

8

Você pode criar espaço de troca usando as seguintes etapas Aqui estamos criando troca em /home/

  1. dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
    Aqui a contagem é a contagem de kilobytes de espaço de troca

  2. mkswap /home/swapfile1

  3. vi /etc/fstab
    faça a entrada:
    /home/swapfile1 swap swap defaults 0 0

  4. corre:
    swapon -a


4

Podemos adicionar espaço de troca em qualquer servidor

crie um arquivo usando o comando dd

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

bs é tamanho de bloco e contagem refere-se ao tamanho em MB ou GB

podemos usar vice-versa

Após a criação, altere a permissão do arquivo:

 #chmod 600 /swapfile 

Em seguida, cria o arquivo:

 #mkswap /swapfile 

Ative o arquivo swap com o comando swapon:

 #swapon  /swapfile 

Verifique com comando livre se a troca está ativada ou não:

 #free -h
 #swapon -s

3

Usando a resposta do Instance Storage de David, inicialmente funcionou para mim (em um m5d.2xlarge), no entanto, depois de parar a instância do EC2 e ativá-la novamente, não consegui fazer o ssh novamente na instância.

A instância registra: "Você está no modo de emergência. Após o login, digite" journalctl -xb "para visualizar os logs do sistema," systemctl reboot "para reiniciar," systemctl default "ou" exit "para inicializar no modo padrão. Pressione Enter para manutenção"

Em vez disso, segui as instruções da AWS neste link e tudo funcionou perfeitamente, inclusive após desligar e ligar a instância novamente.

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

Experimente o swapspace http://pqxx.org/development/swapspace/

A maioria das distros o inclui.

No EC2, convém alterar "swappath" para / mnt ou disco high-iops.


1
Dos documentos: "Na sua forma atual, o Swapspace provavelmente não é uma boa opção para sistemas que precisam permanecer responsivos o tempo todo;"
Dave Albert

-3

Você pode usar o script a seguir para adicionar swap no Amazon Linux.

https://github.com/chetankapoor/swap

Faça o download do script usando o wget:

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

Em seguida, execute o script com o seguinte formato:

sh swap.sh 2G

Para um tutorial completo, você pode visitar:

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


Não vejo o que essa resposta contribui, além de ser apenas um shellscript que basicamente faz o que a resposta aceita já explicou.
Nils Werner

Acabei de criar um script de shell, que economiza tempo, portanto haverá 2 etapas para criar swap em vez de executar 5 comandos e, se já existir, o swap mostrará que o swap já está lá.
Chetan Kapoor

3
Exatamente. Um shellscript que devo executar como root. Feito por alguém, em algum lugar, que pode mudar ou desaparecer sem aviso prévio. Tudo para salvar de 4 a 5 linhas de comando postadas e aceitas há 5 anos.
Nils Werner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.