Winnt & Geheugen

Wim Verveen , e-mail: wim@win2kwereld.nl

 

Introductie

Geheugen wordt in Windows NT met een 32 bit flat virtual adress space geadresseerd zodat totaal 4 GB geheugen beschikbaar is. Om dit geheugen efficient te kunnen gebruiken zijn er een aantal technieken die gebruikt worden.

Namelijk:

  • memory mapped files
  • Copy on write
  • Gedeelt geheugen

Een van de leukere features is het gebruik van 'memory mapped files'. Hoe werkt dit? Als bijvoorbeeld een executabel opgestart wordt zal NT de executable in zijn geheugen 'mappen' en die delen in fysiek geheugen inladen die gebruikt worden. De Cache van windows NT werkt precies op dezelfde wijze. Een file in cache is een file die gemapt wordt in het geheugengebied van de cache. Het leuke hiervan is dat de verantwoording over wat op disk staat en wat in het fysieke geheugen is geladen bij de memorymanager ligt en nergens anders.

Om het gebruik van het geheugen efficienter te laten verlopen kunnen geheugenpagina's door processen worden gedeelt en ondersteunt NT 'copy on write' Een pagina wordt gedeelt totdat een proces iets verandert. De pagina wordt dan gekopieert zodat het ene proces de gewijzigde pagina heeft terwijl de andere processen de oorspronkelijke versie kunnen benaderen.

In Windows 2000 zijn een aantal wijzigingen in de memorymanager uitgevoerd om het geheugenbeheer te verbeteren namelijk:

  • Terminal server support
  • 64 GB geheugen
  • Performance en schaalverbeteringen
  • Optimalisatie memorymanager
  • Driver verifier

Geintegreerde support voor Terminal Server

Onder NT 4.0 waren er allerlei problemen met terminal server mede door geheugenbeheer problemen. De memorymanager van Windows 2000 houdt daar nu beter rekening mee.

Ondersteuning van geheugen tot 64 GB

Via een soort expanded memory constructie kan tot 64 GB geheugen worden benaderd

Performance en schaalbaarheidsverbeteringen.

De memorymanager werd verder geoptimaliseerd

Driver verifier

Een van de grootste instabiliteits problemen onder Windows NT wordt veroorzaakt door slecht geschreven drivers. In windows 2000 zijn functies toegevoegd die NT in staat stellen een driver te controleren op goede werking.

De 4 GB Virtuele adresruimte

In deze sectie haal ik een aantal elementen van het geheugenbeheer van Windows NT naar voren.

Windows NT heeft een maximum van 4 GB virtuele adresruimte beschikbaar, geheugen verdeelt over fysiek geheugen en pagefile. De bovenste 2 GB is gereserveerd voor het systeem zelf. De eerste 2 GB is geheugen wat alleen bereikbaar is voor het proces. Dit geheugen kan in zowel user als kernel mode aangesproken worden. Andere processen kunnen hier niet bij. De tweede GB bevat alle OS componenten en is in elk proces adresseerbaar. Dit gedeelte van het geheugen is alleen bereikbaar in kernelmode.

Zaken die we in dit gedeelte terugvinden zijn onder meer de executive, kernel, HAL, kernel mode stacks, paged en non paged pool en de file system cache.

De 3 GB optie

Sinds de enterprise versie kan NT opgestart worden met een optie die de hoeveeld heid gebruikersgeheugen kan vergroten tot 3 GB. Omdat het toale maximum nog steeds 4 GB is moet dit geheugen ergens vandaan komen en wel door het systeem geheugen naar 1 GB te verlagen. Dit gaat met name ten koste van de filecache. Eigenlijk is dit een truuk totdat er een 64 bit windows nt is geschreven. Doordat de filecache wordt uitgekleed is dit ook alleen bruikbaar voor applicaties die hun eigen cache doen zoals SQL. De maximale hoeveelheid fysiek geheugen is 16 GB. In de boot.ini moet NT worden opgestart met de optie '/3GB' om te zorgen dat deze optie wordt aangezet. Applicaties moeten 'large adress space aware' zijn om van het extra geheugen gebruik te kunnen maken.

Fysiek geheugen

Onder NT 4.0 was het maximaal adresbare geheugen 4 GB. Onder Windows 2000 ligt dat iets anders:

  • Windows 2000 Alpha 32 GB
  • Windows 2000 intel server 4 GB
  • Windows 2000 advanced server 8 GB
  • Windows 2000 datacenter 64 GB

Aangezien de virtuele adresruimte nog steeds 4 GB bedraagt geeft dit een probleem. Hoe kunnen we al dit geheugen aanspreken? Dit gebeurd door het projecteren van geheugenvensters in de geheugenruimte van een proces. Dit lijkt wel een beetje op het expanded memory van vroeger. De nieuwe oplossing wordt address windowing extension genoemd en is een api om dit mogelijk te maken. De techniek is platformonafhankelijk.

