Proxmox 9 – zarządzanie przydziałem vCPU oraz pamięcią RAM i SWAP

Ustawienia w zakładce Processors maszyny wirtualnej

  • NUMA: na moim Ryzenie nie ma obsługi. Najczęściej nie ma sensu włączać dla małych/średnich VM. Zostaw OFF.
  • Topologia: wybieraj 1 socket. Czyli 1 socket / 4 cores zamiast 2 socket / 2 cores.
  • Type: host

Jak sprawdzić, czy host w ogóle ma NUMA > 1 node?

lscpu | egrep -i 'NUMA|Socket|Thread|Core|CPU\(s\)'
numactl -H 2>/dev/null || echo "Brak numactl albo 1 node NUMA"

Po co w ogóle ktoś robi 2 socket w VM?

  • licencjonowanie (Windows Server / stare zasady per-socket),
  • jakieś bardzo specyficzne zachowania schedulerów/softu,
  • testowanie topologii.

W normalnym życiu (Linux VM, usługi, k8s, docker, gitlab, jenkins):
2 socket po 2 cores nie daje przewagi nad 1 socket 4 cores, a czasem bywa gorsze (scheduler, wykrywanie topologii, software myśli że to “wielo-CPU” zamiast “wielo-rdzeniowe”).

cpu: host oznacza:

  • VM dostaje dokładny model CPU hosta
  • przekazywane są realne instrukcje (SSE4, AVX, AVX2, AES, itp.)
  • brak sztucznego ograniczania feature setu

NUMA: na Twoim Ryzenie najczęściej nie ma sensu włączać dla małych/średnich VM. Zostaw OFF.

Topologia: wybieraj 1 socket. Czyli 1 socket / 4 cores zamiast 2 socket / 2 cores.

Określanie liczby potrzebnych vCPU dla maszyny wirtualnej

Zweryfikuj Load i steal time w środku VM

uptime
top
vmstat 1

Obciążenie CPU w Proxmox (per VM). Jeśli VM regularnie dobija do wysokiego CPU (np. >70% przy 2 vCPU) → warto dodać.

pvesh get /cluster/resources --type vm | egrep 'qemu/|cpu'

│ id        │ type │ cgroup-mode │ content │    cpu │       disk │   diskread │  diskwrite │ hastate │ level │ lock │ maxcpu │    maxdisk │     maxmem │        mem │    memhost │ name            │      netin │     netout │     network │ network-type │ node │ plugintype │ pool │ protocol │ sdn │ status  │ storage │ tags         │ template │     uptime │ vmid │ zone-type │
│ qemu/1021 │ qemu │             │         │  0.00% │     0.00 B │     0.00 B │     0.00 B │         │       │      │      4 │  16.00 GiB │   2.00 GiB │     0.00 B │     0.00 B │ pbs             │     0.00 B │     0.00 B │             │              │ pve  │            │      │          │     │ stopped │         │ debian_11    │ 0        │         0s │ 1021 │           │
│ qemu/1022 │ qemu │             │         │  0.38% │     0.00 B │ 220.37 MiB │  15.86 MiB │         │       │      │      2 │  16.00 GiB │   1.00 GiB │ 308.52 MiB │ 344.51 MiB │ remote          │  77.42 KiB │   3.90 KiB │             │              │ pve  │            │      │          │     │ running │         │ ubuntu_22.04 │ 0        │    40m 31s │ 1022 │           │
│ qemu/1025 │ qemu │             │         │  3.79% │     0.00 B │   1.81 GiB │ 461.10 MiB │         │       │      │      2 │  64.00 GiB │  16.00 GiB │   5.54 GiB │   5.28 GiB │ docker          │ 481.10 MiB │ 537.85 MiB │     

Ustawienia swap

Kompresony swap 8GB w pamięci ma priorytet 100 a z pliku 8 GB /var/swapfile ma priorytet 10.

apt update && apt install -y zram-tools
systemctl restart zramswap
swapon --show
# Compression algorithm selection
# speed: lz4 > zstd
# compression: zstd > lz4
# This is not inclusive of all that is available in latest kernels
# See /sys/block/zram0/comp_algorithm (when zram module is loaded) to see
# what is currently set and available for your kernel[1]
# [1]  https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html#select-compression-algorithm
ALGO=zstd

