OS X Server: prestaties beoordelen

In dit artikel wordt beschreven hoe je een script kunt gebruiken om de prestaties van je server te beoordelen waarop Mac OS X Server v10.4 of hoger wordt uitgevoerd. Het voornaamste aandachtspunt is de identificatie van het gebruik van hoofdbronnen: CPU, schijfopslag en netwerken.

Gebruik van bronnen

Je kunt dit perl-script (genaamd 'top_guide.pl') uitvoeren om het gebruik van belangrijke bronnen op je server binnen een bepaalde periode te beoordelen. Dit script werkt met Mac OS X Server v10.4 en hoger.

Het script voert top -d uit, maar haalt de belangrijkste gegevens over het gebruik van bronnen binnen een bepaalde periode op en genereert op basis hiervan een overzicht. Zonder argumenten lijkt de uitvoer van top_guide.pl hierop:

-------- ----------- ------------ ------------- ------------- ------------- ------------- ------ CPU usage: 300-s Reads/sec: Writes/sec: Net in/sec: Net out/sec: kernel Time: user sys Idle avg. number MB number MB pkts Mb pkts Mb CPU% -------- ----- ----- ----- ----- ------ ------ ------ ------ ------ ------ ------ ------ ------ 08:44:36 0.1 0.1 99.8 99.8 0 0.0 0 0.0 11 0.0 0 0.0 0.4 08:44:46 0.1 0.3 99.6 99.8 0 0.0 0 0.1 12 0.0 0 0.0 0.4 08:44:56 0.0 0.2 99.8 99.8 0 0.0 0 0.0 17 0.0 0 0.0 0.4 08:45:06 0.0 0.2 99.8 99.8 0 0.0 0 0.0 6 0.0 0 0.0 0.4 08:45:16 0.0 0.2 99.8 99.8 0 0.0 0 0.0 9 0.0 0 0.0 0.4 08:45:26 8.7 24.6 66.7 98.6 43 0.8 98 0.6 803 1.0 1399 1.1 5.0 08:45:37 5.7 83.6 10.7 95.7 48 0.4 1085 116.9 95366 1053.1 61830 35.4 72.4 08:45:47 11.5 88.5 0.0 92.4 23 0.2 3228 426.9 337955 3843.6 207872 114.0 284.8 08:45:58 4.6 95.4 0.0 89.0 4 0.0 594 596.7 447499 5215.5 266449 140.9 370.0

De drie belangrijkste geïdentificeerde gebieden staan hierin vermeld: CPU, schijfopslag en netwerken. Hieronder worden de verschillende kolommen toegelicht:

  • Time: de eindtijd van de meest recente overzichtsregel. Standaard zit er 10 seconden tussen de steekproeven.

  • CPU usage: user: CPU-gebruik in gebruikersmodus. De waarde is een percentage van de CPU-bronnen die in totaal beschikbaar zijn op dit systeem. Bij een systeem met acht processors zou 50% CPU-gebruik gebruiker bijvoorbeeld betekenen dat het totale CPU-gebruik van alle actieve programma's gelijkstaat aan vier processors.

  • CPU usage: sys: CPU-gebruik in kernelmodus als percentage van de in totaal beschikbare CPU.

  • Idle: inactieve CPU als percentage van het totaal aantal beschikbare bronnen.

  • 300-s avg: afgevlakt gemiddelde van het percentage ongebruikte CPU in de afgelopen 300 seconden. (Let op: deze waarde verandert als je de -roption gebruikt om het gemiddelde interval aan te passen; de kolomtitel wordt overeenkomstig gewijzigd.)

  • Reads/sec - number: het aantal unieke schijfleesbewerkingen dat gedurende de steekproefperiode is uitgevoerd.

  • Reads/sec - MB: het totale aantal megabytes dat gedurende de steekproefperiode van de schijven wordt gelezen.

  • Writes/sec - number: het aantal unieke schrijfbewerkingen dat gedurende de steekproefperiode is uitgevoerd.

  • Writes/sec - MB: totaal aantal geschreven megabytes gedurende de steekproefperiode.

  • Net in/sec - pkts: totaal aantal ontvangen pakketten gedurende de steekproefperiode.

  • Net in/sec - Mb: totale netwerkinvoer in megabits per seconde gedurende de steekproefperiode.

  • Net out/sec - pkts: totaal aantal verzonden netwerkpakketten gedurende de steekproefperiode.

  • Net out/sec - Mb: totale netwerkuitvoer in megabits per seconde gedurende de steekproefperiode.