Voordelen zijn:

  • Mapped files (filecache) kunnen nu in fysiek geheugen blijven.
  • Geheugenvensters uit de totale geheugenruimte geadresseerd worden in de 4 GB virtuele adresruimte.

Het alpha 64 bit Very Large Memory model

Alleen in de alpha Windows 2000 advanced of Datacenter server. Middels 64 bit pointers kan het geheugen benadert worden maar is beperkt tot datafile mapping. Er kan geen code in draaien. Is niet pagebaar. De grootte is gelimiteerd tot 28 GB. Deze versie van Windows NT wordt echter niet meer ontwikkeld. De laatst bekende versie is windows 2000 RC1

Sessies

De introductie van Windows NT terminal server bracht wat ontwerp limitaties van NT aan het licht. Terminal server stelt NT in staat om meerder instanties van de desktop aan gebruikers ter beschikking te stellen. Hier was NT echter nooit voor ontworpen. In NT 4.0 werd dit opgelost door patches aan te brengen die het toch mogelijk maakte meerdere sessies te maken maar dit gaf allerlei problemen.

In Windows 2000 is bij het ontwerp rekening gehouden met meerdere instanties van de desktop. Hiertoe is een nieuw memory management object gemaakt. Alle processen in een interactieve sessie sharen een:

  • Sessie specifieke kopie van win32k.sys en grafische drivers.
  • Een instantie van winlogon en CSRSS
  • Sessie working set.

Alle gecommiteerde virtuele adresruimte wordt gemapped naar files.
Ranges virtuele adresruimte worden gemapped in ranges blokken in files. De files zijn de 'backing store' van de virtuele adresruimte.

Files die hiervoor worden gebruikt zijn:

  • De pagefile (voor geschreven niet-deelbare pages )
  • Exe's en dll's

De working set

De subset van virtuele adresruimte die zich in fysiek geheugen bevind. Dit zijn alle pagina's die benaderbaar zijn zonder dat er een pagefault voorkomt. Voor elk proces is een maximum workingset gedefinieerd en wanneer deze overschreden wordt moeten pages worden vrijgegeven voordat er nieuwe kunnen worden ingelezen.

Er is een systeem wijde maximumworking set (mmMaximumWorkingSetSize) die bij booten wordt bepaald.
Een proces wat start begint zonder working set en 'paged' zichzelf werkende.

Soft en Hard pages

Er wordt een onderscheid gemaakt in soft en hardpages. Zodra een page niet in een working set aanwezig is wordt er een pagefault gegenereerd om deze op te laten halen. Dit betekent echter niet dat er een diskactie nodig is:

Soft page

De page is in het geheugen aanwezig omdat bijvoorbeeld een ander proces deze al in gebruik heeft of omdat de page nog op de standby of modified page list staat.

Hard page

Een hard page is een page die van disk moet worden gehaald. Middels hard pages wordt bijvoorbeeld een executable gestart.

De balanced set manager

Dit is de 'swapper' van NT. De balanced set is de som van alle processen die in geheugen geswapt zijn.

Wat is de taak van de BSM?

Elke seconde wordt de BSM geactiveerd en:

  • Ruimt working sets op
  • Als de thread staat te wachten in usermode markeert kernal stack pages als pageble
  • Als een proces geen nonpageble kernelstacks heeft kan deze naar disk geswapt worden.
  • Het swappen naar disk gebeurd door een aparte thread die de working set van het te swappen proces tot nul reduceert.

De pagefile(s)

De grootte hangt af van de virtueel geheugen eisen van applicaties en drivers.
De 'min size' moet het de waarde zijn van piek geheugen gebruik bij normaal functioneren. Hierdoor wordt ook fragmentatie van de pagefile voorkomen.
De maxwaarde moet de waarde weergeven van uitzonderlijk hoog geheugengebruik.

Wanneer het Virtueel geheugen opraakt worden er meldingen gegeven:

  • De eerste keer voordat de pagefile vergroot wordt door NT
    (system low on virtual memory)
  • De tweede keer wanneer de committed byes waarde de commit limit bereikt
  • De derde keer als de pagefile vol is (system out of virtual memory)

Hoe vind je processen die hiervoor verantwoordelijk zijn?

Memory leaks door te kijken naar VM size (taskman) of private bytes (perfmon). Taskman is een snelle tool om een aantal geheugenproblemen op te sporen.

Een paged pool leak door te kijken naar de paged pool size. Met programma's als poolmon kan dan verder gezocht worden. Vaak is de oorzaak het niet vrijgeven van handles, controleer dus de waarde van het totaal aantal handles.

Welk geheugen is er nu eigenlijk beschikbaar, Wat is een list?

Geheugen wat tijdelijk niet gebruikt wordt is op diverse lijsten terug te vinden. Windows NT gebruikt deze lijsten om verspilling te voorkomen en onnodig diskgebruik tegen te gaan.

Geheugen wat vrij is wordt in diverse tabellen bijgehouden:

  • Free Page List
  • Modified page list
  • Standby page list
  • Zero page list
  • Bad page list ( geheugen wat getest is en fout bevonden tijdens booten)

