Projekt: Testy propustnosti sítě – LXC HTTP + Docker NFS

Předmět: Virtualizace 1 | Vypracoval: Maxmilián Babič

1. Úvod a cíl projektu

Cílem tohoto projektu bylo navrhnout a otestovat infrastrukturu založenou na dvou typech systémových kontejnerů – LXC/LXD a Docker – běžících na jednom hostitelském serveru s Ubuntu 24.04 LTS. Projekt zkoumá propustnost sítě mezi kontejnery ve dvou scénářích:

Součástí projektu jsou také testy výkonu CPU a paměti pomocí nástroje sysbench, porovnání výkonu hostitelského systému a kontejneru, a popis možností škálování.

2. Architektura řešení

Celá infrastruktura běží na jednom hostitelském serveru. Kontejnery komunikují přes interní síťový bridge lxdbr0 na IPv6 síti fd42:909c:d903:ecc7::/64.

Scénář A – rozdělené služby

Scénář B – vše na jednom kontejneru

Síťové propojení: Komunikace probíhá přes IPv6 na interním bridge lxdbr0. Host má adresu fd42:909c:d903:ecc7::1, LXC kontejner fd42:909c:d903:ecc7:216:3eff:feee:7a19. Docker NFS server naslouchá na portu 2049 hostu.
Běžící kontejnery

Výpis běžících kontejnerů – LXC (http-server) a Docker (nfs-server).

3. Parametry prostředí

ParametrHodnota
Hostitelský OSUbuntu 24.04.2 LTS (Noble Numbat)
Kernel6.8.0-100-generic
CPU2 vCPU
RAM (host)1463 MB celkem
Disk8.1 GB (LVM)
LXD verze5.21.4 LTS (snap)
Docker verze29.1.3
LXC kontejner – limit paměti1 GB
LXC kontejner – využití paměti~174 MB (při provozu Apache)
Docker kontejner – využití paměti~28 MB (NFS server)

4. Postup realizace

A. Instalace LXD a Docker na hostu

sudo apt install -y docker.io
sudo snap install lxd
sudo lxd init --minimal

B. Vytvoření LXC kontejneru s HTTP serverem

# Vytvoření kontejneru s paměťovým limitem 1 GB
lxc launch ubuntu:24.04 http-server -c limits.memory=1GB

# Instalace Apache uvnitř kontejneru
lxc exec http-server -- bash -c "apt update && apt install -y apache2"

# Povolení privilegovaného režimu pro NFS mount
lxc config set http-server security.privileged true
lxc config set http-server raw.apparmor "mount fstype=nfs*, mount fstype=rpc_pipefs,"
lxc restart http-server

# Override systemd služby Apache
lxc exec http-server -- bash -c "mkdir -p /etc/systemd/system/apache2.service.d && \
cat > /etc/systemd/system/apache2.service.d/override.conf << 'EOF'
[Service]
PrivateTmp=false
ProtectSystem=false
ProtectHome=false
NoNewPrivileges=false
EOF"
lxc exec http-server -- systemctl daemon-reload
lxc exec http-server -- systemctl start apache2

C. Spuštění Docker NFS serveru

# Příprava sdíleného adresáře
mkdir -p ~/nfs-data
echo "Hello from NFS Docker container" > ~/nfs-data/index.html
dd if=/dev/urandom of=~/nfs-data/testfile.bin bs=1M count=10

# Spuštění NFS kontejneru
docker run -d --name nfs-server \
  --privileged \
  -v ~/nfs-data:/nfs-share \
  -e SHARED_DIRECTORY=/nfs-share \
  -e PERMITTED="*" \
  -p 2049:2049 \
  itsthenetwork/nfs-server-alpine:latest

D. Propojení – NFS mount do LXC kontejneru

# Instalace NFS klienta
lxc exec http-server -- apt install -y nfs-common

# Mount NFS share přes IPv6
lxc exec http-server -- mount -t nfs4 -o nolock,vers=4.0 \
  [fd42:909c:d903:ecc7::1]:/ /var/www/html

# Ověření
curl -6 http://[fd42:909c:d903:ecc7:216:3eff:feee:7a19]/
# Výstup: Hello from NFS Docker container

5. Testy propustnosti a výkonu

A. Test propustnosti sítě – iperf3

Měření propustnosti síťového spojení mezi hostitelským systémem a LXC kontejnerem přes interní bridge lxdbr0.

# Server v kontejneru
lxc exec http-server -- iperf3 -s -D

# Klient na hostu
iperf3 -c fd42:909c:d903:ecc7:216:3eff:feee:7a19 -t 10
Výstup iperf3 testu

Výstup testu propustnosti iperf3 – průměrná propustnost 25.8 Gbits/sec.

MetrikaHodnota
Průměrná propustnost25.8 Gbits/sec
Celkový přenos (10s)30.0 GBytes
Retransmise0
Vysoká propustnost (25.8 Gbps) je očekávaná, protože oba endpointy běží na stejném hostu a komunikují přes virtuální bridge – data neprocházejí fyzickým síťovým rozhraním.

B. HTTP benchmark – Apache Bench

Porovnání výkonu HTTP serveru při servírování 10 MB souboru ve dvou scénářích: soubory na vzdáleném NFS úložišti vs. lokální úložiště.

# Test (100 požadavků, 10 souběžně)
ab -n 100 -c 10 http://[fd42:909c:d903:ecc7:216:3eff:feee:7a19]/testfile.bin
Apache Bench – NFS

Scénář A – HTTP benchmark se soubory na NFS úložišti.

Apache Bench – lokální

