Introducció

Els contenidors proporciones contextos que aïllen els processos, en cap cas un sistema de virtualització.

Si tu crees una màquina virtual amb 2GB de RAM, els processos que s'executen en la màquina virtual només disposen de com a màximm 2GB de RAM de la màquina real encara que la màquina real tingui 32 GB de RAM.

En canvi, si tu executes un contenidor en una màquina amb 32GB de RAM, el contenidor disposa de tota la RAM com qualsevol altre procés.

A Xarxa i Emmagatzematge hem vist com poden limitar un contenidor, però hi ha moltes altres limitacions que permeten aïllar més un contenidor com veurem a continuació.

Memòria

Al crear un contenidor podem limitar la memòria que pot utilitzar amb el flag -m o --memory.

Aquest flag té un valor enter seguit per un sufix b, k, m o g per indicar bytes, kilobytes, megabytes o gigabytes.

El valor mínim de la memoria ha de ser 6m (6 megabytes):

$ docker run --rm -d -m 1m --name web -p 80:80 httpd
docker: Error response from daemon: Minimum memory limit allowed is 6MB.

Anem a veure si un apache pot funcionar només amb 7m (7 megabytes):

$ docker run --rm -d -m 7m --name web -p 80:80 httpd
$ curl localhost
<html><body><h1>It works!</h1></body></html>

Sembla que de moment funciona tal com mostra stats:

$ docker stats web --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O         BLOCK I/O   PIDS
4c77f01a428a   web       0.03%     4.836MiB / 7MiB     69.08%    1.79kB / 626B   0B / 0B     109

Instal.la el paquet apache2-utils per poder executar ApacheBenchmark

$ sudo apt install -y apache2-utils

Ja podem fer un benchmark 😆!

Primer monitoritzem el contenidor web en mode stream (és el mode per defecte):

$ docker stats web --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O         BLOCK I/O   PIDS
4c77f01a428a   web       0.03%     4.836MiB / 7MiB     69.08%    1.79kB / 626B   0B / 0B     109

Obre un altre terminal i dona feina al servidor durant un màxim de 30 segons amb 1000 peticions concurrents:

$ ab -kc 1000 -t 30 http://localhost
...

Torna a l'altre terminal on pots veure que encara que la CPU % va al màxim, la memòria està limitada:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O   PIDS
4c77f01a428a   web       94.36%    6.711MiB / 7MiB     95.87%    10.5MB / 21.2MB   0B / 0B     142

Torna a l'altre terminal i quan acabi el test pots veure que apache a tingut alguns problemes ja que de les 1000 peticions concurrents no ha respós a 390.

$ ab -kc 1000 -t 30 http://localhost

Concurrency Level:      1000
Time taken for tests:   30.507 seconds
Complete requests:      749
Failed requests:        390
   (Connect: 0, Receive: 0, Length: 390, Exceptions: 0)
Keep-Alive requests:    359
Total transferred:      116922 bytes
HTML transferred:       16155 bytes
Requests per second:    24.55 [#/sec] (mean)
Time per request:       40730.849 [ms] (mean)
Time per request:       40.731 [ms] (mean, across all concurrent requests)
Transfer rate:          3.74 [Kbytes/sec] received

Pot ser per un problema de memòria 🙄 ... ? 🤣

Anem a veure ara sense límits 🚀

Crea un nou contenidor web_unlimited:

$ docker run --rm -d --name web_unlimited -p 81:80 httpd

$ docker stats web_unlimited
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O   PIDS
dd37fe9355c2   web_unlimited   0.01%     22.32MiB / 7.698GiB   0.28%     1.02kB / 0B   0B / 0B     82

Pots veure que el límit de memòria és de 7.698GiB, té tota la capacitat de la màquina per ell si vol.

Let's go!

$ ab -kc 1000 -t 30 http://localhost:81/

Concurrency Level:      1000
Time taken for tests:   4.881 seconds
Complete requests:      50000
Failed requests:        14945
   (Connect: 0, Receive: 0, Length: 14945, Exceptions: 0)
Keep-Alive requests:    35055
Total transferred:      11408269 bytes
HTML transferred:       1577475 bytes
Requests per second:    10243.67 [#/sec] (mean)
Time per request:       97.621 [ms] (mean)
Time per request:       0.098 [ms] (mean, across all concurrent requests)
Transfer rate:          2282.47 [Kbytes/sec] received

El servidor web_unlimited a pogut respondre a totes les peticions en només 5 segons.

Potser serà que tenia més memòria disponible ...

CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
dd37fe9355c2   web_unlimited   0.01%     72.79MiB / 7.698GiB   0.92%     13.4MB / 19.1MB   0B / 0B     271

Pots veure que el MEM USAGE és de 72.79MiB mentres que el contenidor web al tenir limitada la memòria el seu MEM USAGE era de 6.711MiB.

CPU

Igual que passa amb la memòria, en els sistemes operatius la CPU és un recurs compartit per tots els processos que s'estan executant

Referències