De tabellen worden bijgehouden in de PFN database als FIFO tabellen.

De standby en modified page list

Worden gebruikt om te voorkomen dat er onnodige diskactiviteit plaatsvindt en dat er te snel geheugenpages worden vrijgegeven. Hierdoor zijn er minder hardpages nodig en kunnen veel pagefaults dus met softpages worden opgelost.
De free page list wordt aangevuld met de standby pagelist. Hierdoor wordt de relatie tussen process en page definitief verbroken en kan de page dus niet meer aan het proces worden vrijgegeven.
Modified pages worden op den duur naar disk geschreven (meestal de pagefile) door de modified page writer. Hierna komen de pages op de standby page list te staan. Pages in deze twee tabellen kunnen weer door het oorspronkelijk proces gebrukt worden en zijn daardoor eigenlijk een soort cache voor geheugenpages.

De modified page writer

Verplaatst pages van de modified naar de standby list en bewaard de inhoud van de pages op disk (pagefile en mapped files waaronder de system cache).
Er zijn twee threads, een voor mapped files en een voor de pagefile. Deze threads worden getriggered wanneer er te weinig vrije pagina's zijn doordat er veel beslag wordt gelegd op het geheugen of omdat de modified page drempel wordt bereikt. De drempel wordt bepaald door de hoeveelheid vrij geheugen:

Geheugen drempel min aantal pages

  • Weinig (<13MB) 100 40
  • Middel (13-19) 150 80
  • Groot (19-32) 300 150
  • Enorm(>32M) 600 256

Zero page list

Grote gedeelten ongebruikt geheugen worden demand zero pages. De voorraad wordt bijgehouden door de zero page thread. Dit is thread 0 van het systeemproces. Ook wel Phase1initialization genoemd. Draait op priority 0 net iets hoger dan de idle thread.. Er is altijd maar een thread per systeem. Het proces neemt pages van de free list vult de page met nullen en plaatst hem op de zerolist.

Systeem geheugen

Het windows OS en driver geheugen valt onder te verdelen in:

  • nonpageable code
  • Pageable code
  • File system cache
  • Nonpaged pool
  • Paged pool

Pools

Er zijn twee soorten pools. De nonpaged pool is altijd in het fysieke geheugen terwijl de paged pool naar disk geswapped kan worden.
De grootte van de pools wordt bepaald door geheugen grootte en systeemtype (server of workstation)
De waardes kunnen veranderd worden overruled in de registry:

    HKLM\system\currentcontrolset\control\session manager\executive

De nonpaged pool heeft een begingrootte en maximumgrootte. De limiet is 256 MB op een intelsysteem (128 MB voor NT 4.0).
De paged pool wordt gelimiteerd door de pagefile met een maximum van 192 MB op intel en 240 MB op alpha.

System Cache

Maximaal 960 MB (512 MB in NT 4.0). De cache werkt met meory mapped files.

Driver verifier

Een van de grootste stabiliteitsproblemen onder Windows NT 4 wordt veroorzaakt door bugs in drivers. In windows 2000 heeft dit opgelost middels de driver verifier.

Wat doet hij:

  • pool integrity checking
  • onbereikbaar maken swapbaar geheugen bij hoge IRQL
  • Simuleren lage bronomstandigheden
  • API verificatie
  • Geheugenlek detectie
  • I/O pakket geheugen verificatie

Er is een gui voor : verifier.exe

hier is meer info http://www.microsoft.com/hwdev/driver/driververify.htm

In SP4 is al een rudimentaire vorm aanwezig. Zie voor de details knowbase nummer Q192486
Beide gebruiken de 'special pool' wat doet die:

  • read only page voor en achter elke allocatie
  • Elke allocatie zit in zijn eigen pagina
  • Overrun en onderrun checking

De registry key HKLM\currentcontrolset\control\session manager\memory management
Controleert dit met een aantal speciale waardes.

Nonpageble system code

Met pstat.exe en drivers.exe (NTReskit) kan een overzicht verkregen worden

Verklaring output :

    Code= nonpage code
    Data=non paged data
    Paged=paged code en data

Let op! Win32k.sys is paged hoewel hij nonpaged staat vermeld.

Met de twee genoemde tools kunnen in elk geval geheugenlekken in drivers opgespoord worden. Iets wat met taskman of perfmon in elk geval niet mogelijk is.

System working set

Niet alleen gewone processen hebben een working set. Ook pagebare systeem code heeft een working set.
Wat zijn de pagebare componenten:

  • Paged pool
  • Pagebare code en data in de executive
  • Pagebare code en data in kernelmode drivers (win32k.sys grafische drivers etc)
  • Globale filesystem data cache

Ter afsluiting.

Het geheugen van Windows NT is behoorlijk gecompliceerd en bevat enorm veel componenten waarvan we hier eigenlijk maar kort ene klein deel hebben belicht. In een apart artikel lichten we het gebruik van de meer en minder bekende tools toe om bottlenecks


privacy policy