No Subscription Repository hinzufügen
Wer kein laufendes Proxmox Abo hat muss das "No Subscription" Repository manuell hinzufügen in /etc/apt/sources.list:

# PVE pve-no-subscription repository
deb http://download.proxmox.com/debian/pve stretch pve-no-subscription

Gleichzeitig muss das Subscription Repo kommentiert werden in /etc/apt/sources.list.d/pve-enterprise.list

KPTI (Spectre/Meldtown) usw. Protection abschalten
In der Datei /etc/default/grub die Zeile GRUB_CMDLINE_LINUX_DEFAULT=
um mitigations=off nopti nospectre_v1 nospectre_v2 noibrs noibpb nospec_store_bypass_disable no_stf_barrier l1tf=off mds=off ergänzen.
Überprüfen mit:
grep . /sys/devices/system/cpu/vulnerabilities/*
https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown/MitigationControls
https://github.com/speed47/spectre-meltdown-checker/blob/master/spectre-meltdown-checker.sh

USB Autosuspend deaktivieren
In der Datei /etc/default/grub die Zeile GRUB_CMDLINE_LINUX_DEFAULT=
um usbcore.autosuspend=-1 ergänzen.

Nested Virtualization aktivieren
Es wird z.B. benötigt damit in einem Windows 10 Gast Hyper-V installiert werden kann.
Im Detail: https://pve.proxmox.com/wiki/Nested_Virtualization
Kurz:

echo "options kvm-intel nested=Y" > /etc/modprobe.d/kvm-intel.conf
modprobe -r kvm_intel
modprobe kvm_intel

Folgende Meldungen im Syslog die dadurch entstehen können ausblenden:

Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f762dc ignored rdmsr: 0x611
Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f762f2 ignored rdmsr: 0x641
Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f76308 ignored rdmsr: 0x606
Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f7612b ignored rdmsr: 0x606
Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f711ac ignored rdmsr: 0x641
Mar 28 23:33:57 proxmox kernel: kvm [8890]: vcpu1, guest rIP: 0xfffff80375f711f7 ignored rdmsr: 0x611

Diese Optionen setzen:

echo "options kvm ignore_msrs=Y" > /etc/modprobe.d/kvm.conf
echo "options kvm report_ignored_msrs=N" >> /etc/modprobe.d/kvm.conf

loadavg seperat für LXC Container
Zum aktivieren folgendes per Konsole ausführen:
systemctl edit lxcfs
Folgenden Inhalt einfügen und speichern:

[Service]
ExecStart=
ExecStart=/usr/bin/lxcfs -l /var/lib/lxcfs/

Das wird dann automatisch als /etc/systemd/system/lxcfs.service.d/override.conf gespeichert. Die leere ExecStart= Zeile MUSS sein. Sie überschreibt den alten standard Befehl und dann wird der neue gesetzt.

Inotify Watchers erhöhen
Es kann bei vielen LXC Containern passieren das es plötzlich zu Fehlermeldungen kommt innerhalb der Container: Too many open files
Um dieses Problem von vornherein zu vermeiden folgendes in /etc/sysctl.conf eintragen:

fs.inotify.max_user_instances=512
fs.inotify.max_user_watches=65536

Entweder rebooten oder mit sysctl -p die Konfig neu einlesen.

Fehlermeldung "kernel: Neighbour table overflow" beheben
https://wiki.manitu.de/index.php/Server:Fehlermeldung_"kernel:_Neighbour_table_overflow"
https://www.cyberciti.biz/faq/centos-redhat-debian-linux-neighbor-table-overflow/
Kurz, Folgendes in die /etc/sysctl.conf eintragen:

## works best with <= 500 client computers ##
# Force gc to clean-up quickly
net.ipv4.neigh.default.gc_interval = 3600
 
# Set ARP cache entry timeout
net.ipv4.neigh.default.gc_stale_time = 3600
 
# Setup DNS threshold for arp 
net.ipv4.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh1 = 1024

Entweder rebooten oder mit sysctl -p die Konfig neu einlesen.

Swapiness einstellen
Um Proxmox das swapen abzugewöhnen bzw dafür zu sorgen nur dann zu swapen wenn es nicht mehr anders geht als erstes die /etc/sysctl.conf vom Proxmox Host öffnen.
Am Ende eintragen:

vm.swappiness=1

Entweder rebooten oder mit sysctl -p die Konfig neu einlesen.

BUG in Proxmox 5.2-x:
Proxmox scheint einen Bug zu haben sodass die gesetzte Swapiness nicht für die CGroups übernommen wird. Somit laufen dann z.B. die LXC's weiterhin mit swapiness = 60. Um das Problem vorerst zu umgehen einfach nach dem Boot des Hosts folgendes ausführen (es können auch schon LXC's laufen, das ist kein Problem):

for i in `/usr/bin/find /sys /var/lib 2>/dev/null | /bin/grep slice | /bin/grep swappiness` ; do /bin/echo 1 >"${i}" ; done

Damit wird die swapiness auf 1 gesetzt wie in der sysctl.conf auch.
Das muss nach jedem reboot wiederholt werden.

Schreibcache optimieren
Lesestoff:
https://forum.proxmox.com/threads/io-performance-tuning.15893/
https://linuxwiki.de/proc/sys/vm
Normalerweise steht dieser Wert auf 10% vom gesamtem Arbeitsspeicher. Werden nun aber große Datenmengen auf eine HDD geschrieben welche in der Regel nur eine Schreibrate von ~100MB/sec erreicht läuft der Cache schnell voll. Passiert dies wird er erst komplett geleert (der gesamte Inhalt wird auf die HDD geschrieben) ehe neue Daten aufgenommen werden. Das führt zu einer kurzeitig sehr hohen I/O Last des Systems und einem Stillstand des Kopiervorgangs.
Mit einem Eintrag in /etc/sysctl.conf kann der Wert verändert werden. Hier zu 64MB:

vm.dirty_background_bytes = 67108864

Entweder rebooten oder mit sysctl -p die Konfig neu einlesen.

KSM-Sharing optimieren
Was ist KSM-Sharing: https://pve.proxmox.com/wiki/Dynamic_Memory_Management#KSM
Noch mehr Infos: https://dokuwiki.tachtler.net/doku.php?id=tachtler:virtualisierung_kernel_samepage_merging
Und mal in deutsch: https://www.thomas-krenn.com/de/wiki/KSM_(Kernel_Samepage_Merging)

Unter proxmox sprint KSM erst an wenn mehr als 80% des RAM belegt sind. Mir persönlich ist das zu spät weil auch bei 70% Belegung wenn alle Maschinen laufen und z.B. Backup Tasks ausgeführt werden das System anfängt mächtig zu swapen.
Also habe ich den Wert auf 50% RAM Belegung eingestellt.
Dafür editiert man die Datei /etc/ksmtuned.conf und verändert den Wert KSM_THRES_COEF auf in meinem Fall 50. Das einkommentieren nicht vergessen und danach ein systemctl restart ksmtuned.service
Läuft der RAM nun über 50% voll setzt ksmd ein. Laufen z.B. mehrere Windows VM's wird im Laufe der Zeit mehrere GB RAM freigegeben weil identisch. Das ganze verursacht am Anfang CPU Load, das gibt sich aber mit der Zeit.

zram swap einrichten
Die Anleitung dieses Projekt befolgen, das war es dann auch schon:
https://github.com/Nefelim4ag/systemd-swap
Danach hat man einen zram swap + den normalen swap.
Der zram Swap beträgt ein viertel des installierten Ram's.

Logs in den Ram auslagern
Sollte Proxmox auf einer SSD installiert sein kann es helfen die Logs in den Ram auszulagern und nur ab und zu auf die SSD zu syncen.
Mit folder2ram ist genau das möglich: https://github.com/bobafetthotmail/folder2ram
Anbei meine Konfig welche ich benutze:

tmpfs		/var/log
tmpfs		/var/lib/rrdcached
tmpfs		/var/lib/proxmox-backup/rrdb
tmpfs		/var/tmp
tmpfs		/var/cache

Um dann einen regelmäßigen Sync auf die SSD zu haben bietet sich ein Cronjob an:

# folder2ram sync all to disk every 30min
*/30 * * * * /sbin/folder2ram -syncall >/dev/null 2>&1

