Come si aggiunge lo swap a un'istanza EC2?


293

Attualmente sto eseguendo una microistanza ec2 e ho riscontrato che l'istanza a volte esaurisce la memoria.

Oltre a utilizzare una dimensione dell'istanza più grande, cos'altro si può fare?

Risposte:


574

Una soluzione per questo problema è aggiungere swap(cioè paging) spazio all'istanza.

Il paging funziona creando un'area sul disco rigido e utilizzandola per memoria aggiuntiva, questa memoria è molto più lenta della memoria normale, anche se è disponibile molto di più.

Per aggiungere questo spazio extra alla tua istanza, digita:

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 hai bisogno di più di 1024, cambialo in qualcosa di più alto.

Per abilitarlo di default dopo il riavvio, aggiungi questa riga a / etc / fstab:

/var/swap.1   swap    swap    defaults        0   0

Potresti spiegare cosa significa "if = ...", "of = ...", bs = 1M e count = 1024 perché non ho mai visto if, of e = nell'elenco degli argomenti.
ア レ ッ ク ス

31
ifsignifica "file di input", of"file di output", bs"dimensione del blocco" ed countè il numero di blocchi che si desidera allocare ... è possibile leggere la manpagina del comando per maggiori informazioni: linux.die.net/man/1/ dd
Fábio Batista,

4
Quella riga di comando dd significa "copia da / dev / zero in /var/swap.1. Fallo leggendo 1024 blocchi di dimensione 1 megabyte". È un modo rapido per creare un file da 1 GB pieno di zero.
Nelson,

3
abbastanza vecchio, ma la mia memoria di swap rimane utilizzata allo 0% anche dopo il riavvio, qualche aiuto?
Girdhari Agrawal

3
Se si desidera verificare se lo swap è attivo:$> free -m
herve

216

Lo scambio dovrebbe avvenire sul disco di archiviazione dell'istanza (effimero) e non su un dispositivo EBS. Lo scambio causerà molto IO e aumenterà i costi su EBS. EBS è anche più lento di Instance Store e Instance Store viene fornito gratuitamente con alcuni tipi di istanze EC2 .

Di solito sarà montato su / mnt ma se non eseguito

sudo mount /dev/xvda2 /mnt

Per creare un file di scambio su questo dispositivo, procedi come segue per un file di scambio da 4 GB

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

Assicurarsi che nessun altro utente possa visualizzare il file di scambio

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

Crea e contrassegna come swap

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

Aggiungi / Assicurati che quanto segue sia nel tuo / etc / fstab

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

abilitare infine lo scambio

sudo swapon -a

6
questa è sicuramente la risposta più completa imo
Jon B

4
Per montare un file system è necessario specificare il tipo di file system. Per trovare il file system il comando è: $ df -T Questo mostrerà i dispositivi e i loro file system. Principalmente ext4. Per me era / dev / xvda1, non 2.
user1452686

8
Secondo docs.aws.amazon.com/AWSEC2/latest/UserGuide/… non è più possibile aggiungere negozi di istanze alle istanze t1 / t2. Dopo aver provato a prescindere, sembrerebbe corretto.
muttonUp,

3
@alfetopito Probabilmente puoi creare un file di scambio letterale su una partizione esistente invece di aggiungere un'altra partizione come scambio. Una bella guida per Centos 6 - digitalocean.com/community/tutorials/…
muttonUp

1
Secondo Amazon, non è garantito che tu conservi la memoria dell'istanza dopo il riavvio, quindi fstab non fallirà?
dualizzato il

42

Dopo aver applicato i passaggi menzionati da ajtrichards, puoi verificare se la tua istanza di livello gratuito di Amazon utilizza swap usando questo comando

cat /proc/meminfo

risultato:

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

40

È possibile aggiungere uno scambio da 1 GB all'istanza con questi comandi:

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

Per abilitarlo per impostazione predefinita dopo il riavvio, aggiungere questa riga a /etc/fstab:

/swapfile swap swap defaults 0 0

Ma da quale del mio filesystem ci vorrà lo spazio per creare Swap?
Hussain,

@Hussain Crea lo swap nel filesystem di root poiché il percorso è /swapfile. Ma potresti anche montare un altro filesystem e creare lì il file di scambio, ad es /mnt/blah/swapfile.
David Levesque,

Può confermare che funziona su un'istanza t2.micro. Ho fatto il mio @ / mnt / swap anche se mi piace una radice pulita.
Mike Purcell,

1
Ha valutato questa risposta perché è la più breve e fa il lavoro. Tuttavia, è necessario aggiungere il comando swapfile chmod 600.
Sõber,

15