Andere opties van het script zijn:

  • -h: volledige gebruiksinformatie weergeven.

  • -o filename: plaats een door tabs gescheiden kopie van de uitvoer in een bestand. Dit uitvoerformulier kan in een spreadsheet of in andere gegevensanalysescripts worden geïmporteerd. De eerste regel bevat de kolomkoppen, zodat de uitvoer altijd een eigen beschrijving heeft.

  • -d: geef de datum- en tijdstempel weer. Dit is bijzonder nuttig bij een langdurige registratie op een server waarbij de beheerder een historisch dossier wenst.

  • -S processNames: bewaak eenmalige processen. Dit is nuttig als een bepaalde service met slechts één proces-ID heel interessant is op een server. Een voorbeeld hiervan kan een server zijn die hoofdzakelijk als een AFP-server wordt gebruikt. In dat geval gebruik je de argumenten -S AppleFileServer om een afzonderlijke kolom toe te voegen voor het CPU-gebruik van de gebruiker van het AppleFileServer-proces. De lijst kan meer dan één proces bevatten als de namen van processen door een komma worden gescheiden.

  • -M processNames: gelijk aan -S, maar kan niet worden ingezet als het programma meerdere processen gebruikt. Een voorbeeld is smbd, waarvoor er één per verbinding is. Bij een systeem dat intensief wordt gebruikt voor Samba gebruik je -M smbd om een kolom met een overzicht van de gebruikers-CPU van alle Samba-activiteit weer te geven.

Hoewel een volledige analyse van de serverprestaties buiten het bestek van dit artikel valt, biedt de uitvoer van top_guide.pl een overzicht van het gebruik van CPU-, schijf- en netwerkbronnen op het systeem. Door dat overzicht te vergelijken met de hardware en belasting van het systeem, kan een beheerder beslissen welk gebied hij of zij nader wil onderzoeken. Hieronder volgen een aantal extra tools die nuttig kunnen zijn bij het onderzoeken van elk gebied.

CPU-gebruik

Als het CPU-gebruik hoog is, kan de beheerder het onderzoek het beste richten op het verhogen van de efficiëntie van het programma. Dit valt buiten het bestek van dit artikel; soms wordt de CPU echter niet gebruikt. Er zijn verschillende tools beschikbaar waarmee je situaties kunt onderzoeken waarin er voldoende netwerk- en schijfbronnen zijn voor een hogere belasting, maar een aanzienlijk deel van de CPU inactief blijft.

Er zijn twee manieren waarop een CPU niet ten volle wordt benut:

  • Vergrendeling van programmathread

  • Vergrendeling van kernelbron

Vanaf Mac OS X 10.5 Leopard is de opdracht plockstat(1) beschikbaar. Deze opdracht kan worden uitgevoerd voor een specifiek programma om een pthread-vergrendelingsconflict te onderzoeken. Je kunt processen met een mogelijk pthread-vergrendelingsconflict identificeren door de uitvoer top -d te controleren voor processen met een hoog aantal contextschakelaars (kolom CSW). Als je een proces hebt geïdentificeerd dat je op een pthread-vergrendelingsconflict wilt controleren, gebruik je # plockstat -C -e 10 -p .