IGMP Snooping abschalten wenn es der Switch kann und es dort aktiviert ist
https://pve.proxmox.com/wiki/Multicast_notes#Linux:_Disabling_Multicast_snooping_on_bridges

Entweder im Switch ausschalten oder auf den einzelnen Nodes des Clusters.
Auf den Nodes in der /etc/network/interfaces folgendes in der vmbr0 eintragen:

post-up echo 1 > /sys/devices/virtual/net/vmbr0/bridge/multicast_querier
post-up echo 0 > /sys/class/net/vmbr0/bridge/multicast_snooping

Das kann dann fertig z.B. so aussehen:


iface vmbr0 inet static
        address  192.168.1.150
        netmask  255.255.255.0
        gateway  192.168.1.1
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        post-up echo 1 > /sys/devices/virtual/net/vmbr0/bridge/multicast_querier
        post-up echo 0 > /sys/class/net/vmbr0/bridge/multicast_snooping

Unnötige Dienste abschalten
Der erste Dienst sollte selbsterklärend sein:

systemctl stop pve-firewall.service
systemctl disable pve-firewall.service
systemctl stop pvefw-logger.service
systemctl disable pvefw-logger.service
systemctl stop iscsi.service
systemctl stop iscsid.service
systemctl disable iscsi.service
systemctl disable iscsid.service

