OS X Server: prestaties evalueren

In dit artikel wordt beschreven hoe u een script gebruikt om de prestaties van een server met Mac OS X Server v10.4 of hoger te beginnen evalueren. Het voornaamste aandachtspunt is de identificatie van het gebruik van hoofdbronnen: CPU, schijfopslag en netwerken.

Gebruik van bronnen

U kunt dit perl-script (genaamd ‘top_guide.pl’) gebruiken voor de evaluatie van het gebruik van hoofdbronnen door de tijd heen op een server. Dit script werkt met Mac OS X Server v10.4 en hoger.

Het script voert top -d uit maar extraheert en vat het gebruik van hoofdbronnen door de tijd heen samen. Zonder argumenten lijkt het resultaat van top_guide.pl op het volgende:

--------  -----------  ------------  -------------  -------------  -------------  -------------  ------
          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

U ziet dat de drie hoofdgebieden zijn geïdentificeerd: CPU, I/O-schijf en netwerken. De kolommen zijn de volgende:

  • Tijd: de eindtijd van de meest recente overzichtsregel. Standaard is dit tien seconden tussen steekproeven.
  • CPU-gebruik: gebruiker: CPU-gebruik in gebruikersmodus. De waarde is een percentage van de totale beschikbare CPU-bronnen van het systeem. Bij een systeem met acht processors betekent 50 procent CPU gebruiker bijvoorbeeld dat het totale CPU-gebruik van alle actieve programma’s gelijk is aan vier processors.
  • CPU-gebruik: sys: CPU-gebruik in kernelmodus als percentage van de totale beschikbare CPU.
  • Inactief: inactieve CPU, als percentage van de totale beschikbare bronnen.
  • 300-s avg: gemiddelde van het percentage van ongebruikte CPU gedurende de laatste 300 seconden. (Dit wijzigt als u de optie -r gebruikt om het interval voor de berekening van gemiddelden aan te passen. De kolomtitel wordt gepast gewijzigd.)
  • Leesbewerkingen/s - aantal: het aantal unieke leesbewerkingen van de schijf die gedurende de steekproef zijn verricht.
  • Leesbewerkingen/s - MB: het aantal megabytes die tijdens de steekproef zijn gelezen op schijven.
  • Schrijfbewerkingen/s - aantal: het aantal unieke schrijfbewerkingen die gedurende de steekproef zijn verricht.
  • Schrijfbewerkingen/s - MB: totaal aantal megabytes die tijdens de steekproef zijn geschreven.
  • Netto in/s - pkt: totaal aantal ontvangen pakketten gedurende de steekproef.
  • Netto in/s - Mb: totale netwerkinvoer in megabit per seconde gedurende de steekproef.
  • Netto uit/s - pkt: totaal aantal verzonden netwerkpakketten gedurende de steekproef.
  • Netto uit/s - Mb: totale netwerkuitvoer in megabit per seconde gedurende de steekproef.

Andere opties van het script:

  • -h: geef de volledige gebruiksinformatie weer.
  • -o filename: plaats een door tabs gescheiden kopie van de uitvoer in een bestand. Dit uitvoerformulier kan in een spreadsheet of andere scripts voor gegevensanalyse worden geïmporteerd. De eerste regel bevat de kolomkoppen om te verzekeren dat 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 record wenst.
  • -S processNames: bewaak eenmalige processen. Dit is nuttig als een bepaalde service met slechts één enkele proces-ID heel interessant is op een server.  Een voorbeeld hiervan is mogelijk een server die hoofdzakelijk wordt gebruikt als een AFP-server. In dat geval gebruikt u 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 door de namen van processen te scheiden door een komma.
  • -M processNames: zoals -S, maar niet te gebruiken wanneer het programma meerdere processen gebruikt. Een voorbeeld is smbd, waarvoor er één per verbinding is. Bij een systeem dat intensief wordt gebruikt voor Samba gebruikt u -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 prestaties van de server niet volledig kan worden besproken in dit artikel, biedt het resultaat van top_guide.pl een overzicht van het gebruik van CPU, schijven en netwerkbronnen van het systeem. Door dit te vergelijken met de hardware en de belasting van het systeem kan een beheerder beslissen welk gebied nader te onderzoeken. Sommige extra hulpmiddelen die kunnen helpen bij het onderzoek van elk gebied worden hieronder besproken.