Se siete su t2casi ( t2.micro, t2.medium, t2.small), non v'è effimera o istanza di archiviazione a vostra disposizione. Quindi devi solo creare il tuo swap in EBScui, a seconda del tuo caso d'uso, può o non può essere una buona idea. Altrimenti segui la risposta di @David e crea il tuo scambio sull'archiviazione effimera per evitare di pagare i costi EBS.

Maggiori informazioni: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html c'è una tabella che mostra la quantità di memoria effimera che ottieni per ogni tipo di istanza.


1
Posso confermare che questa è generalmente una cattiva idea. Se hai un processo che va male (ho avuto un server nodo che lo fa, e una configurazione Python / Sedano), dovrai sostenere un sacco di addebiti quando legge e scrive sul tuo blocco EBS per tutta la settimana senza che tu sappia: -)
ZachM

3
Secondo aws.amazon.com/ebs/pricing , IO è incluso in tutti i volumi EBS ad eccezione di SSD IPOS con provisioning (io1). Sei solo per GB. Questo potrebbe essere stato un recente cambiamento nel modello dei prezzi, ma significa che anche se EBS è molto più lento del vero archivio di istanze, non ci sono costi aggiuntivi per letture e scritture.
bobsoap,

@bobsoap Ti andrebbe di chiarirlo? Ho controllato il tuo link e l'ho trovato 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.. Il che sembra che AWS addebiterà le operazioni di lettura e scrittura.
Valter Silva,

2
@ValterHenrique Il testo che hai citato si applica solo ai volumi con IOPS con provisioning, ma puoi scegliere tra diversi tipi di volume. Se si utilizza un volume "normale" senza IOPS con provisioning (come il tipo di volume SSD per scopi generici chiamato "gp2"), le operazioni di lettura e scrittura non comportano alcun costo aggiuntivo. Forse un link migliore da confrontare: aws.amazon.com/ebs/details
bobsoap

8

È possibile creare lo spazio di swap utilizzando i seguenti passaggi Qui stiamo creando swap a /home/

  1. dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
    Qui conta è il conteggio dei kilobyte dello spazio di swap

  2. mkswap /home/swapfile1

  3. vi /etc/fstab
    fare l'ingresso:
    /home/swapfile1 swap swap defaults 0 0

  4. correre:
    swapon -a


4

Possiamo aggiungere spazio di swap in qualsiasi server

crea un file usando il comando dd

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

bs è a blocchi e conteggio si riferisce alla dimensione in MB o GB

possiamo usare viceversa

Dopo la creazione modificare l'autorizzazione del file:

 #chmod 600 /swapfile 

Quindi effettua il swap del file:

 #mkswap /swapfile 

Quindi abilitare il file di scambio con il comando swapon:

 #swapon  /swapfile 

Verifica con comando gratuito se lo swap è abilitato o meno:

 #free -h
 #swapon -s

3

Usando la risposta di David Instance Storage inizialmente ha funzionato per me (su un m5d.2xlarge) tuttavia, dopo aver fermato l'istanza EC2 e averla riaccesa, non sono stato in grado di collegarmi di nuovo all'istanza.

I registri dell'istanza riportavano: "Sei in modalità di emergenza. Dopo aver effettuato l'accesso, digita" journalctl -xb "per visualizzare i registri di sistema," riavvio di systemctl "per riavviare," systemctl default "o" esci "per avviare in modalità predefinita. Premi Invio per manutenzione"

Ho invece seguito le istruzioni AWS in questo link e tutto ha funzionato perfettamente, anche dopo aver spento e riacceso l'istanza.

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

Prova lo spazio http://pqxx.org/development/swapspace/

Molte distribuzioni lo hanno confezionato.

Su EC2 potresti voler cambiare "swappath" in disco / mnt o high-iops.


1
Dai documenti: "Nella sua forma attuale, Swapspace non è probabilmente una buona scelta per i sistemi che devono rimanere reattivi in ​​ogni momento;"
Dave Albert,

-3

È possibile utilizzare il seguente script per aggiungere lo scambio su Amazon Linux.

https://github.com/chetankapoor/swap

Scarica lo script usando wget:

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

Quindi eseguire lo script con il seguente formato:

sh swap.sh 2G

Per un tutorial completo puoi visitare:

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


Non vedo ciò che contribuisce a questa risposta, oltre ad essere solo uno shellscript che sostanzialmente fa ciò che la risposta accettata ha già spiegato.
Nils Werner,

Ho appena creato uno script di shell che fa risparmiare tempo, quindi ci saranno 2 passaggi per creare lo scambio invece di eseguire 5 comandi e se lo scambio esiste già, mostrerà che lo scambio è già lì.
Chetan Kapoor,

3
Esattamente. Uno shellscript che dovrei eseguire come root. Realizzato da qualcuno, da qualche parte, che potrebbe cambiare o scomparire senza preavviso. Tutto per salvare 4-5 righe di comando che sono state pubblicate e accettate 5 anni fa.
Nils Werner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.