Większość z nas szuka łatwych do wdrożenia optymalizacji, które przynoszą szybkie i korzystne rezultaty. Poniżej znajduje się zestaw optymalizacji, które można wdrożyć w weekendy i które przyniosą natychmiastowe korzyści użytkownikom Proxmox w domowych laboratoriach. Mogą one poprawić wydajność, stabilność, a nawet wydłużyć żywotność sprzętu.
Zanim zaczniesz, mała przestroga
Przed wprowadzeniem jakichkolwiek poważniejszych zmian, pamiętaj o wykonaniu co najmniej następujących czynności:
- Utwórz kopię zapasową pliku konfiguracyjnego przed jego edycją.
- Zastosuj zmiany najpierw na jednym węźle, jeśli jest to klaster.
- Uruchom ponownie system tylko podczas przerwy konserwacyjnej.
- Po każdej zmianie w pliku sysctl sprawdź, czy plik został faktycznie załadowany.
Oto lista poleceń „punktów kontrolnych”, które pomogą Ci zapisać kilka ważnych ustawień konfiguracyjnych.
# Snapshot aktualnego stanu konfiguracji (backup z datą)
cp -a /etc/sysctl.d /etc/sysctl.d.bak.$(date +%F)
cp -a /etc/apt/apt.conf.d /etc/apt/apt.conf.d.bak.$(date +%F)
cp -a /etc/logrotate.conf /etc/logrotate.conf.bak.$(date +%F)
# Wyświetlenie ostatnich 50 linii z aktywnych ustawień sysctl
sysctl --system | tail -n 50

Pomiń pobieranie dodatkowych języków APT
To ulepszenie przyspiesza aktualizacje i oszczędza trochę miejsca na dysku. Na serwerach zazwyczaj nie są potrzebne indeksy tłumaczeń dla wielu różnych języków.
echo 'Acquire::Languages "none";' | tee /etc/apt/apt.conf.d/99-disable-translations
Sprawdź, czy zostało to zastosowane:
cat /etc/apt/apt.conf.d/99-disable-translations

Wymuś użycie APT w IPv4 (gdy protokół IPv6 powoduje powolne lub niestabilne aktualizacje)
Powiedzmy sobie szczerze, większość z nas nie ma w domowych laboratoriach implementacji protokołu IPv6. Jeśli konfiguracja dostawcy usług internetowych, routera lub serwera DNS sprawia, że IPv6 jest zawodne, może to powodować problemy lub spowalniać działanie. Możemy jednak temu zaradzić, wymuszając IPv4, co natychmiast przywróci spójność aktualizacji.
echo 'Acquire::ForceIPv4 "true";' | tee /etc/apt/apt.conf.d/99force-ipv4
Sprawdź, czy zostało zastosowane:
cat /etc/apt/apt.conf.d/99force-ipv4

Aby cofnąć:
sudo rm -f /etc/apt/apt.conf.d/99force-ipv4
Skonfiguruj automatyczne ponowne uruchomienie kernel panic
Kernel panic zdarza się raczej rzadko. Ale zdarza się. Host z kernel panic i utknięciem w nim to jedna z najgorszych rzeczy, jakie mogą się zdarzyć, zwłaszcza gdy jesteś poza domem i nie możesz zareagować.
To pozwala skonfigurować go tak, aby automatycznie się restartował:
echo "kernel.panic = 10" | tee /etc/sysctl.d/99-kernelpanic.conf
echo "kernel.panic_on_oops = 1" | tee -a /etc/sysctl.d/99-kernelpanic.conf
sysctl -p /etc/sysctl.d/99-kernelpanic.conf

Sprawdź, czy zostało to zastosowane:
sysctl kernel.panic kernel.panic_on_oops
Zwiększ limity systemowe
To praktyczne ulepszenie dla hostów obsługujących wiele kontenerów, narzędzi monitorujących lub innych urządzeń, które utrzymują wiele otwartych plików. Może to również pomóc uniknąć nietypowych awarii w skrajnych przypadkach.
echo "fs.inotify.max_user_watches = 1048576" | tee /etc/sysctl.d/99-maxwatches.conf
echo "* soft nofile 1048576" | tee /etc/security/limits.d/99-limits.conf
sysctl --system
fs.inotify.max_user_watches – maksymalna liczba watchy inotify na użytkownika.
Zapobiega błędom typu:
ENOSPC: System limit for number of file watchers reached
- Bardzo często wymagane przez:
- Docker / Kubernetes
- Node.js / webpack / Vite
- VS Code
- Elasticsearch
- Zabbix / Prometheus
- Systemy CI/CD
echo „* soft nofile 1048576” – ustawia miękki limit otwartych plików:
Wjaśnienie składowych polecenia:
*– dla wszystkich użytkownikówsoft– miękki limit (może być podniesiony dohard)nofile– maksymalna liczba otwartych deskryptorów plików1048576– do 1 miliona plików/socketów
Zapobiega błędom:
Too many open files
- Krytyczne dla:
- serwerów aplikacyjnych
- baz danych
- proxy (nginx, HAProxy)
- systemów monitoringu
- dużych środowisk produkcyjnych