Der Firewall Dienst muss nach jedem Reboot erneut abgeschaltet werden (bug?)
Mann kann aber auch einfach einen Crontab anlegen der jede Minute schaut ob die Firewall läuft und diese dann beendet:

* * * * * if [ "$(pidof pve-firewall)" ]; then systemctl stop pve-firewall; fi
* * * * * if [ "$(pidof pvefw-logger)" ]; then systemctl stop pvefw-logger; fi

Die anderen beiden hier kann man bedenkenlos abschalten wenn man nur diesen einen Proxmox Knoten betreibt und auch kein HA benutzt:

systemctl stop pve-ha-crm.service
systemctl disable pve-ha-crm.service
systemctl stop pve-ha-lrm.service
systemctl disable pve-ha-lrm.service

Im Syslog erscheint jede Minute:

Jun 10 10:05:00 proxmox systemd[1]: Starting Proxmox VE replication runner...
Jun 10 10:05:00 proxmox systemd[1]: Started Proxmox VE replication runner.

Wer die Replikation nicht benutzt kann es von minütlich auf monatlich stellen indem man in der mit dem ersten Befehl geöffneten Datei Minutely durch Monthly ersetzt. Danach ein Reload und es ist Ruhe.

systemctl edit --full pvesr.timer
systemctl daemon-reload

Subscription Popup abschalten
Einfach folgenden Befehl ausführen:
sed -i.bak "s/data.status !== 'Active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
Alternativ:
sed -i.bak 's/NotFound/Active/g' /usr/share/perl5/PVE/API2/Subscription.pm && systemctl restart pveproxy.service

Subscription Box im Datacenter ausblenden
Folgende Datei muss bearbeitet werden \usr\share\pve-manager\js\pvemanagerlib.js
Diesen Codeblock suchen und entfernen:


{
    title: gettext('Subscriptions'),
    height: 220,
    items: [
	{
	    itemId: 'subscriptions',
	    xtype: 'pveHealthWidget'
	}
    ]
}

FSTRIM für alle virtuellen (LXC) Laufwerke und die Host root Partition
Einfach eine Datei anlegen, z.B. /usr/sbin/fstrim-watchdog mit dem Inhalt:

#!/bin/bash

# static list of volumes to trim
TRIMVOLS="/"

FSTRIM=/sbin/fstrim
PCT=/usr/sbin/pct
LXCINFO=/usr/bin/lxc-info
LOG=/tmp/fstrim.log

# Delete old log when exist
if [ -e $LOG ]; then rm $LOG; fi

# trim static list
for i in $TRIMVOLS; do
  $FSTRIM -v $i >> $LOG
done

# trim all LXC containers
for i in $($PCT list | awk '/^[0-9]/ {print $1}'); do
  $FSTRIM -v /proc/$($LXCINFO -n $i -p | awk '{print $2}')/root >> $LOG
done

cat $LOG | logger
cat $LOG | mail -r proxmox@vulkanbox.dontexist.com -s "Proxmox fstrim" loomes@vulkanbox.dontexist.com
rm $LOG

Entweder dann manuell ausführen von Zeit zu Zeit oder einen Cronjob anlegen.

KVM Start Anpassung um Windows Idle CPU Load zu verringern Mit Proxmox 5.4x nicht mehr nötig