CPU-gebruik

Als het CPU-gebruik hoog is, is het hoofdmiddel van het onderzoek de verbetering van de efficiëntie van het programma.  Dit kan niet volledig worden besproken in dit artikel. De CPU wordt soms echter niet gebruikt.  U hebt meerdere hulpmiddelen tot uw beschikking om de situatie te onderzoeken waarbij er voldoende netwerk- en schijfbronnen zijn voor een hogere belasting, maar een wezenlijk deel van de CPU blijft inactief.

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 het commando plockstat(1) beschikbaar. Dit kan worden uitgevoerd voor een specifiek programma om een pthread-vergrendelingsconflict te onderzoeken. U kunt processen met een mogelijk pthread-vergrendelingsconflict identificeren door de uitvoer top -d te controleren op processen met een hoog aantal contextschakelaars (kolom CSW).  Wanneer u een proces hebt geïdentificeerd dat u wilt controleren op een pthread-vergrendelingsconflict, gebruikt u het volgende: # plockstat -C -e 10 -p <pid>.

 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

U kunt dit resultaat onderzoeken en het totaal aantal geblokkeerde nsec achter verschillende vergrendelingen bekijken. Als deze waarde hoog is ten opzichte van het totaal, wordt de uitvoeringstijd beïnvloed door een vergrendelingsconflict.  Deze informatie kan nuttig 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 Aanroeper de symbolische naam van de geblokkeerde functie. Als het aantal blokkeringen ook hoog is, ongeveer 250 per seconde, neemt de efficiëntie af door 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 mutexes en lezer-/schrijververgrendelingen.  Mutex-conflicten kunnen worden geëvalueerd via dtrace(1M)-scripten zoals:

lockstat:::adaptive-block

{

        @often[arg0, stack(5)] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

Hiermee drukt u 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 waardoor een vergrendelingsconflict geen probleem is.  Dit soort script maakt geen totaal van alle instanties voor een enkele 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 naar:

       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 concentreren 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);

}

Wat u moet onthouden bij het gebruik van dtrace(1M) lockstat-scripts en plockstat(1):

  • Het verzamelen van vergrendelingsstatistieken heeft een invloed op de prestaties. Deze hulpmiddelen 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 gewoon vergrendelingen te blokkeren. Overweeg een vergrendeling bij een bron die heel traag wijzigt, waarvoor u 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 doen dalen.

Schijfgebruik

iopending(1) geeft een aanwijzing van de diepte van de I/O-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 wijst op schijfactiviteit maar is niet van belang aangezien bijna alle I/O-wachtrijen een diepte van 0 hebben. Bovendien kunt u iopending gebruiken om u te concentreren op een specifiek schijf- of bestandssysteemvolume. Als u zich bijvoorbeeld wilt concentreren op /Volumes/MyRAID, gebruikt u iopending -m MyRAID.

Ten slotte kunt u ook I/O toekennen aan bepaalde processen en de latentie evalueren met fs_usage(1).  U leest meer over het gebruik van Shark en fs_usage(1) in dit document voor ontwikkelaars.

Netwerkgebruik

Vele servers hebben meerdere netwerkinterfaces en clients op diverse afstanden in het netwerk. De analyse van de prestaties kan ingewikkeld zijn. In LAN-situaties waarbij clients echter rechtstreeks zijn verbonden via materiaal van een bekende snelheid, bieden de waarden gemeten door top_guide.pl en netstat -i een inzicht in de mate waarin de capaciteit wordt gebruikt. Houd deze richtlijnen in het achterhoofd wanneer u deze cijfers interpreteert:

Gigabit Networks - Full Duplex, MTU van 1500 bytes
Maximale snelheden - kleine pakketten:    1488 Kpps   762 Mbps
Maximale pakketsnelheid - pakketten van 1500 bytes:  81 Kpps   987 Mbps
(Kpps = duizenden pakketten per seconde)

Bij de analyse van de netwerkprestaties is het ook nuttig om de uitvoer van netstat -s te controleren op problemen zoals te hoge retoursnelheden van pakketten (hetgeen niet wordt besproken in dit artikel).

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. Aan het gebruik van internet zijn risico’s verbonden. Neem contact op met de leverancier voor meer informatie. Andere bedrijfs- en productnamen zijn mogelijk handelsmerken van de respectievelijke eigenaars.

Publicatiedatum: