4.10 Ressourcenengpässe erkennen Ein Dienst kann korrekt konfiguriert sein und trotzdem langsam, instabil oder nicht erreichbar werden, wenn ihm oder dem Gesamtsystem benötigte Ressourcen fehlen. Grundsatz: Ein einzelner hoher Messwert beweist noch keinen Engpass. Entscheidend sind Messdauer, Vergleichswerte, Auslastungsursache und der zeitliche Zusammenhang mit der Störung. Ziele dieser Seite Nach dieser Seite sollst du: CPU-, Arbeitsspeicher- und I/O-Engpässe erkennen können, Lastspitzen von dauerhaftem Ressourcenmangel unterscheiden können, System- und Prozesswerte getrennt untersuchen können, physischen, virtuellen und residenten Speicher unterscheiden können, Paging und Swapping richtig bewerten können, Datenträgerlatenz und Warteschlangen berücksichtigen können, Handle-, Thread-, Prozess- und Dateideskriptorgrenzen prüfen können, Ressourcenwerte über mehrere Messpunkte beobachten können, Betriebssystemprotokolle nach Ressourcenfehlern durchsuchen können, Ergebnisse mit dem Zeitpunkt einer Dienststörung verbinden können. 1. Welche Ressourcen können einen Dienst begrenzen? Ressource Typisches Fehlerbild CPU Hohe Antwortzeiten, Zeitüberschreitungen, verzögerte Verarbeitung Arbeitsspeicher Paging, Prozessabbrüche, fehlgeschlagene Allokationen Swap beziehungsweise Auslagerungsdatei Hohe Latenz durch Speicherauslagerung Datenträger-I/O Lange Wartezeiten, blockierte Prozesse, langsame Datenbank Speicherplatz Schreiben, Starten oder Protokollieren schlägt fehl Inodes Linux kann trotz freiem Speicherplatz keine Dateien anlegen Dateideskriptoren Neue Dateien oder Sockets können nicht geöffnet werden Windows-Handles Zugriff auf Dateien, Registry, Events oder Prozesse schlägt fehl Threads Neue Aufgaben oder Verbindungen können nicht verarbeitet werden Prozesslimit Neue Prozesse können nicht erzeugt werden Netzwerkbandbreite Langsame Übertragung und Warteschlangen Verbindungspool Neue Datenbank- oder HTTP-Verbindungen warten Portbereich Neue ausgehende TCP-Verbindungen schlagen fehl GPU oder Beschleuniger Spezialisierte Berechnung kann nicht ausgeführt werden Quota Benutzer oder Dienst darf keine weiteren Daten speichern Containerlimit Dienst erreicht CPU-, RAM- oder Prozessgrenze des Containers 2. Auslastung und Engpass unterscheiden Zustand Beschreibung Auslastung Eine Ressource wird verwendet Hohe Auslastung Ressource wird stark verwendet, Dienst funktioniert aber noch Sättigung Neue Arbeit muss warten Engpass Ressourcenbegrenzung beeinträchtigt die benötigte Funktion Überlast Eingehende Arbeit übersteigt dauerhaft die Verarbeitungskapazität Ressourcenleck Verbrauch steigt, obwohl abgeschlossene Arbeit Ressourcen freigeben sollte Grenzwertfehler Konfiguriertes Limit wird vor der technischen Kapazität erreicht Beispiel: CPU-Auslastung: 95 % Antwortzeit: normal Warteschlange: niedrig Fehler: keine Das ist hohe Auslastung, aber noch kein bewiesener Engpass. CPU-Auslastung: 95 % Antwortzeit: stark erhöht Warteschlange: wächst Timeouts: vorhanden Hier besteht ein belastbarer Hinweis auf CPU-Sättigung. 3. Immer über mehrere Messpunkte prüfen Eine Momentaufnahme kann zufällig während einer kurzen Lastspitze entstehen. Empfohlene Messstruktur: Zeitpunkt CPU gesamt CPU des Dienstprozesses verfügbarer Arbeitsspeicher Swap- beziehungsweise Paging-Aktivität Datenträger-I/O und Wartezeit Anzahl aktiver Anfragen Anwendungsantwortzeit Fehlerrate Sinnvolle Vergleichszeiträume: unmittelbar vor der Störung, während der Störung, unmittelbar danach, normaler Vergleichszeitraum, gleiche Uhrzeit an einem störungsfreien Tag, Zustand vor und nach einer Maßnahme. Ein Messwerkzeug erzeugt selbst Last. Abtastrate, Anzahl der Messwerte und Detailgrad müssen zum System passen. 4. Schnellübersicht für Windows, Linux und macOS Aufgabe Windows Linux macOS Systemlaufzeit [RO] (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime [RO] uptime [RO] uptime Logische Prozessoren [RO] (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors [RO] nproc [RO] sysctl -n hw.logicalcpu Prozessübersicht [RO] Get-Process [RO] top [RO] top Speicherübersicht [RO] Get-CimInstance Win32_OperatingSystem [RO] free -h [RO] memory_pressure Swap [RO] Get-CimInstance Win32_PageFileUsage [RO] swapon --show [RO] sysctl vm.swapusage Datenträgerübersicht [RO] Get-Volume [RO] iostat [RO] iostat Prozesslimits Betriebssystemspezifisch [RO][FILE] cat /proc//limits [RO] launchctl limit Systemprotokolle [RO] Get-WinEvent [RO][PRIV] sudo journalctl [RO][PRIV] sudo log show 5. CPU-Grunddaten unter Windows prüfen Anzahl logischer Prozessoren anzeigen: [RO] Get-CimInstance Win32_ComputerSystem | Select-Object NumberOfProcessors, NumberOfLogicalProcessors Gesamte CPU-Auslastung als Momentaufnahme: [RO] Get-CimInstance ` Win32_PerfFormattedData_PerfOS_Processor ` -Filter "Name='_Total'" | Select-Object Name, PercentProcessorTime, PercentUserTime, PercentPrivilegedTime, PercentIdleTime Mehrere Messpunkte mit Get-Counter erfassen: [RO] Get-Counter ` -Counter '\Processor(_Total)\% Processor Time' ` -SampleInterval 2 ` -MaxSamples 5 Die Namen klassischer Windows-Leistungsindikatoren können auf lokalisierten Windows-Systemen übersetzt sein. Falls ein Counterpfad nicht gefunden wird, müssen die auf diesem System vorhandenen Zählersätze ermittelt werden. Verfügbare Zählersätze suchen: [RO] Get-Counter -ListSet * | Select-Object CounterSetName | Sort-Object CounterSetName 6. CPU-verbrauchende Windows-Prozesse ermitteln Prozesse nach kumulierter CPU-Zeit sortieren: [RO] Get-Process | Sort-Object CPU -Descending | Select-Object -First 15 Id, ProcessName, CPU, StartTime Die Eigenschaft CPU enthält die gesamte bisher verbrauchte Prozessorzeit des Prozesses in Sekunden. Sie ist kein momentaner Prozentwert. Momentane Prozessauslastung über formatierte Leistungsdaten: [RO] Get-CimInstance Win32_PerfFormattedData_PerfProc_Process | Where-Object Name -NotIn "_Total", "Idle" | Sort-Object PercentProcessorTime -Descending | Select-Object -First 15 Name, IDProcess, PercentProcessorTime, ThreadCount, WorkingSetPrivate Bestimmte PID untersuchen: [RO] Get-Process -Id | Select-Object Id, ProcessName, StartTime, CPU, Threads, HandleCount Die Prozess-CPU-Ausgabe kann bei mehreren logischen Prozessoren anders skaliert wirken als die gesamte Systemauslastung. Werte müssen im Kontext des verwendeten Messwerkzeugs interpretiert werden. 7. Arbeitsspeicher unter Windows prüfen Gesamten und freien physischen Speicher anzeigen: [RO] Get-CimInstance Win32_OperatingSystem | Select-Object @{ Name="TotalRAM_GiB" Expression={[math]::Round($_.TotalVisibleMemorySize / 1MB, 2)} }, @{ Name="FreeRAM_GiB" Expression={[math]::Round($_.FreePhysicalMemory / 1MB, 2)} }, @{ Name="FreeVirtualMemory_GiB" Expression={[math]::Round($_.FreeVirtualMemory / 1MB, 2)} } Die CIM-Werte werden hier von KiB in GiB umgerechnet. Speicherindikatoren als Momentaufnahme: [RO] Get-CimInstance Win32_PerfFormattedData_PerfOS_Memory | Select-Object AvailableMBytes, PercentCommittedBytesInUse, PagesPerSec, PageReadsPerSec, PageWritesPerSec, PoolPagedBytes, PoolNonpagedBytes Mehrere Messpunkte des verfügbaren Speichers: [RO] Get-Counter ` -Counter '\Memory\Available MBytes' ` -SampleInterval 2 ` -MaxSamples 5 Ein niedriger Wert bei „freiem“ Speicher ist nicht automatisch ein Fehler, weil Betriebssysteme ungenutzten Speicher als Cache verwenden. Verfügbarer Speicher, Paging-Aktivität und Anwendungsfunktion müssen gemeinsam betrachtet werden. 8. Speicherverbrauch von Windows-Prozessen prüfen Nach Working Set sortieren: [RO] Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 15 Id, ProcessName, @{ Name="WorkingSet_MiB" Expression={[math]::Round($_.WorkingSet64 / 1MB, 2)} }, @{ Name="PrivateMemory_MiB" Expression={[math]::Round($_.PrivateMemorySize64 / 1MB, 2)} } Bestimmten Prozess untersuchen: [RO] Get-Process -Id | Select-Object Id, ProcessName, WorkingSet64, PrivateMemorySize64, VirtualMemorySize64, PagedMemorySize64, PeakWorkingSet64 Wert Bedeutung WorkingSet64 Derzeit im physischen Speicher befindliche Seiten PrivateMemorySize64 Privat zugeordneter Speicher VirtualMemorySize64 Virtueller Adressraum PagedMemorySize64 Auslagerungsfähiger Speicher PeakWorkingSet64 Bisheriger Höchstwert des Working Sets Virtueller Speicher darf nicht direkt mit physisch belegtem RAM gleichgesetzt werden. 9. Windows-Auslagerungsdatei prüfen Nutzung der Auslagerungsdatei anzeigen: [RO] Get-CimInstance Win32_PageFileUsage | Select-Object Name, AllocatedBaseSize, CurrentUsage, PeakUsage Die Größen werden üblicherweise in MiB angegeben. Konfiguration der Auslagerungsdatei anzeigen: [RO] Get-CimInstance Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize Mögliche Hinweise auf Speicherdruck: PercentCommittedBytesInUse bleibt sehr hoch, verfügbarer Speicher bleibt niedrig, Page Reads steigen dauerhaft, Anwendungen melden fehlenden virtuellen Speicher, Prozesse werden beendet, Antwortzeiten verschlechtern sich parallel zur Paging-Aktivität. Das Vorhandensein einer verwendeten Auslagerungsdatei ist nicht automatisch ein Fehler. Entscheidend ist eine dauerhaft hohe Paging-Aktivität zusammen mit Leistungsproblemen. 10. Windows-Datenträger-I/O prüfen Formatierte Datenträgerleistungsdaten anzeigen: [RO] Get-CimInstance Win32_PerfFormattedData_PerfDisk_PhysicalDisk | Where-Object Name -ne "_Total" | Select-Object Name, DiskReadsPerSec, DiskWritesPerSec, DiskReadBytesPerSec, DiskWriteBytesPerSec, AvgDiskQueueLength, CurrentDiskQueueLength, PercentDiskTime Mehrere Messpunkte mit Get-Counter: [RO] Get-Counter ` -Counter '\PhysicalDisk(*)\Avg. Disk sec/Read', '\PhysicalDisk(*)\Avg. Disk sec/Write', '\PhysicalDisk(*)\Current Disk Queue Length' ` -SampleInterval 2 ` -MaxSamples 5 Auch hier können lokalisierte Leistungsindikatornamen abweichen. Zu prüfen: steigt die Warteschlange dauerhaft? sind Lese- oder Schreiblatenzen erhöht? ist nur ein Datenträger betroffen? korreliert die I/O-Last mit dem Dienstfehler? erzeugt Sicherung, Virenscan oder Update gleichzeitig Last? ist das Volume lokal, virtuell oder netzwerkbasiert? meldet das System zusätzlich Datenträgerfehler? 11. Windows-Handles und Threads prüfen Gesamtanzahl von Prozessen, Threads und Handles: [RO] Get-CimInstance Win32_PerfFormattedData_PerfOS_System | Select-Object Processes, Threads [RO] Get-CimInstance Win32_PerfFormattedData_PerfOS_Objects | Select-Object Processes, Threads, Events, Mutexes, Sections, Semaphores Prozesse nach Handleanzahl sortieren: [RO] Get-Process | Sort-Object HandleCount -Descending | Select-Object -First 15 Id, ProcessName, HandleCount, @{ Name="ThreadCount" Expression={$_.Threads.Count} } Bestimmten Prozess prüfen: [RO] Get-Process -Id | Select-Object Id, ProcessName, HandleCount, @{ Name="ThreadCount" Expression={$_.Threads.Count} } Ein mögliches Ressourcenleck zeigt sich eher durch kontinuierliches Wachstum als durch einen einzelnen hohen Wert. 12. Windows-Protokolle nach Ressourcenfehlern durchsuchen Systemereignisse der letzten zwei Stunden: [RO][SENS] Get-WinEvent -FilterHashtable @{ LogName = "System" StartTime = (Get-Date).AddHours(-2) Level = 1, 2, 3 } | Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message System- und Anwendungsereignisse gemeinsam: [RO][SENS] Get-WinEvent -FilterHashtable @{ LogName = "System", "Application" StartTime = (Get-Date).AddHours(-2) } | Where-Object Message -Match "memory|resource|disk|paging|quota|handle|thread" | Sort-Object TimeCreated | Select-Object TimeCreated, LogName, ProviderName, Id, Message Textfilter hängen von Sprache und Formulierung der Ereignismeldung ab. Anbieter, Ereignis-ID und Zeitfenster sind zuverlässigere zusätzliche Filter. 13. CPU und Load Average unter Linux prüfen Systemlaufzeit und Load Average anzeigen: [RO] uptime Nur Load Average anzeigen: [RO][FILE] cat /proc/loadavg Anzahl verfügbarer Verarbeitungseinheiten anzeigen: [RO] nproc Interaktive Prozessübersicht: [RO] top Nach CPU-Verbrauch sortieren: [RO] ps -eo pid,ppid,user,stat,%cpu,%mem,etime,comm \ --sort=-%cpu | head -n 16 Falls sysstat installiert ist – CPU je Prozessor messen: [RO] mpstat -P ALL 2 5 mpstat , pidstat und iostat gehören häufig zum Paket sysstat , sind aber nicht auf jeder Installation vorhanden. 14. Linux Load Average richtig interpretieren Die drei Load-Average-Werte beziehen sich üblicherweise auf ungefähr: 1 Minute 5 Minuten 15 Minuten Load Average ist nicht dasselbe wie CPU-Prozent. Unter Linux werden dabei auch bestimmte Prozesse in nicht unterbrechbarem Wartezustand berücksichtigt. Grobe Einordnung: Load Average geteilt durch Anzahl verfügbarer CPUs Dies ist nur eine Orientierung. Beobachtung Mögliche Interpretation Hoher Load und hohe CPU-Nutzung CPU-Sättigung möglich Hoher Load und niedrige CPU-Nutzung I/O-Wartezustände möglich Kurzzeitig hoher 1-Minuten-Wert Lastspitze Hohe 1-, 5- und 15-Minuten-Werte Länger andauernde Belastung Load steigt, Warteschlange wächst System verarbeitet Arbeit nicht schnell genug Ein Load-Wert von 4 ist auf einem System mit zwei CPUs anders zu bewerten als auf einem System mit 32 CPUs. 15. Linux-CPU über mehrere Messpunkte prüfen Systemweite Messreihe mit vmstat: [RO] vmstat 2 5 Wichtige Spalten: Spalte Bedeutung r Ausführungsbereite Prozesse b Prozesse in blockiertem Zustand us CPU-Zeit im Benutzerbereich sy CPU-Zeit im Kernelbereich id Leerlauf wa I/O-Wartezeit st Durch Hypervisor entnommene CPU-Zeit si Swap-In so Swap-Out Die erste Zeile von vmstat kann Durchschnittswerte seit dem Systemstart darstellen. Für eine aktuelle Bewertung sind die folgenden Intervallzeilen wichtiger. Bestimmten Prozess mit installiertem pidstat beobachten: [RO] pidstat -p 2 5 Alle Prozesse mit hoher CPU-Aktivität beobachten: [RO] pidstat -u 2 5 16. Arbeitsspeicher unter Linux prüfen Lesbare Speicherübersicht: [RO] free -h Kernel-Speicherinformationen: [RO][FILE] cat /proc/meminfo Wichtige Werte: Wert Bedeutung MemTotal Gesamter physischer Speicher MemFree Vollständig ungenutzter Speicher MemAvailable Schätzung des für neue Anwendungen verfügbaren Speichers Buffers Pufferspeicher Cached Dateicache SwapTotal Gesamter Swap SwapFree Freier Swap Dirty Noch nicht auf Datenträger geschriebene Seiten Slab Kernel-Datenstrukturen Für die praktische Bewertung ist MemAvailable meist aussagekräftiger als MemFree , weil Linux freien RAM bewusst als Cache nutzt. 17. Linux-Prozesse nach Speicherverbrauch untersuchen Nach residentem Speicher sortieren: [RO] ps -eo pid,ppid,user,stat,%cpu,%mem,rss,vsz,etime,comm \ --sort=-rss | head -n 16 Bestimmten Prozess anzeigen: [RO][SENS] ps -p \ -o user,pid,ppid,stat,%cpu,%mem,rss,vsz,etime,cmd Detaillierte Prozessspeicherwerte: [RO][FILE][SENS] cat "/proc//status" Relevant sind unter anderem: VmPeak VmSize VmHWM VmRSS RssAnon RssFile VmSwap Threads Wert Bedeutung VmSize Virtueller Adressraum VmRSS Residenter physischer Speicher VmHWM Bisheriger Höchstwert des residenten Speichers VmSwap Für den Prozess ausgelagerter Speicher Threads Threadanzahl 18. Swap und Paging unter Linux prüfen Aktive Swap-Bereiche anzeigen: [RO] swapon --show Gesamtnutzung anzeigen: [RO] free -h Swap-Aktivität über mehrere Messpunkte: [RO] vmstat 2 5 Relevant: Spalte Bedeutung si Von Swap eingelesene Daten so In Swap geschriebene Daten Bewertung: verwendeter Swap allein beweist keinen aktuellen Engpass, dauerhaft hohe Werte bei si und so weisen auf aktiven Speicherdruck hin, gleichzeitige hohe I/O-Wartezeit kann die Anwendung stark verlangsamen, einzelne Prozesse können einen großen Teil des Speichers belegen, ein Container kann sein eigenes Speicherlimit erreichen, obwohl der Host noch freien RAM besitzt. 19. Linux-Datenträger-I/O prüfen Grundlegende Datenträgerstatistik: [RO] iostat Falls sysstat installiert ist – erweiterte Messreihe: [RO] iostat -xz 2 5 Wichtige Felder können je nach Version enthalten: Feld Bedeutung r/s Lesevorgänge pro Sekunde w/s Schreibvorgänge pro Sekunde rkB/s Gelesene KiB pro Sekunde wkB/s Geschriebene KiB pro Sekunde await Durchschnittliche Wartezeit aqu-sz Durchschnittliche Warteschlangenlänge %util Anteil der Zeit mit aktiven I/O-Anfragen Prozessbezogene I/O-Aktivität mit pidstat: [RO] pidstat -d 2 5 %util und Warteschlangenwerte müssen zur Datenträgerart und Speicherarchitektur passend bewertet werden. RAID, SSD, SAN und virtuelle Datenträger verhalten sich unterschiedlich. 20. Linux Pressure Stall Information prüfen Auf unterstützten Linux-Kernels stehen Druckinformationen unter /proc/pressure bereit. CPU-Druck: [RO][FILE] cat /proc/pressure/cpu Speicherdruck: [RO][FILE] cat /proc/pressure/memory I/O-Druck: [RO][FILE] cat /proc/pressure/io Mögliche Zeilen: some full Wert Bedeutung some Mindestens eine Aufgabe wurde durch Ressourcenmangel verzögert full Alle nicht im Leerlauf befindlichen Aufgaben waren gleichzeitig verzögert avg10 Durchschnitt der letzten 10 Sekunden avg60 Durchschnitt der letzten 60 Sekunden avg300 Durchschnitt der letzten 300 Sekunden total Kumulierte Verzögerungszeit in Mikrosekunden Fehlen die Dateien, unterstützt oder aktiviert das System diese Schnittstelle möglicherweise nicht. 21. Linux-Dateideskriptor- und Prozessgrenzen prüfen Grenzwerte eines laufenden Prozesses: [RO][FILE] cat "/proc//limits" Besonders relevant: Max open files Max processes Max locked memory Max address space Max core file size Anzahl geöffneter Dateideskriptoren: [RO][PRIV] sudo find "/proc//fd" \ -mindepth 1 \ -maxdepth 1 \ -printf '.' | wc -c systemd-Grenzwerte anzeigen: [RO] systemctl show "" \ --property=LimitNOFILE,LimitNPROC,TasksCurrent,TasksMax,MemoryCurrent,MemoryMax,CPUQuotaPerSecUSec Aktuelle Shell-Grenzen anzeigen: [RO] ulimit -a ulimit -a zeigt die Grenzen der aktuellen Shell und nicht automatisch die Grenzen eines bereits laufenden Dienstes. 22. Linux-Protokolle nach Ressourcenfehlern durchsuchen Warnungen und Fehler des aktuellen Systemstarts: [RO][SENS][PRIV] sudo journalctl \ -b \ -p warning \ --no-pager Kernelmeldungen nach Speicherproblemen durchsuchen: [RO][SENS][PRIV] sudo journalctl \ -k \ -b \ --no-pager | grep -i -E -- "out of memory|oom|killed process|memory cgroup" Nach I/O- und Dateisystemproblemen suchen: [RO][SENS][PRIV] sudo journalctl \ -k \ -b \ --no-pager | grep -i -E -- "i/o error|filesystem|read-only|blocked for more than" Dienstprotokoll im Störungszeitraum: [RO][SENS][PRIV] sudo journalctl \ -u "" \ --since "2026-07-31 09:10:00" \ --until "2026-07-31 09:20:00" \ --no-pager 23. CPU und Load Average unter macOS prüfen Systemlaufzeit und Load Average: [RO] uptime Logische und physische CPUs: [RO] sysctl -n hw.logicalcpu [RO] sysctl -n hw.physicalcpu Interaktive Übersicht nach CPU-Nutzung: [RO] top -o cpu Fünf Messungen im Abstand von zwei Sekunden: [RO] top \ -l 5 \ -s 2 \ -o cpu \ -stats pid,command,cpu,mem,threads,state,time Bestimmten Prozess beobachten: [RO] top \ -l 5 \ -s 2 \ -pid \ -stats pid,command,cpu,mem,threads,state,time Bei top -l kann die erste CPU-Messung ungeeignet sein, weil zur Prozentberechnung noch kein vollständiges vorheriges Intervall vorliegt. 24. Speicher unter macOS prüfen Speicherdruck anzeigen: [RO] memory_pressure Virtuelle Speicherstatistik: [RO] vm_stat Gesamten physischen Speicher anzeigen: [RO] sysctl -n hw.memsize Swap-Nutzung anzeigen: [RO] sysctl vm.swapusage Prozesse nach Speicherverbrauch sortieren: [RO] ps -Amcwwxo pid,ppid,user,state,%cpu,%mem,rss,vsz,etime,command Bestimmten Prozess anzeigen: [RO][SENS] ps -p \ -o user,pid,ppid,state,%cpu,%mem,rss,vsz,etime,command macOS verwaltet Arbeitsspeicher unter anderem durch Cache, Kompression und Swap. „Freier Speicher“ allein ist deshalb weniger aussagekräftig als Speicherdruck, Swap-Aktivität und Anwendungsreaktion. 25. vm_stat unter macOS interpretieren vm_stat zeigt Speicherwerte in Seiten an. Die Seitengröße wird in der ersten Ausgabezeile genannt. Wichtige Werte können sein: Wert Bedeutung Pages free Freie Seiten Pages active Aktiv verwendete Seiten Pages inactive Inaktive, möglicherweise wiederverwendbare Seiten Pages speculative Spekulativ geladene Seiten Pages wired down Nicht auslagerbarer Speicher Pages occupied by compressor Durch Speicherkompression belegte Seiten Pageins Vom Datenträger eingelesene Seiten Pageouts Auf Datenträger ausgelagerte Seiten Swapins Aus Swap eingelesene Seiten Swapouts In Swap geschriebene Seiten Viele Werte sind kumuliert seit dem Systemstart. Für aktuelle Aktivität müssen Messungen über einen definierten Zeitraum verglichen werden. 26. Datenträger-I/O unter macOS prüfen Datenträgerübersicht: [RO] iostat Fünf Messungen im Abstand von zwei Sekunden: [RO] iostat -w 2 -c 5 CPU- und Datenträgerstatistik ausführlicher anzeigen: [RO] iostat -d -c 5 -w 2 Prozessbezogene Beobachtung mit top: [RO] top \ -l 5 \ -s 2 \ -o cpu \ -stats pid,command,cpu,mem,purg,cmprs,pageins,faults Zu prüfen: steigt Datenträgeraktivität während der Störung? tritt gleichzeitig Speicherdruck auf? verursacht ein anderer Prozess hohe I/O-Last? ist das Ziel ein internes, externes oder Netzwerkvolume? gibt es Dateisystem- oder Hardwaremeldungen? wird gleichzeitig gesichert, indiziert oder aktualisiert? 27. Prozess- und Dateigrenzen unter macOS prüfen Grenzwerte von launchd anzeigen: [RO] launchctl limit Grenzwerte der aktuellen Shell anzeigen: [RO] ulimit -a Offene Ressourcen eines Prozesses anzeigen: [RO][SENS][PRIV] sudo lsof -nP -p Anzahl der ausgegebenen offenen Ressourcen grob zählen: [RO][SENS][PRIV] sudo lsof -nP -p | wc -l Die Kopfzeile von lsof wird dabei mitgezählt. Threadanzahl anzeigen: [RO] ps -M -p Die Grenzwerte einer Shell sind nicht automatisch mit denen eines launchd-Dienstes identisch. Für den Dienst müssen launchd-Konfiguration, Prozesskontext und tatsächlicher Verbrauch berücksichtigt werden. 28. macOS-Protokolle nach Ressourcenproblemen prüfen Fehler und Faults der letzten Stunde: [RO][SENS][PRIV] sudo log show \ --last 1h \ --predicate 'messageType == error OR messageType == fault' \ --style compact \ --no-pager Dienstprozess filtern: [RO][SENS][PRIV] sudo log show \ --last 1h \ --predicate 'process == ""' \ --style compact \ --no-pager Nach ressourcenbezogenen Meldungstexten suchen: [RO][SENS][PRIV] sudo log show \ --last 1h \ --predicate 'eventMessage CONTAINS[c] "memory" OR eventMessage CONTAINS[c] "resource" OR eventMessage CONTAINS[c] "disk"' \ --style compact \ --no-pager Textfilter sind nur eine Ergänzung. Prozess, Zeitfenster, Subsystem und konkrete Fehlermeldung müssen ebenfalls berücksichtigt werden. 29. CPU-Engpass systematisch erkennen Belastbare Hinweise: CPU-Auslastung bleibt über längere Zeit hoch, ausführungsbereite Prozesse warten, Antwortzeiten steigen gleichzeitig, Anwendungswarteschlange wächst, Timeouts treten auf, ein bestimmter Prozess oder Thread verursacht den Großteil der Last, virtueller Host meldet hohe CPU-Steal- oder Ready-Zeit, CPU-Limit eines Containers wird erreicht. Mögliche Ursachen: regulär hohe Benutzerlast, Endlosschleife, fehlerhafte Abfrage, Kompression oder Verschlüsselung, Virenscan, Sicherung, Softwareupdate, zu viele Prozesse oder Threads, zu niedriges Containerlimit, fehlende Hardwarebeschleunigung. Nicht ausreichend als Beweis: Ein einzelner Messwert von 100 % 30. Arbeitsspeicherengpass systematisch erkennen Belastbare Hinweise: verfügbarer Speicher bleibt dauerhaft niedrig, Paging oder Swapping ist kontinuierlich aktiv, Speicherdruck steigt, Antwortzeiten steigen parallel, Prozesse werden durch Speichermangel beendet, Anwendung meldet Allokationsfehler, Prozessspeicher wächst kontinuierlich, Container erreicht MemoryMax oder sein Plattformlimit, Cache kann nicht ausreichend zurückgewonnen werden. Mögliche Ursachen: Speicherleck, zu großer Cache, unerwartet viele Sitzungen, zu große Datenmenge, mehrere speicherintensive Dienste, zu kleines VM- oder Containerlimit, fehlerhafte Heap-Konfiguration, fehlende Begrenzung von Workerprozessen. Ein Dienstneustart kann den Speicherverbrauch kurzfristig reduzieren, beweist aber nicht, dass die Ursache beseitigt wurde. 31. I/O-Engpass systematisch erkennen Belastbare Hinweise: I/O-Wartezeiten steigen, Warteschlange bleibt gefüllt, Prozesse verbleiben im Wartezustand, Datenbankabfragen werden langsam, Schreibvorgänge blockieren, gleichzeitig erscheinen I/O- oder Dateisystemfehler, Netzwerkstorage zeigt hohe Latenz, Sicherung oder Indizierung erzeugt konkurrierende Last. Mögliche Ursachen: langsamer oder fehlerhafter Datenträger, RAID-Rebuild, defekter Datenträger, überlastetes SAN oder NAS, hoher Speicherdruck und Paging, ungeeignete Datenbankabfrage, fehlender Cache, Sicherung oder Virenscan, zu viele parallele Schreibvorgänge, Volume- oder IOPS-Limit einer Cloudplattform. Hoher Datendurchsatz kann normal sein. Ein Engpass zeigt sich durch Wartezeit, Warteschlange und beeinträchtigte Anwendung. 32. Ressourcenleck erkennen Ein Ressourcenleck wird durch eine Zeitreihe sichtbar. Mögliche Lecks: Arbeitsspeicher, Handles, Dateideskriptoren, Threads, Netzwerkverbindungen, temporäre Dateien, Datenbankverbindungen, Warteschlangeneinträge. Typisches Muster: Dienststart niedriger Verbrauch nach 1 Stunde höherer Verbrauch nach 6 Stunden weiter gestiegen nach 24 Stunden Grenzwert erreicht nach Dienstneustart wieder niedriger Verbrauch Nachweisstrategie: gleiche Messgröße verwenden, regelmäßige Zeitpunkte erfassen, Last und Benutzerzahl mit dokumentieren, Prozessneustarts berücksichtigen, Grenzwert und Fehlereintritt bestimmen, Herstellerdiagnose oder Profiler kontrolliert einsetzen. Wachstum kann durch einen vorgesehenen Cache entstehen. Ein Leck ist erst wahrscheinlich, wenn Ressourcen trotz abgeschlossener Arbeit nicht angemessen freigegeben werden und der Verbrauch problematisch weiter steigt. 33. Virtualisierung und Containerlimits berücksichtigen Ein Gastbetriebssystem kann normale Hostwerte anzeigen, obwohl die Virtualisierungsplattform Ressourcen begrenzt. Zu prüfen: zugewiesene virtuelle CPUs, CPU-Limit oder CPU-Anteile, CPU-Steal- beziehungsweise Ready-Zeit, zugesicherter und maximaler RAM, Memory Ballooning, Host-Swapping, IOPS- und Durchsatzlimits, Container-CPU-Quota, Container-Speicherlimit, Prozess- beziehungsweise PID-Limit, gemeinsam verwendete Hostressourcen, konkurrierende virtuelle Maschinen oder Container. Typische Fehlinterpretation: „Der Host hat noch freien RAM, deshalb kann der Container keinen Speichermangel haben.“ Ein Container kann sein eigenes Limit erreichen, obwohl der Host noch freie Ressourcen besitzt. 34. Engpass anhand einer Vergleichsmatrix eingrenzen CPU RAM I/O-Wartezeit Mögliche Richtung Hoch Normal Niedrig CPU-intensive Verarbeitung Niedrig Knapp Hoch Paging oder Speicherdruck Niedrig Normal Hoch Datenträger- oder Netzwerkstorage Hoch Knapp Hoch Gesamtsystem überlastet Niedrig Normal Niedrig Externes Backend, Sperre oder Anwendung Normal Verbrauch steigt Zunehmend Mögliches Speicherleck Normal Normal Normal Anwendungs-, Netzwerk- oder Konfigurationsfehler Diese Matrix ist eine Eingrenzungshilfe und kein automatischer Ursachenbeweis. 35. Typische Fehlinterpretationen Fehlinterpretation Richtige Bewertung „100 Prozent CPU bedeutet immer einen Fehler.“ Kurze oder produktive Vollauslastung kann normal sein „Freier RAM ist niedrig, also fehlt Speicher.“ Cache und verfügbarer Speicher müssen berücksichtigt werden „Swap wird verwendet, also ist das System überlastet.“ Aktuelle Swap-Aktivität und Speicherdruck sind entscheidend „Hoher Datendurchsatz bedeutet I/O-Engpass.“ Wartezeit und Warteschlange sind entscheidender „Load Average entspricht CPU-Prozent.“ Load berücksichtigt unter Linux weitere Wartezustände „Die erste vmstat-Zeile zeigt die aktuelle Last.“ Sie kann Durchschnittswerte seit dem Start enthalten „Get-Process CPU ist der aktuelle Prozentwert.“ Es ist kumulierte CPU-Zeit „Virtueller Speicher ist vollständig belegter RAM.“ Virtueller Adressraum und residenter Speicher unterscheiden sich „Ein Neustart behebt das Ressourcenproblem.“ Er kann Zähler und Verbrauch nur vorübergehend zurücksetzen „Der Host hat Ressourcen, also hat der Container sie ebenfalls.“ Container und VM können eigene Limits besitzen 36. Dokumentationsvorlage für Ressourcenengpässe Störung: Server: Dienst: Prozess und PID: Betriebssystem: Virtualisiert beziehungsweise containerisiert: Messzeitraum: Abtastintervall: CPU gesamt: CPU des Prozesses: Load Average: Verfügbarer Arbeitsspeicher: Speicher des Prozesses: Swap- beziehungsweise Paging-Aktivität: Datenträgerlatenz: Datenträgerwarteschlange: Dateideskriptor- beziehungsweise Handleanzahl: Threadanzahl: Konfigurierte Limits: Anwendungsantwortzeit: Fehlerrate: Gleichzeitige Benutzer oder Aufgaben: Relevante Protokollmeldung: Vergleichswert: Bewertung: Nächster Prüfschritt: 37. Checkliste zur Ressourcenanalyse [ ] Störungszeitraum genau bestimmt [ ] System- und Prozesswerte getrennt erfasst [ ] Mehrere Messpunkte aufgenommen [ ] Normalen Vergleichszeitraum bestimmt [ ] Anzahl logischer CPUs berücksichtigt [ ] CPU-Auslastung und Warteschlange geprüft [ ] Load Average richtig eingeordnet [ ] Verfügbaren Arbeitsspeicher geprüft [ ] Prozessspeicher geprüft [ ] Paging beziehungsweise Swapping geprüft [ ] Speicherdruck berücksichtigt [ ] Datenträgerdurchsatz geprüft [ ] I/O-Wartezeit und Warteschlange geprüft [ ] Speicherplatz und Dateisystem grob geprüft [ ] Handle- beziehungsweise Dateideskriptoranzahl geprüft [ ] Thread- und Prozessgrenzen geprüft [ ] Ressourcenlecks über Zeitreihe geprüft [ ] Betriebssystemprotokolle geprüft [ ] Anwendungsprotokolle geprüft [ ] VM- und Containerlimits berücksichtigt [ ] Gleichzeitige Sicherungen und Updates berücksichtigt [ ] Messwerte mit Antwortzeit und Fehlerrate korreliert [ ] Noch keine ungeprüfte Limitänderung durchgeführt [ ] Ursache und nächster Schritt dokumentiert Bewertung des Ergebnisses Ergebnis Nächster Schritt CPU dauerhaft gesättigt Verursachenden Prozess, Threads und Arbeitslast untersuchen Hoher Load bei niedriger CPU I/O-Wartezustände und blockierte Prozesse prüfen Speicherdruck und aktives Swapping Prozessspeicher, Limits und mögliches Leck untersuchen Prozessverbrauch steigt kontinuierlich Zeitreihe und Herstellerdiagnose erstellen Datenträgerlatenz erhöht Datenträger, Dateisystem, Storage und konkurrierende Last prüfen Dateideskriptor- oder Handlegrenze erreicht Leck, Grenzwert und benötigte Kapazität untersuchen Containerlimit erreicht Sollressourcen und Plattformkonfiguration prüfen Host überlastet Andere VMs, Container und Hostprozesse berücksichtigen Ressourcenwerte normal Abhängigkeiten, Sperren, Netzwerk und Anwendung untersuchen Speicherplatz oder Dateisystem auffällig Mit Seite 4.11 detailliert weiterprüfen Merksatz Ein Ressourcenengpass wird nicht durch einen hohen Wert bewiesen, sondern durch dauerhaftes Warten, erreichte Grenzen und eine gleichzeitig beeinträchtigte Dienstfunktion. Weiterführende Quellen Microsoft Learn – Get-Counter Microsoft Learn – Get-Process Microsoft Learn – Get-CimInstance Microsoft Learn – Win32_Process Microsoft Learn – Windows-Leistungsüberwachung Linux-Handbuch – proc_loadavg Linux-Handbuch – proc_meminfo Linux-Handbuch – proc_pid_limits Linux-Handbuch – proc_pressure systemd – systemd.resource-control Apple – top-Handbuchseite Apple – vm_stat-Handbuchseite Apple – iostat-Handbuchseite Apple – launchctl-Handbuchseite