Weryfikacja dodania konfiguracji:
sysctl fs.inotify.max_user_watches
ulimit -n
Popraw generowanie entropii za pomocą haveged
Serwery typu headless oraz środowiska zwirtualizowane bardzo często zmagają się z problemem niskiej entropii. Choć brzmi to dość enigmatycznie, w praktyce jest to jeden z częstszych powodów dziwnych opóźnień i „zawieszeń” w systemach serwerowych.
W systemach Linux, takich jak Proxmox VE, entropia oznacza ilość dostępnej losowości, czyli zdolność systemu do generowania nieprzewidywalnych danych. Jest ona wykorzystywana zawsze wtedy, gdy system musi stworzyć coś, co z definicji nie może być przewidywalne: klucze szyfrujące, certyfikaty TLS, klucze SSH, bezpieczne połączenia sieciowe, tokeny sesji czy inne elementy kryptograficzne. Bez odpowiedniej ilości entropii system nie jest w stanie wykonać tych operacji w bezpieczny sposób.
System operacyjny stale próbuje uzupełniać pulę entropii, obserwując różnego rodzaju nieprzewidywalne zdarzenia. Na typowym komputerze desktopowym są to między innymi ruchy myszy, naciśnięcia klawiszy, opóźnienia operacji dyskowych czy przerwania sprzętowe. Problem pojawia się wtedy, gdy tych zdarzeń praktycznie nie ma.
Właśnie dlatego serwery headless oraz maszyny wirtualne są szczególnie narażone na niski poziom entropii. Nie ma tam klawiatury ani myszy, interakcja użytkownika jest minimalna, a sprzęt często działa w bardzo powtarzalny sposób. W efekcie pula entropii szybko się wyczerpuje, a system zaczyna czekać na nowe źródła losowości. Objawia się to długim generowaniem kluczy SSH, opóźnionym startem usług TLS, wolnym uruchamianiem maszyn wirtualnych lub pozornie losowymi lagami przy operacjach kryptograficznych.
Jednym z najczęściej stosowanych i najszybszych rozwiązań tego problemu jest instalacja haveged. Jest to demon, który generuje dodatkową entropię, wykorzystując niestabilności czasowe i zachowanie procesora. Dzięki temu system nie musi blokować się w oczekiwaniu na losowość pochodzącą z fizycznych zdarzeń, których na serwerze headless po prostu nie ma. W praktyce haveged bardzo często „odblokowuje” system i eliminuje problemy z długim oczekiwaniem na operacje kryptograficzne.
Zainstalowanie haveged to klasyczne rozwiązanie „zapobiegające zawieszaniu się”:
apt-get install -y haveged
tee /etc/default/haveged >/dev/null <<'EOF'
DAEMON_ARGS="-w 1024"
EOF
systemctl daemon-reload
systemctl enable haveged
systemctl start haveged

Sprawdź, czy jest zainstalowany:
cat /proc/sys/kernel/random/entropy_avail
systemctl status haveged --no-pager

Zoptymalizuj zarządzanie pamięcią (może być teraz ważniejsze niż kiedykolwiek)
Nawet w dzisiejszych komputerach wprowadzono pewne poprawki, które pomagają złagodzić zdarzenia związane z obciążeniem pamięci. W węzłach z małą ilością pamięci RAM te konfiguracje pomagają utrzymać responsywność komputera nawet przy bardzo małej ilości pamięci:
tee /etc/sysctl.d/99-memory.conf >/dev/null <<'EOF'
# Balanced Memory Optimization
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
vm.max_map_count = 65530
EOF
# Enable memory compaction if supported by the system
if [ -f /proc/sys/vm/compaction_proactiveness ]; then
echo "vm.compaction_proactiveness = 20" | tee -a /etc/sysctl.d/99-memory.conf
fi
sysctl -p /etc/sysctl.d/99-memory.conf

