diff --git a/proxmox/perf/scripts/deploy-guest-perfpack.sh b/proxmox/perf/scripts/deploy-guest-perfpack.sh new file mode 100644 index 0000000..1ec573b --- /dev/null +++ b/proxmox/perf/scripts/deploy-guest-perfpack.sh @@ -0,0 +1,84 @@ +#!/bin/bash +# deploy-guest-perfpack.sh — guest-side perf pack (ticket #737) +# Run INSIDE a guest VM: bash tests/remote.sh vm-file proxmox/perf/scripts/deploy-guest-perfpack.sh +# Idempotent. Applies: sysctl tuning (swappiness/dirty/net buffers/slow-start), +# fq + bbr (when the kernel module exists), THP->madvise (skipped when tuned +# manages THP, e.g. k8s cnodes on network-latency), fstrim.timer. +# Pairs with the host-side qm flags (iothread/ssd=1/discard=on). +set -u + +log() { echo "[perfpack] $*"; } + +# --- 1. sysctl profile --- +bbr=0 +if modprobe tcp_bbr 2>/dev/null && grep -qw bbr /proc/sys/net/ipv4/tcp_available_congestion_control 2>/dev/null; then + bbr=1 +fi +conf=/etc/sysctl.d/99-perfopt.conf +{ + echo "# perf pack #737 (idempotent redeploy overwrites)" + echo "vm.swappiness = 10" + echo "vm.dirty_ratio = 10" + echo "vm.dirty_background_ratio = 3" + echo "net.core.rmem_max = 4194304" + echo "net.core.wmem_max = 4194304" + echo "net.core.rmem_default = 262144" + echo "net.core.wmem_default = 262144" + echo "net.ipv4.tcp_slow_start_after_idle = 0" + echo "net.core.default_qdisc = fq" + if [ "$bbr" = 1 ]; then + echo "net.ipv4.tcp_congestion_control = bbr" + fi +} > "$conf" +sysctl --system >/dev/null 2>&1 +log "sysctl applied ($conf): swappiness=$(sysctl -n vm.swappiness 2>/dev/null) cc=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null) qdisc=$(sysctl -n net.core.default_qdisc 2>/dev/null) bbr=$bbr" + +# --- 2. THP -> madvise (live now + persisted via oneshot unit) --- +tuned_active=0 +if command -v tuned-adm >/dev/null 2>&1; then + tuned-adm active 2>/dev/null | grep -qvi 'no current\|inactive\|none' && tuned_active=1 +fi +if [ "$tuned_active" = 1 ]; then + log "THP: tuned profile active ($(tuned-adm active 2>/dev/null | awk '{print $NF}')) — leaving THP to tuned" +else + thp=/sys/kernel/mm/transparent_hugepage/enabled + cur=$(tr '[]' ' ' < "$thp" 2>/dev/null | awk '{print $NF}') + if [ "$cur" != "madvise" ]; then + if echo madvise > "$thp" 2>/dev/null; then + log "THP: ${cur:-unknown} -> madvise (live)" + else + log "THP: WARNING live set failed (check $thp permissions)" + fi + else + log "THP: already madvise" + fi + unit=/etc/systemd/system/thp-madvise.service + if [ ! -f "$unit" ]; then + { + echo "[Unit]" + echo "Description=Set transparent hugepages to madvise (perf pack #737)" + echo "DefaultDependencies=no" + echo "After=local-fs.target" + echo "Before=sysinit.target" + echo + echo "[Service]" + echo "Type=oneshot" + echo "ExecStart=/bin/sh -c 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled'" + echo + echo "[Install]" + echo "WantedBy=sysinit.target" + } > "$unit" + systemctl daemon-reload + systemctl enable thp-madvise.service >/dev/null 2>&1 + log "THP: persistence unit installed + enabled" + fi +fi + +# --- 3. fstrim (pairs with host-side discard=on) --- +if systemctl enable --now fstrim.timer >/dev/null 2>&1; then + log "fstrim.timer enabled" +else + log "fstrim.timer: not available on this guest" +fi + +log "done"