Mutex block Count nsec Lock Caller ------------------------------------------------------------------------------- 8540 29622 0x805eb0 a.out`process_request+0x3d1 8361 28284 0x805eb0 a.out`release_block+0xac R/W reader block Count nsec Lock Caller ------------------------------------------------------------------------------- 1 3014987 0xa781e8 a.out`key_find+0x121 5 78831 0xa3d158 a.out`key_find+0x121 2 120532 0xa3d158 a.out`key_delete+0x137 R/W writer block Count nsec Lock Caller ------------------------------------------------------------------------------- 10 5336318 0xa781e8 a.out`key_replace+0x80 13 3827632 0xa75fe8 a.out`key_replace+0x80 3 3644946 0xa5fde8 a.out`key_create+0x37 6 161055 0xa3d158 a.out`key_replace+0x80 1 785267 0xa37758 a.out`key_create+0x37

Je kunt deze uitvoer onderzoeken en het totaal aantal geblokkeerde nsec's achter verschillende vergrendelingen bekijken. Als deze waarde hoog is ten opzichte van het totaal, wordt de uitvoeringstijd door een vergrendelingsconflict beïnvloed. Deze informatie kan handig zijn voor de schrijver van het programma bij het isoleren en verbeteren van de prestaties van het programma. Als er symbolen beschikbaar zijn, bevat het veld Caller de symbolische naam van de geblokkeerde functie. Als het aantal blokkeringen ook hoog is (ongeveer 250 per seconde en hoger) neemt de efficiëntie af vanwege het opnieuw plannen tussen threads. Hoewel dit onvoldoende is om tot de conclusie te komen dat het een beperkende factor voor prestaties is, moet een hoog aantal blokkeringen worden onderzocht, omdat het in de meeste gevallen aangeeft dat het programma niet zo efficiënt is als eventueel mogelijk.

Soms treden problemen met een bronconflict op voor bronnen in de kernel. De Mac OS X-kernel beheert de meeste bronnen met meerdere threads met behulp van kernel-mutexen en lezer-/schrijververgrendelingen. Mutex-conflicten kunnen worden beoordeeld met behulp van dtrace(1M)-scripten zoals:

lockstat:::adaptive-block { @often[arg0, stack(5)] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); }

Hiermee druk je na steekproeven van vijf seconden gesorteerde lijsten af met de meest conflicterende vergrendelingen en paden aan de onderkant van elk uitvoerblok. Een voorbeeld van de uitvoer:

375517140 mach_kernel`lck_mtx_lock_wait_x86+0x1c7 mach_kernel`lck_mtx_lock+0x217 mach_kernel`ip_output_list+0xd34 mach_kernel`tcp_setpersist+0x18b mach_kernel`tcp_output+0x17a0 0 375571960 mach_kernel`lck_mtx_lock_wait_x86+0x1c7 mach_kernel`lck_mtx_lock+0x217 mach_kernel`vnode_ref+0x32 mach_kernel`fcntl_nocancel+0x4b3 mach_kernel`unix_syscall64+0x26d 0

In dit geval meldt het script dat de kernel-mutex bij 375517140 wordt geblokkeerd via een pad waarbij tcp_output() zorgt voor de aanroep van tcp_setpersist(), dat op zijn beurt ip_output_list() aanroept. Het aantal blokkeringen per seconde is 0 bij beide vergrendelingen, wat betekent dat een vergrendelingsconflict geen probleem is. Dit soort script telt niet alle instanties op tegen één vergrendeling. Als het script wordt gewijzigd in:

lockstat:::adaptive-block { @often[arg0] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); }

kan de uitvoer veranderen in:

1301055072 9 1417504384 9 353318336 10 359381776 10 1301055088 11 5387344 165

Dit geeft aan dat alleen de vergrendeling bij het kerneladres 5387344 een waarneembaar conflict heeft, en zelfs in dit geval is dit niet van belang aangezien de waarde lager is dan 250.