Weryfikacja ustawień:
sysctl vm.swappiness vm.dirty_ratio vm.dirty_background_ratio vm.overcommit_memory vm.max_map_count
Zastosuj optymalizacje sieciowe sysctl
Jeśli masz duży ruch sieciowy, w tym duże sieci pamięci masowej, duży ruch między maszynami wirtualnymi w obrębie centrum danych lub chcesz mieć ściślejszą sieć, zapoznaj się z tymi poprawkami:
tee /etc/sysctl.d/99-network-performance.conf >/dev/null <<'EOF'
# Proxmox-safe network performance tuning
# Core network buffers
net.core.netdev_max_backlog = 8192
net.core.optmem_max = 8192
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 8151
# IPv4 hardening
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.default.rp_filter = 1
# ICMP sanity
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Ephemeral port range
net.ipv4.ip_local_port_range = 1024 65535
# TCP behavior tuning
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 240
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_limit_output_bytes = 65536
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 2
# TCP memory buffers
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_wmem = 8192 65536 16777216
# UNIX socket queue depth
net.unix.max_dgram_qlen = 4096
EOF
# Apply all sysctl settings cleanly
sysctl --system

Włącz TCP BBR i szybkie otwieranie
Poniżej znajduje się poprawka, która może pomóc w zmniejszeniu przepustowości i opóźnień w określonych warunkach. Może to być pomocne w przypadku dłuższych łączy RTT i przeciążonych ścieżek sieciowych.
echo "net.core.default_qdisc = fq" | tee -a /etc/sysctl.d/99-tcp-bbr.conf
echo "net.ipv4.tcp_congestion_control = bbr" | tee -a /etc/sysctl.d/99-tcp-bbr.conf
echo "net.ipv4.tcp_fastopen = 3" | tee -a /etc/sysctl.d/99-tcp-fastopen.conf
modprobe tcp_bbr
sysctl -p /etc/sysctl.d/99-tcp-bbr.conf
sysctl -p /etc/sysctl.d/99-tcp-fastopen.conf

Weryfikacja zmian w konfiguracji:
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr || true
Zoptymalizuj długość kolejki kart sieciowych i uczyń ją trwałą
To przydatna drobna poprawka, gdy zauważysz wzrosty lub spadki obciążenia lub po prostu chcesz zwiększyć głębokość kolejki dla zajętego interfejsu.
Znajdź swój interfejs za pomocą następującego polecenia:
ip link show
Następnie uruchom poniższy kod, używając interfejsu znalezionego w powyższym poleceniu. W tym przypadku używam ens192.
ip link set ens192 txqueuelen 10000
echo 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="ens192", RUN+="/sbin/ip link set ens192 txqueuelen 10000"' | tee /etc/udev/rules.d/60-net-txqueue.rules
echo 'net.ipv4.tcp_timestamps = 1' | tee -a /etc/sysctl.d/99-network-performance.conf
sysctl -p /etc/sysctl.d/99-network-performance.conf

Weryfikacja ustawień:
ip -s link show ens192 | head -n 20
cat /etc/udev/rules.d/60-net-txqueue.rules

Zmodyfikuj funkcję logrotate, aby logi nie pochłaniały powoli dysku głównego
To moim zdaniem jedno z najbardziej niedocenianych rozwiązań typu „ustaw i zapomnij”. Poniżej znajduje się kopia zapasowa konfiguracji i zastąpienie jej czystą, dzienną zasadą rotacji.
#!/usr/bin/env bash
# Configure logrotate for Proxmox
set -euo pipefail
ROTATE_DAYS="${ROTATE_DAYS:-14}"
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "ERROR: Please run as root (use sudo)." >&2
exit 1
fi
# Backup existing config
cp /etc/logrotate.conf "/etc/logrotate.conf.bak.$(date +%F_%H%M%S)"
# Create new config
cat > /etc/logrotate.conf <<EOF
# Proxmox logrotate configuration
daily
rotate ${ROTATE_DAYS}
create
compress
delaycompress
dateext
missingok
notifempty
sharedscripts
include /etc/logrotate.d
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
EOF
# Validate
if ! logrotate -d /etc/logrotate.conf >/dev/null 2>&1; then
echo "ERROR: Config validation failed!"
logrotate -d /etc/logrotate.conf
exit 1
fi
echo " Logrotate configured: ${ROTATE_DAYS} days retention"
echo " To test: logrotate -f /etc/logrotate.conf"

