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:
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:
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. 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:
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:
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:
Alle gecommiteerde virtuele adresruimte wordt gemapped naar files.
Files die hiervoor worden gebruikt zijn:
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. 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:
De pagefile(s) De grootte hangt af van de virtueel geheugen eisen van applicaties en drivers. Wanneer het Virtueel geheugen opraakt worden er meldingen gegeven:
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:
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 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).
Geheugen drempel min aantal pages
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:
Pools Er zijn twee soorten pools. De nonpaged pool is altijd in het fysieke geheugen terwijl de paged pool naar disk geswapped kan worden. 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). 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:
Er is een gui voor : verifier.exe hier is meer info In SP4 is al een rudimentaire vorm aanwezig. Zie voor de details knowbase nummer Q192486 De registry key HKLM\currentcontrolset\control\session manager\memory management Nonpageble system code Met pstat.exe en Verklaring Code= nonpage code 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. 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 |
|||||||||
|
|
|||||||||