diff --git "a/usr/share/perl5/PVE/QemuServer.pm" "b/usr/share/perl5/PVE/QemuServer.pm"
index a5a6616..00e1669 100644
--- "a/usr/share/perl5/PVE/QemuServer.pm"
+++ "b/usr/share/perl5/PVE/QemuServer.pm"
@@ -6588,8 +6588,6 @@ sub add_hyperv_enlightenments {
 
     if ($winversion >= 7) {
 	push @$cpuFlags , 'hv_relaxed';
+	push @$cpuFlags , 'hv_synic';
+	push @$cpuFlags , 'hv_stimer';
     }
 }

Danach noch ein systemctl restart pvedaemon.service

Maximale LXC bind-mounts (mp0-x) erhöhen Mit Proxmox 5.4x nicht mehr nötig
Normalerweise sind nicht mehr als 10 Bind Mounts möglich. Da das aber oft nicht reicht kann man es manuell erhöhen:

diff --git "a/usr/share/perl5/PVE/LXC/Config.pm" "b/usr/share/perl5/PVE/LXC/Config.pm"
index e7548ff..f0c500c 100644
--- "a/usr/share/perl5/PVE/LXC/Config.pm"
+++ "b/usr/share/perl5/PVE/LXC/Config.pm"
@@ -16,7 +16,7 @@ my $lock_handles =  {};
 my $lockdir = "/run/lock/lxc";
 mkdir $lockdir;
 mkdir "/etc/pve/nodes/$nodename/lxc";
-my $MAX_MOUNT_POINTS = 10;
+my $MAX_MOUNT_POINTS = 40;
 my $MAX_UNUSED_DISKS = $MAX_MOUNT_POINTS;

 # BEGIN implemented abstract methods from PVE::AbstractConfig

Danach noch ein systemctl restart pvedaemon.service

SMART Support für USB Laufwerke in der Proxmox GUI
Folgende Datei gilt es zu bearbeiten: /usr/share/perl5/PVE/Diskmanage.pm
Folgende Zeile suchen (86):
push @$cmd, '-A', '-f', 'brief' if !$healthonly;
Danach folgendes einfügen:

if ($disk eq '/dev/sdc') {
   push @$cmd, '-d', 'sat'
 }

sdc durch das entsprechende Laufwerk ersetzen.
Code für mehrere Disks:

if (($disk eq '/dev/sdc')||($disk eq '/dev/sdd')||($disk eq '/dev/sdf')||($disk eq '/dev/sdg')||($disk eq '/dev/sdh')||($disk eq '/dev/sdi')||($disk eq '/dev/sdj')||($disk eq '/dev/sdk')) {
   push @$cmd, '-d', 'sat'
}

Danach noch ein systemctl restart pvedaemon.service

smartctlc Datenbank auf den neusten Stand bringen

mv /var/lib/smartmontools/drivedb/{drivedb.h,drivedb.h.old} &&
\wget -q -P /var/lib/smartmontools/drivedb/ https://raw.githubusercontent.com/mirror/smartmontools/master/drivedb.h &&
\chown root: /var/lib/smartmontools/drivedb/drivedb.h

Wenn alles geklappt hat kann das alte Backup gelöscht werden:

# After Test new database
rm /var/lib/smartmontools/drivedb/drivedb.h.old

Crontab Logspam verhindern
Bei regelmäßig laufenden Cronjobs wird gerne das Syslog zugespammt mit z.B.:

Jul 03 00:13:01 proxmox CRON[11346]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 03 00:13:01 proxmox CRON[11351]: (root) CMD (if [ "$(pidof pve-firewall)" ]; then systemctl stop pve-firewall; fi)
Jul 03 00:13:01 proxmox CRON[11346]: pam_unix(cron:session): session closed for user root

Um den Logeintrag mit dem auszuführenden Befehl zu entfernen schalten wir erstmal das Logging von cron selbst aus indem wir in der Datei /etc/default/cron folgendes einfügen: EXTRA_OPTS="-L 0"

Um die session Meldungen zu entfernen müssen wir die pam Konfig anpassen. Dazu öffnen wir die Datei /etc/pam.d/common-session-noninteractive und suchen die Zeile session required pam_unix.so. Darüber fügen wir folgendes ein: session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid

Zum Abschluß noch ein systemctl restart cron und es herscht Ruhe im syslog.