Uruchom test:
logrotate -f /etc/logrotate.conf
Log2RAM (dla dysków SSD dla konsumentów)
Wielu z nas korzysta z konsumenckich dysków SSD w domowych laboratoriach. Możemy ograniczyć częste zapisy logów z tych dysków, zapisując je w pamięci RAM i okresowo synchronizując z dyskiem. Pomaga to wydłużyć żywotność tych dysków SSD, zatrzymując większość zapisów.
Sprawdź poniższy skrypt BASH, który zainstaluje Log2RAM i skonfiguruje go dla Proxmox. Przetestuj w swoim laboratorium lub węźle testowym przed zastosowaniem w środowisku produkcyjnym.
#!/usr/bin/env bash
# Install and configure Log2RAM on Proxmox
set -euo pipefail
LOG2RAM_SIZE="${LOG2RAM_SIZE:-256M}"
JOURNAL_MAX_USE="${JOURNAL_MAX_USE:-50M}"
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "ERROR: Please run as root (use sudo)." >&2
exit 1
fi
# Validate size formats
if ! [[ "$LOG2RAM_SIZE" =~ ^[0-9]+[KMG]$ ]] || ! [[ "$JOURNAL_MAX_USE" =~ ^[0-9]+[KMG]$ ]]; then
echo "ERROR: Invalid size format. Use format like 256M, 512M, 1G" >&2
exit 1
fi
TMPDIR="$(mktemp -d)"
trap "rm -rf $TMPDIR" EXIT
# Install dependencies
echo "[log2ram] Installing dependencies..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y rsync curl ca-certificates
# Check if already installed
if command -v log2ram >/dev/null 2>&1 || systemctl list-unit-files | grep -q "^log2ram\.service"; then
echo "[log2ram] Already installed, skipping download"
else
echo "[log2ram] Downloading and installing..."
curl -fsSL -o "$TMPDIR/log2ram.tar.gz" \
"https://github.com/azlux/log2ram/archive/refs/heads/master.tar.gz"
tar -xzf "$TMPDIR/log2ram.tar.gz" -C "$TMPDIR"
cd "$TMPDIR"/log2ram-* && bash ./install.sh </dev/null
fi
# Configure log2ram
if [[ -f /etc/log2ram.conf ]]; then
cp /etc/log2ram.conf "/etc/log2ram.conf.bak.$(date +%F_%H%M%S)"
sed -i -E "s|^[#[:space:]]*SIZE=.*|SIZE=${LOG2RAM_SIZE}|" /etc/log2ram.conf
sed -i -E "s|^[#[:space:]]*USE_RSYNC=.*|USE_RSYNC=true|" /etc/log2ram.conf
echo "[log2ram] Configured: SIZE=${LOG2RAM_SIZE}, USE_RSYNC=true"
fi
# Configure journald limits
cp /etc/systemd/journald.conf "/etc/systemd/journald.conf.bak.$(date +%F_%H%M%S)"
sed -i -E "s|^[#[:space:]]*SystemMaxUse=.*|SystemMaxUse=${JOURNAL_MAX_USE}|" /etc/systemd/journald.conf
sed -i -E "s|^[#[:space:]]*RuntimeMaxUse=.*|RuntimeMaxUse=${JOURNAL_MAX_USE}|" /etc/systemd/journald.conf
# Enable and start
systemctl daemon-reload
systemctl enable log2ram
systemctl start log2ram
systemctl restart systemd-journald
echo " Log2RAM installed and configured"
echo " SIZE=${LOG2RAM_SIZE}, JOURNAL_MAX_USE=${JOURNAL_MAX_USE}"
echo " Reboot to fully activate tmpfs mount for /var/log"

Trwałe nazewnictwo interfejsów sieciowych (zapobieganie zmianie nazw interfejsów)
Oto proste i czytelne podejście polegające na utworzeniu pliku łącza systemd, który pasuje do adresu MAC karty sieciowej i ustawia stabilną nazwę.
Przykładowy przepływ pracy:
Najpierw zidentyfikuj adres MAC:
ip link

Następnie utwórz plik systemd .link (zamień adres MAC i żądaną nazwę):
tee /etc/systemd/network/10-lan.link >/dev/null <<'EOF'
[Match]
MACAddress=AA:BB:CC:DD:EE:FF
[Link]
Name=lan0
EOF
Na koniec należy ponownie uruchomić komputer, aby zastosować wprowadzone zmiany:
reboot
Następnie zaktualizuj /etc/network/interfaces (lub konfigurację sieciową Proxmox), aby użyć lan0.
Podsumowanie
Oto kilka poprawek, które warto wprowadzić w ten weekend na swoim hoście Proxmox. Szczególnie w domowym laboratorium, znajdziesz tu przydatne elementy, takie jak modyfikacja Log2RAM, która pomaga zapobiegać przedwczesnemu zużyciu dysków SSD klasy konsumenckiej. Wiele poprawek sieciowych również jest przydatnych.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).
Swietny artykul, wiecej tresci o Proxmoxie byloby super 🙂
Podczas optymalizacji Log2RAM dostałem komunikat :
Job for log2ram.service failed because the control process exited with error code.
See „systemctl status log2ram.service” and „journalctl -xeu log2ram.service” for details.
w analizie pomogła komenda
journalctl -u log2ram.service –no-pager | tail -n 20
dająca wynik
ERROR: RAM disk for „/var/hdd.log/” too small. Can’t sync.
Po zmniejszeniu logu
journalctl –vacuum-time=2d
wszystko ruszyło.
Dzięki Pomocny Skrypt.