# Specifies the amount of RAM that should be used for zram
# based on a percentage the total amount of available memory
# This takes precedence and overrides SIZE below
#PERCENT=50

# Specifies a static amount of RAM that should be used for
# the ZRAM devices, this is in MiB
SIZE=8192

# Specifies the priority for the swap devices, see swapon(2)
# for more details. Higher number = higher priority
# This should probably be higher than hdd/ssd swaps.
PRIORITY=100
fallocate -l 8G /var/swapfile
chmod 600 /var/swapfile
mkswap /var/swapfile
swapon /var/swapfile
swapon -p 10 /var/swapfile
grep -q '^/var/swapfile ' /etc/fstab || echo '/var/swapfile none swap sw,pri=10 0 0' >> /etc/fstab

Weryfikacj czy oba swapy są włączone

root@pve:/etc/pve/nodes/pve/qemu-server# swapon --output-all
NAME          TYPE      SIZE USED PRIO UUID                                 LABEL
/dev/zram0    partition   8G  36K  100 4afdb274-28b1-465b-b40c-61ae2ae8a2cd
/var/swapfile file        8G   0B   10 34508111-6d5e-40f5-93d0-8609b6e1b7b7

Jak szybko ocenić, czy dobrałeś dobrze?

free -h
vmstat 1
sar -W 1 10   # jeśli masz sysstat

Linux 6.17.4-2-pve (pve)        02/23/2026      _x86_64_        (24 CPU)

01:49:35 PM  pswpin/s pswpout/s
01:49:36 PM      0.00      0.00
01:49:37 PM      0.00      0.00
...

# Statystyki zram
cat /sys/block/zram0/mm_stat
   40960     1986    94208        0    94208        0        0        0        0

Jeśli widzisz:

  • stale rosnący si/so w vmstat (swap in/out),
  • i spadek responsywności,
    to swap jest używany „na poważnie” i trzeba raczej:
  • zmniejszyć presję RAM (limity, ARC, ballooning),
  • albo dołożyć RAM,
  • a nie tylko powiększać swap.

Przydział pamięci maszynom wirtualnym

  • obniż “MAX memory” tam gdzie jest ewidentny zapas
  • włącz ballooning (dynamiczny RAM) dla VM (QEMU)

memory = MAX, ile VM może dostać w piku (Twoja górka)

balloon = MIN, ile VM ma mieć gwarantowane nawet gdy host jest pod presją (Twoja “podłoga”)

# Aktualne zużycie RAM per VM/CT (żeby zobaczyć kto naprawdę je)
pvesh get /cluster/resources --type vm --output-format=json-pretty
# Dla CT:
pvesh get /nodes/$(hostname)/lxc --output-format=json-pretty

Poniższe polecenie wypisze zawartość wszystkich configów VM (qemu) i CT (lxc) z czytelnymi nagłówkami:

for d in /etc/pve/nodes/$(hostname)/qemu-server /etc/pve/nodes/$(hostname)/lxc; do \
  echo -e "\n===== $(basename "$d") ====="; \
  for f in "$d"/*.conf; do \
    [ -e "$f" ] || continue; \
    echo -e "\n### $(basename "$f") ###"; \
    sed 's/\r$//' "$f"; \
  done; \
done

Dla oszczędności pamięci RAM należy szczególnie w maszynach vm z systemem Linux usatwiań balloning, inaczej Proxmox/QEMU rezerwuje hostowi RAM “na sztywno” do wysokości przydziału, nawet jeśli w środku gość realnie używa mniej. Przykład:

# dla vm
qm set 1021 --memory 8192 --balloon 4096

# dla kontenera
pct set 2030 -memory 4096 -swap 1024

Małe 1–2 GB VM (dns, nut, proxy, icinga, pbs, webserver)

MAX: zostaw jak jest

MIN: 50–75% MAX

1 GB → MIN 512–768

2 GB → MIN 1024–1536

Średnie 4 GB VM (bastion, database-1, n8n, haos)

MIN zwykle 2048–3072

jeśli ważna stabilność: 3072

jeśli ma być “bardziej elastycznie”: 2048

Duże 8–16 GB VM (gitlab, docker, jenkins, k8s)

MIN raczej 60–90%

docker/jenkins: MIN 4096–8192 (zależnie od roli)

gitlab (8GB): MIN 6144

k8s: MIN wysoko (często 70–90%)