Het script kan zich ook focussen op lezer-/schrijververgrendelingen bij de kernel door het script enigszins te wijzigen in:

lockstat:::rw-block { @often[arg0, stack(4)] = count(); } profile:::tick-5sec { normalize(@often, 5); printa(@often); clear(@often); }

Enkele zaken die je moet onthouden over het gebruik van dtrace(1M) lockstat-scripts en plockstat(1):

  • Het verzamelen van vergrendelingsstatistieken heeft invloed op de prestaties. Deze tools kunnen het systeem vertragen. Voer deze met zorg uit en vergeet niet dat de invloed op prestaties een conflict toevoegt dat niet voorkomt bij normale werking.

  • Sommige ontwerpen worden niet beïnvloed door simpelweg vergrendelingen te blokkeren. Overweeg een vergrendeling bij een bron die heel langzaam wijzigt, waarvoor je mogelijk een vergrendeling wilt gebruiken om deze te beheren. De vergrendeling blijft mogelijk behouden in afwachting van de voltooiing van een langdurende handeling.

Dergelijke instanties hebben lange wachttijden die de prestaties mogelijk niet naar beneden halen.

Schijfgebruik

iopending(1) geeft een indicatie van de diepte van de invoer/uitvoer-wachtrijen in een histogram van de wachtrijdiepte. Bijvoorbeeld:

2008 May 21 10:35:26, load: 0.99, disk_r: 0 KB, disk_w: 392 KB

value ------------- Distribution ------------- count < 0 | 0 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298 1 | 12 2 | 5 3 | 4 4 | 2 5 | 3 6 | 2 7 | 2 8 | 3 9 | 2 10 | 3 11 | 2 12 | 2 13 | 2 14 | 2 15 | 0

Dit duidt op enige schijfactiviteit, maar is geen punt van zorg aangezien bijna alle invoer/uitvoer-wachtrijen een diepte van 0 hebben. Bovendien kun je iopending gebruiken om je op een bepaald schijf- of bestandssysteemvolume te focussen. Als je je bijvoorbeeld op /Volumes/MyRAID wilt focussen, gebruik je iopending -m MyRAID.

Ten slotte kun je ook invoer/uitvoer toekennen aan bepaalde processen en de latentie beoordelen met fs_usage(1). Je leest meer over het gebruik van Shark en fs_usage(1) in dit connectiedocument voor ontwikkelaars.

Netwerkgebruik

Veel servers kunnen meerdere netwerkinterfaces en -clients op verschillende afstanden in het netwerk hebben. Het analyseren van prestaties kan een complexe taak zijn. In LAN-situaties waarin clients rechtstreeks verbonden zijn via een weefsel van een bekende snelheid, zullen statistieken gerapporteerd door top_guide.pl en netstat -i echter inzicht geven in hoe volledig de capaciteit wordt benut. Houd bij het interpreteren van die cijfers rekening met de volgende richtlijnen:

Gigabit-netwerken - full-duplex, 1500 byte MTU

Maximale snelheden - kleine pakketten: 1488 Kpps 762 Mbps

Maximale pakketsnelheid - 1500 bytepakketten: 81 Kpps 987 Mbps

(Kpps = duizenden pakketten per seconde)

Bij het analyseren van netwerkprestaties is het ook goed om de output van netstat -s te controleren op problemen als buitensporige pakketdoorgiftesnelheden (wat buiten het bestek van dit artikel valt).

Meer informatie

Informatie over producten die niet door Apple zijn gemaakt of externe websites die niet door Apple worden beheerd of getest, wordt verstrekt zonder aanbeveling of goedkeuring. Apple aanvaardt geen aansprakelijkheid wat betreft de keuze, de prestaties of het gebruik van websites of producten van derden. Apple doet geen enkele toezegging met betrekking tot de juistheid of de betrouwbaarheid van websites van derden. Neem contact op met de leverancier voor meer informatie.

Publicatiedatum: