mmap() failed: [12] Cannot allocate memory

Deze error komt voor op servers en Virtual Machines wanneer er een tekort aan geheugen is om een script uit te voeren. mmap() failed: [12] Cannot allocate memory is een bekende melding bij het installeren of updaten van dependencies met Composer. Verder kunnen deze meldingen ook voorkomen bij reguliere command line en webserver scripts.

Het probleem in het kort:

mmap() failed: [12] Cannot allocate memory wil zeggen: de webserver heeft te weinig RAM geheugen vrij wat het script kan gebruiken.

De oplossing:

Dit kan op drie manieren "opgelost" worden. 

De echte oplossingen van het probleem

  1. Je scripts optimaliseren (geheugengebruik verminderen, variabelen unsetten wanneer ze niet nodig zijn)
  2. Enerzijds is het vergroten van het RAM geheugen een mogelijke oplossing. Voor een Virtual Machine betekent dit dat deze opnieuw opgezet moet worden met een grotere hoeveelheid geheugen. Voor web servers betekent dit mogelijk een upgrade van het hostingpakket.

De kosteloze "oplossing" van het probleem

Door middel van het aanmaken van een swap partitie kan een deel van de harde schijf als "extra RAM" dienen. Hou wel in de gaten dat je hiermee je harde schijf ruimte verkleint en dat dit gedeelte van het "RAM" langzamer is dan je daadwerkelijke RAM geheugen en je script er potentieel dus trager door werkt.

Aanmaken swap partitie:

Note vooraf: je hebt root rechten nodig om een swapfile aan te maken

Open de command line van de server of VM.

Check de vrije schijfruimte van de server. Als er te weinig ruimte is kunnen we immers niet eens een swap file aanmaken:

df -h

De harde schijf zit (doorgaans) onder /dev/vda1. Om een beetje nut te hebben zullen we in dit voorbeeld een swapfile van 2 GB aanmaken, dus er zou minimaal 2+ GB beschikbaar moeten zijn op de harde schijf om door te kunnen gaan.

Check of er al iets aan swap bestaat:

free -h

Als er geen swap geheugen geconfigureerd is zul je waarschijnlijk allemaal 0 zien staan in de 'Swap:' regel

Aanmaken van een swapfile van 2 GB (pas de waarde naar inzicht aan):

sudo fallocate -l 2G /swapfile

Check of de swapfile is aangemaakt met

ls -lh /swapfile

Je zou een bestand moeten zien ter grootte van wat je bij je commando hebt opgegeven (in ons voorbeeld 2 GB)

We moeten nu het swap nog aanzetten

Maak het swap alleen toegankelijk voor het root account:

sudo chmod 600 /swapfile

Markeer de swapfile als "swap" mogelijkheid voor het OS:

sudo mkswap /swapfile

je zou output moeten krijgen zoals "Setting up swapspace version 1, size = 2 GiB (2147479552 bytes) no label, UUID=29dd1d17-f150-4644-a987-7d82df02a19d"

Zet het swap "aan":

sudo swapon /swapfile

Run nogmaals:

free -h

Je zou nu in de 'Swap: ' regel wel een size moeten zien ter grootte van wat je eerder hebt opgegeven

Het swap kan nu worden gebruikt als "RAM" geheugen.

Maar! Bij een herstart is dit swap geheugen weer weg. Zeker bij Virtuele Machines kan dit vrij gemakkelijk gebeuren.
Om dit te voorkomen kan de swapfile aan fstab worden toegevoegd. Je kunt /etc/fstab met een editor (vi / vim / nano) bewerken, maar het is makkelijker om het middels een commando te doen:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab


Be smart

Is het een eenmalige actie? Dan kan een swap partitie handiger zijn. Is het een herhalende actie? Kijk dan met welke grootte swap partitie het werkt en upgrade daarna het RAM geheugen met minimaal die hoeveelheid om het probleem echt te verhelpen.