Scénář B – HTTP benchmark se soubory na lokálním úložišti.

MetrikaScénář A – NFSScénář B – Lokální
Požadavky za sekundu130.94 req/s132.94 req/s
Přenosová rychlost1,340,837 KB/s1,361,339 KB/s
Průměrný čas požadavku76.4 ms75.2 ms
Medián (50 %)73 ms74 ms
Nejdelší požadavek93 ms83 ms
Neúspěšné požadavky00
Závěr: Rozdíl mezi NFS a lokálním úložištěm je v tomto prostředí minimální (~1.5 %). To je způsobeno tím, že NFS server běží na stejném hostu a komunikace probíhá přes loopback. V reálném nasazení přes fyzickou síť by rozdíl byl výrazně větší kvůli síťové latenci.

C. Testy CPU – sysbench

# CPU test (2 vlákna, prime 10000)
sysbench cpu --threads=2 run

# CPU test (2 vlákna, prime 20000)
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=2 run
Host CPU test prime 10000

Host – CPU test (prime 10000, 2 vlákna): 1859.56 events/s.

Host CPU test prime 20000

Host – CPU test (prime 20000, 2 vlákna): 714.89 events/s.

LXC CPU test prime 10000

LXC kontejner – CPU test (prime 10000, 2 vlákna): 1843.16 events/s.

LXC CPU test prime 20000

LXC kontejner – CPU test (prime 20000, 2 vlákna): 712.11 events/s.

TestHostLXC kontejnerRozdíl
CPU events/s (prime 10000)1859.561843.16−0.9 %
CPU events/s (prime 20000)714.89712.11−0.4 %
Latence avg (prime 10000)1.07 ms1.08 ms+0.9 %
Latence avg (prime 20000)2.80 ms2.81 ms+0.4 %

D. Testy paměti – sysbench

# Paměťový test (1M bloky, 100 GB celkem)
sysbench --test=memory --memory-block-size=1M --memory-total-size=100G --num-threads=1 run

# Paměťový test (1K bloky, 100 GB celkem)
sysbench --test=memory --memory-block-size=1K --memory-total-size=100G --num-threads=1 run

# Paměťový test (4 vlákna)
sysbench --test=memory --num-threads=4 run
Host Memory test 1M

Host – paměťový test (1M bloky): 15,394 MiB/s.

Host Memory test 1K

Host – paměťový test (1K bloky): 4,113 MiB/s.

Host Memory test 4 threads

Host – paměťový test (4 vlákna): 3,815 MiB/s.

LXC Memory test 1M

LXC kontejner – paměťový test (1M bloky): 15,582 MiB/s.

LXC Memory test 1K

LXC kontejner – paměťový test (1K bloky): 4,103 MiB/s.

LXC Memory test 4 threads

LXC kontejner – paměťový test (4 vlákna): 3,960 MiB/s.

TestHostLXC kontejnerRozdíl
Memory 1M blok (MiB/s)15,39415,582+1.2 %
Memory 1K blok (MiB/s)4,1134,103−0.2 %
Memory 4 vlákna (MiB/s)3,8153,960+3.8 %
Závěr: Výkon CPU i paměti je v LXC kontejneru prakticky identický s hostem. Rozdíly se pohybují v rozmezí ±1–4 %, což je v rámci běžné odchylky měření. LXC kontejnery sdílejí kernel s hostem a nepřidávají virtualizační overhead – na rozdíl od plné virtualizace (KVM, VMware), kde by rozdíl byl výraznější.

6. Sledování využití paměti

Dle zadání byl LXC kontejner omezen na maximálně 1 GB paměti.

# Nastavený limit
lxc config get http-server limits.memory   # 1GB

# Využití paměti v kontejneru
lxc exec http-server -- free -m            # total 953, used 30

# Využití dle LXD
lxc info http-server | grep -i memory      # 174.27MiB

# Docker kontejner
docker stats nfs-server --no-stream        # 27.87MiB
Sledování paměti

Sledování využití paměti – LXC kontejner (limit 1 GB, využití 174 MB) a Docker NFS server (28 MB).

KontejnerLimitAktuální využití
LXC http-server1 GB174 MB
Docker nfs-serverbez limitu (host max)28 MB

7. Možnosti škálování výkonu

LXC/LXD kontejnery

LXD umožňuje dynamicky měnit přidělené prostředky za běhu kontejneru:

# Změna limitu paměti
lxc config set http-server limits.memory 2GB

# Omezení počtu CPU jader
lxc config set http-server limits.cpu 4

# CPU priorita
lxc config set http-server limits.cpu.priority 10

Docker kontejnery

Docker podporuje dynamický update prostředků:

# Omezení paměti
docker update --memory 1g --memory-swap 1g nfs-server

# Omezení CPU
docker update --cpus 2 nfs-server

Horizontální škálování

Pro zvýšení propustnosti v produkčním prostředí je možné nasadit více instancí HTTP serveru za load balancer a sdílet NFS úložiště. Docker Compose nebo Kubernetes umožňují automatické škálování počtu replik služby na základě zátěže.

8. Závěr

Projekt úspěšně demonstroval propojení dvou typů systémových kontejnerů (LXC/LXD a Docker) s využitím síťového protokolu NFS pro sdílení souborů. Hlavní zjištění:

Celkový závěr: LXC kontejnery poskytují výkon velmi blízký nativnímu hostu, zatímco Docker je ideální pro snadné nasazení izolovaných služeb. Kombinace obou technologií umožňuje flexibilní a výkonnou infrastrukturu. Skutečný dopad NFS na propustnost by se projevil až při oddělení služeb na fyzicky rozdílné servery.