Performanceuntersuchung unter Solaris

Vorwort

Die Beobachtung der Auslastung der Systemressourcen ist sinnvoll, um mögliche Flaschenhälse zu finden. Nachfolgend sollen ein paar Tipps gegeben werden, wie man sich ein Bild von der Auslastung des Systems machen kann, um dann eventuell eine Veränderung an der Hardware oder an den Betriebssystemeinstellungen vorzunehmen. Höhere Priorität muß natürlich den Optimierungen der Datenbankanwendungen zugemessen werden, jedoch sind hier die Möglichkeiten begrenzt, wenn man Software einsetzt, die man selbst nicht direkt verändern kann. Weiterhin müssen die Datenbankeinstellungen optimiert werden. Sollte es dann noch zu Problemen kommen, muss man das System betrachten, um die möglichen Ursachen für die Performanceprobleme zu finden.

Differenziert wird im Folgenden nach den Hauptkomponenten des Systems, nämlich Speicher, Plattenverwaltung, Netzwerk und Prozessor. Die Betrachtung der einzelnen Bereiche ist nicht unabhängig voneinander, da die Beseitigung eines Engpasses einen neuen Engpass an einer anderen Stelle verursachen kann. Die Betrachtungen müssen nach Veränderungen also wiederholt werden. Die Reihenfolge der Betrachtungen ist dabei nicht so wichtig, wobei die Betrachtung der Prozessorauslastung sich sinnvollerweise als letzte Möglichkeit anbietet.

Speicher

Beim Speicher ist zu unterscheiden zwischen dem virtuellen Speicher und dem realen Speicher. Der reale Speicher ist der Hauptspeicher, der tatsächlich im Rechner vorhanden ist. Das Betriebssystem kann aber für die Anwendungen mehr Speicher bereitstellen, den virtuellen Speicher. Für den gesamten virtuellen Speicher muß im System jedoch eine Speichermöglichkeit bereit gehalten werden. Dieser Speicher wird über reservierten Speicherplatz auf Festplatten bereit gestellt. Da die Prozessoren tatsächlich nur direkten Zugriff auf den realen Speicher haben, werden die gerade benötigten Speicherinhalte in den Hauptspeicher geladen. Der Speicher wird in Pages (typisch 2k) unterteilt, die die kleinste Einheit bilden, die transportiert werden. Ist der Hauptspeicher belegt und ein Prozess benötigt Speicherplatz, dann wird die Page ausgelagert, die am längsten nicht verwendet wurde. Diese wird auf Platte ausgelagert und die benötigte Seite in den Hauptspeicher eingelagert. Dieser Mechanismus wird als Paging bezeichnet. Diese Verwaltung übernimmt der swapper-Prozeß. Der Zugriff auf eine Platte ist um einige Größenordnungen langsamer als der Zugriff auf den Hauptspeicher, so dass Zugriffe auf Daten, die ausgelagert sind, wesentlich langsamer sind. Engpässe im Speicher verursachen eine hohe Auslagerungsrate und machen sich deshalb deutlich in dem Systemverhalten bemerkbar. Übersteigt die Rate der Auslagerungen einen Grenzwert, dann wird der Mechanismus der Auslagerung so geändert, dass die kompletten Daten eines Prozesses ausgelagert werden. Dieser Mechanismus wird Swapping genannt.

Bei der Konfiguration des Systems muß der Swap-Bereich genügend groß gewählt werden. Die Größe hängt von den Anwendungen ab, eine Faustformel ist 2 mal die Größe des Hauptspeichers. Wenn der virtuelle Speicher (grob Hauptspeicher und Swap-Bereich) belegt ist, können keine weiteren Prozesse mehr gestartet werden! Der Swap-Bereich kann mit dem Kommando swap nachträglich verändert werden.

Speichergröße ermitteln

Die Größe des physikalischen Speichers (Hauptspeicher) im Rechner kann anhand der Ausgabe des prtconf-Kommandos ermittelt werden. Der tatsächlich verfügbare Speicher ergibt sich durch Abzug des Speichers, der vom Betriebssystemkern belegt wird. Der verfügbare Speicher wird nach dem Systemstart an der Console ausgegeben und kann, wenn der Start des Systems nicht zu lange zurückliegt, mit dem Kommando dmesg ausgegeben werden.

prtconf | grep "Memory"
Memory size: 6144 Megabytes
dmesg | grep "avail mem"
Jun  2 20:32:17 btu0x2 unix: [ID 930857 kern.info] avail mem = 6107471872

Die Größe des Swap-Bereichs kann mit dem Kommando swap ermittelt werden. Die Ausgabe ist in Blöcken, die typischerweise die Größe von 512 Byte haben. Die hier ausgegebene Größe des Swap-Bereichs entspricht 8 GB. Es können mehrere Bereiche für den Swap bereitgestellt werden, die dann einzeln aufgelistet werden.
swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d1      85,1      16 16779408 16778672

Speicherbenutzung ansehen

Um sich ein Bild von der Speicherbenutzung zu machen, kann man zunächst die Ausgabe des Kommandos vmstat analysieren. Die Ausgabe sollte über ein bestimmtes Intervall gemittelt ausgegeben werden, z.B. alle 10 Sekunden.

vmstat 5 10
 procs     memory            page            disk          faults      cpu
 r b w swap       free re  mf  pi po fr de sr m0 m1 m5 m6   in    sy  cs us sy id
 0 0 0 5278936 1327848 1 10 12  0  0  0  0  3 35  0  0  383 13806 563 15  7 78
 0 0 0 5243520 1235936 0  1  0  0  0  0  0 12 51  0  0  438 84738 827 69 31  0
 0 0 0 5243520 1235816 0  0  0  0  0  0  0  0 60  0  0  443 56711 979 72 28  0
 0 0 0 5243520 1235656 0  0  0  0  0  0  0 22 61  0  0  470 51799 975 72 28  0
 0 0 0 5243520 1235488 0  0  0  0  0  0  0  0 59  0  0  422 61261 951 74 26  0
 1 0 0 5243520 1235336 0  0  0  0  0  0  0  0 59  0  0  424 61747 950 76 24  0
 0 0 0 5243512 1235184 0  0  0  0  0  0  0  0 56  0  0  431 78332 903 73 27  0
 0 0 0 5243512 1235040 0  0  0  0  0  0  0 11 55  0  0  439 67457 885 69 31  0
 0 0 0 5243504 1234872 0  0  0  0  0  0  0  0 56  0  0  424 72422 912 76 24  0
 0 0 0 5243496 1234720 0  0  0  0  0  0  0 23 62  0  0  475 49541 986 75 25  0

Bei der Ausgabe sind die Spalten po (pageouts) und sr (scan rate) genauer zu betrachten. Wenn beide Größen durchgehend hoch sind, z.B. viel größer als 100 bei 4 GB Hauptspeicher, dann ist es wahrscheinlich, dass der page daemon Speicherseiten von laufenden Prozessen wegnehmen muss.

vmstat 5 10
 procs     memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s2 sd sd --   in   sy   cs us sy id
 0 0 0 4644112 626944 0   1  0  0  0  0  0  0  0  1  0  809 1207  155  0  0 99
 0 0 0 3556744 502704 0   1  0  0  0  0  0  0  0  0  0  816   92  163  0  0 100
 0 0 0 3556744 502704 0   0  0  0  0  0  0  0  0  0  0  809   94  163  0  0 100
 0 0 0 3556744 502704 0   0  0  0  0  0  0  0  0  0  0  809  488  158  0  0 100
 0 0 0 3556744 502704 0   0  0  0  0  0  0  0  0  0  0  811   97  161  0  0 100
 0 0 0 3556744 502704 0   0  0  0  0  0  0  0  0  0  0  814   96  164  0  1 99
 0 0 0 3556744 414184 0 4027 0  0  0  0  0  0  0  0  0  847  264  234 43  6 51
 0 0 0 3556744 243088 0 4272 0  0  0  0  0  0  0  0  0  835  659  235 45  5 50
 0 0 0 3556960 78248  0 3858 0  0  0  0 99  0  0  0  0  832  647  234 40 10 50
 0 0 0 3566288 10648  0 2647 12 15403 18560 0 4758 0 122 0 0 873 652 250 28 13 59
 0 0 0 3565664 13304  0 2368 70 16360 19539 0 5772 0 138 0 0 890 184 244 26 12 62
 0 0 0 3565216 15024  1 2088 123 13976 15961 0 6324 0 127 0 0 903 285 265 23 15 62
 0 0 0 3565144 14184  0 1971 107 10508 16745 0 8661 0 97 0 0 881 172 245 22 13 64
 0 0 0 3564672 14504  3 2045 105 12497 16144 0 5181 0 111 0 0 893 171 243 22 14 63
 0 0 0 3564168 14928  3 2128 233 11400 17323 0 3486 0 119 0 0 901 182 284 23 12 66
 0 0 0 3564512 23464  0  12 100 1025 1435 0 300 0 20 0 0 826 503  184  0  2 98
 0 0 0 3564512 23456  0   0  0  0  0  0  0  0  0  0  0  809   89  158  0  0 100
 0 0 0 3564512 23448  0   0  1  1  1  0  0  0  4  0  0  813   95  163  0  1 99
 0 0 0 3564512 23416  0   4 41  0  0  0  0  0  5  0  0  830  150  180  2  0 98 

Pageouts können durch folgende Gründe erfolgen:

Die Scan rate misst die Aktivität des page-Daemons, der zusätzliche freie Speicherseiten sucht, wenn in der Liste der freien Speicherseiten nicht genügend Seiten verzeichnet sind. Je größer der Engpaß im Speicher ist, um so häufiger muss der Page-Daemon die Seiten im Speicher durchsehen. Speicher wird hauptsächlich belegt von

Ähnliche Informationen kann man auch über sar (system activity reporter) erhalten, der mit den Packages SUNWaccu und SUNWaccr installiert wird.

Durch cron-Jobs des Users sys können über den Tag Daten gesammelt werden, die dann mit dem sar-Kommando analysiert werden können. Bei der Installation von sar werden diese cron-Einträge vorbereitet und müssen nur auskommentiert werden.

pkginfo SUNWaccu
system      SUNWaccu       System Accounting, (Usr)
pkginfo SUNWaccr
system      SUNWaccr       System Accounting, (Root)
crontab -l sys
#ident  "@(#)sys        1.5     92/07/14 SMI"   /* SVr4.0 1.2   */
#
# The sys crontab should be used to do performance collection. See cron
# and performance manual pages for details on startup.
#
0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A

Die von den cron-Jobs gesammelten Informationen werden in Dateien gesammelt, deren Ende den Tag des Datums wiedergibt. Diese Dateien werden unter /var/adm/sa abgelegt und periodisch von /usr/lib/sa/sa2 gelöscht. Der Aufruf von sar wertet die Datei des aktuellen Tages aus. Mit der Option -f kann die Datei eines anderen Tages ausgewertet werden.

sar -f /var/adm/sa/sa01

SunOS btu0x2 5.8 Generic_108528-17 sun4u    02/01/03

00:00:00    %usr    %sys    %wio   %idle
01:00:00       1       2       0      97 

Über die Optionen des sar-Kommandos kann man sich über verschiedene Aspekte der Systemaktivitäten Auskunft geben lassen. Die Option -g gibt die Aktivitäten des page-Daemonswieder. Eine durchgehend von Null verschiedenen Zahl bei pgout/s läßt einen Speicherengpaß vermuten. Die Option -w gibt Auskunft über die Aktivität des swapper-Prozesses, der größere Bereiche auslagert. Sind hier in größerer Mittelung von 0 verschiedenen Zahlen bei swpot/s festzustellen, dann ist auch dies ein Hinweis auf einen Speicherengpaß.

sar -g 10 5

SunOS btu0x2 5.8 Generic_108528-13 sun4u    06/24/02

21:52:11  pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
21:52:21     0.20     0.20     0.10     0.00     0.00
21:52:31     0.20     0.20     0.20     0.00     0.00
21:52:41     0.60     0.60     0.50     0.00     0.00
21:52:51     0.50     0.60     0.50     0.00     0.00
21:53:01     0.60     0.60     0.40     0.00     0.00

Average      0.42     0.44     0.34     0.00     0.00
sar -w 10 5

SunOS btu0x2 5.8 Generic_108528-13 sun4u    06/24/02

21:47:00 swpin/s bswin/s swpot/s bswot/s pswch/s
21:47:10    0.00     0.0    0.00     0.0     426
21:47:20    0.00     0.0    0.00     0.0     762
21:47:30    0.00     0.0    0.00     0.0     530
21:47:40    0.00     0.0    0.00     0.0    1277
21:47:50    0.00     0.0    0.00     0.0     748

Average     0.00     0.0    0.00     0.0     749

Die Verwendung des Swap-Bereichs kann mit dem swap-Kommando angesehen werden. Eine weitere Möglichkeit ist das Kommando prtswap aus dem memtool-Package.

swap -s
total: 2291104k bytes allocated + 5203408k reserved = 7494512k used, 5720816k av
ailable

Speicherbelegung einzelner Prozesse

Zunächst kann mit dem Kommando ps eine Ausgabe des Speicherbedarfs der einzelnen Prozesse angefordert werden. Das Kommando ps gibt bei verschiedenen Optionen die Speicherbelegung mit aus, z.B. -f oder -l. Mit der Option -o kann man auch selbst die angezeigten Größen bestimmen. Dabei bietet Solaris die Größe pmem an, die den prozentualen Bedarf des Prozesses am Gesamtspeicher ausgibt (virtueller Speicher).

ps -eo pmem,vsz,rss,comm | sort -nr | head
%MEM    VSZ    RSS COMMAND
26.1 530080 523424 /home/sybase/pkg/bin/dataserver
 1.7 37736 32528 /opt/lib/sisis/opserver/bin/OPServer
 1.5 33952 29816 /opt/lib/sisis/sikmass/bin/prg/INDTURBO
 0.3 8392 6016 /home/sybase/pkg/bin/backupserver
 0.2 8576 3416 /usr/local/sisis-pap/bin/perl
 0.1 8576 2152 /usr/local/sisis-pap/bin/perl 

procmem ist ein Tool, geschrieben von Allan Packer, das die Ausgabe des pmem Programms (Bestandteil des memtool-Package), oder des Solaris pmap-Kommandos verwendet, um den Memorygebrauch für alle Prozesse aufzulisten, wobei zwischen virtual, resident, shared und private Memory unterschieden wird. Mit procmem kann man sehr komfortabel nach Speicherfressern suchen. Mit der Option -v kann für einzelne Prozesse eine sehr detaillierte Ausgabe erzeugt werden.

procmem
Processes                                   Kbytes Resident   Shared  Private
---------                                   ------ --------   ------  -------
Process Summary (Count)
  -ksh (2)                                    3792     1960     1848      112
  -sh (5)                                     5320     1192     1032      160
  -tcsh (2)                                   5736     3040     2600      440
  AVServer (36)                            1351560   104688    34504    70184
  CATServer (1)                              41008    35648    35592       56
  INDEX (3)                                  96376    35608    29256     6352
  OPServer (147)                           6733080   497208    40720   456488
  SIERA (4)                                 153936    42880    34032     8848
  SIKIS (5)                                 189312    53360    36936    16424
  Z39CATServer (1)                           46592    37408    32896     4512
  automountd (1)                              4160     3080     2232      848
  backupserver (1)                           20416    20040     2456    17584
  cron (1)                                    3280     3264     3152      112
  dataserver (3)                           1584008   528152   522584     5568
  devfsadmd (1)                               2856     2664     1936      728
  dmispd (1)                                  3136     2672     2096      576
  dtlogin (1)                                 5192     3208     2928      280
  httpd (14)                                 74248     5864     3536     2328
  inetd (1)                                   2504     2400     2376       24
  init (1)                                     824      288      208       80
  iplog (1)                                   7848     7752     1864     5888
  lockd (1)                                   1928     1824     1592      232
  lpsched (1)                                 3280     2200     2016      184
  mibiisa (1)                                11104    11048     1728     9320
  mountd (1)                                  2840     2552     1832      720
  nfsd (1)                                    1920     1832     1504      328
  nscd (1)                                   21712    20984     2024    18960
  ntpd (1)                                    2712     2712     2488      224
  perl (151)                               1318792   446824     7792   439032
  picld (1)                                   2472     2256     1216     1040
  rpcbind (1)                                 2368     2144     1776      368
  sac (1)                                     1816     1744     1632      112
  sendmail (1)                                3240     2800     2680      120
  sh (12)                                    13616     1648     1136      512
  sisis_svc (1)                              48496    46000    38640     7360
  sleep (2)                                   1888     1016      872      144
  smcboot (2)                                 3456     1768     1656      112
  snmpXdmid (1)                               3696     3000     2112      888
  snmpdx (1)                                  2208     2008     1808      200
  sshd (8)                                   16448     3304     1888     1416
  sshd2 (8)                                  25552     5120     2776     2344
  statd (1)                                   2536     2344     1784      560
  syseventconfd (1)                           1352     1296     1104      192
  syseventd (1)                               1584     1528     1264      264
  syslogd (1)                                 3688     2544     2056      488
  tcsh (6)                                   17648     4424     2776     1648
  tnsxd (1)                                   2696     2656     2264      392
  ttymon (2)                                  3608     2016     1576      440
  utmmain (1)                                 1568     1568     1504       64
  utmnet (1)                                  3280     3128     2800      328
  utmpd (1)                                   1048     1024      904      120
  utmtimer (1)                                1600     1600     1456      144
  utmwork (1)                                39184    36920    36544      376
  vi (1)                                      2032     1936     1240      696
  vold (1)                                    2712     2456     2168      288
-----------------------------------------------------------------------------

File (Count)                                Kbytes Resident   Shared  Private
-----------                                 ------ --------   ------  -------
/usr/lib Shared Library Totals              760632    29448     4200    25248
Other Shared Library Totals                6661176   157648    42992   114656
Mapped File Totals                           23088        0        0        0
Binary File Totals                          273960    30416    21632     8784
Shared Memory Totals                        932352     7056     7056        0
Anonymous Memory Totals                    3258056   938520        0   938520
-----------------------------------------------------------------------------
Grand Totals                              11909264  1163088    75880  1087208 
procmem -v -p 10202
Processes                                   Kbytes Resident   Shared  Private
---------                                   ------ --------   ------  -------
  10202: OPServer                            46048    43600    40064     3536


File (Count)                                Kbytes Resident   Shared  Private
-----------                                 ------ --------   ------  -------
/usr/lib Shared Libraries
  ld.so.1 (1)                                  160      160      152        8
  libc.so.1 (1)                                720      720      688       32
  libdl.so.1 (1)                                 8        8        8        0
  libm.so.1 (1)                                 96       96       96        0
  libmp.so.2 (1)                                24       24       24        0
  libnsl.so.1 (1)                              632      616      592       24
  libsocket.so.1 (1)                            48       48       40        8
  nss_files.so.1 (1)                            32       32       32        0
/usr/lib Shared Library Totals                1720     1704     1632       72

Other Shared Libraries
  libBSA.so (1)                                 16       16       16        0
  libInfo2ZFL.so (1)                            32       24       24        0
  libbts.so (1)                               1088      440      416       24
  libc_psr.so.1 (1)                             16       16       16        0
  libcmdops.so (1)                              64       56       56        0
  libdbcall.so (1)                           27936    27552    27056      496
  libnahrot.so (1)                              64       48       48        0
  libops.so (1)                                672      464      376       88
  libpfl.so (1)                                 96       72       72        0
  librech.so (1)                               576      400      368       32
  libshlsikmaonl.so (1)                         32       32       32        0
  libsiasbase.so (1)                           672      456      368       88
  libsiasserver.so (1)                         832      752      712       40
  libslnp.so (1)                               296      112       96       16
  libslnpbts.so (1)                            872      688      688        0
  libslnpops.so (1)                            304      224      216        8
  libslnpstd.so (1)                             32       32       32        0
  libsrvtrace.so (1)                            32       32       24        8
  libtli.so (1)                                 32       32       32        0
  libz.so (1)                                   72       24       24        0
  libz39opsdummy.so (1)                         16       16       16        0
Other Shared Library Totals                  33752    31488    30688      800

Mapped Files
  dev:85,5 ino:465915 (1)                       96        0        0        0
Mapped File Totals                              96        0        0        0

Binary Files
  OPServer (1)                                 352      304      272       32
Binary File Totals                             352      304      272       32

Shared Memory
  [shmid=0xbb9] (1)                           6288     6288     6288        0
Shared Memory Totals                          6288     6288     6288        0

Anonymous Memory
  anon (5)                                      40       40        0       40
  heap (1)                                    3600     2392        0     2392
  stack (1)                                    200      200        0      200
Anonymous Memory Totals                       3840     2632        0     2632

-----------------------------------------------------------------------------
Grand Totals                                 46048    42416    38880     3536 

Memtool-Kommandos

Neben dem Kommando pmem sind in dem Package memtool weitere Kommandos enthalten, die eine Übersicht über die Speicherauslastung des Systems geben.

prtmem

prtmem gibt einen Überblick über den Speicherverbrauch.
prtmem
Total memory:            5833 Megabytes
Kernel Memory:            371 Megabytes
Application:             2437 Megabytes
Executable & libs:         53 Megabytes
File Cache:                53 Megabytes
Free, file cache:        1108 Megabytes
Free, free:              1811 Megabytes 

Total Memory
Speicher, der im System nach dem Start verfügbar ist.
Kernel Memory
Der von den Datenstrukturen des Betriebssystemkerns belegter Speicher (ohne Datei-Cache).
Application
Bereich des "anonymen Speichers", der für Shared-Memory und den privaten Speicher der Anwendungen belegt ist.
Executable and Libs
Speicher, der von dem Ausführungs-Code und den Shared-Libraries belegt wird.
File Cache
Vom Filesystem-Cache belegter Teil des Speichers (ohne free list)
Free, file cache
Teil des Filesystem-Cache, der in der free list verzeichnet ist.
Free, free
Freier Speicher
prtswap

prtswap gibt einen Überblick über die Verwendung des Swapbereichs.

prtswap
Virtual Swap:
---------------------------------------------------------------
Total Virtual Swap Configured:                          12907MB
Total Virtual Swap Reserved:                             8982MB
Total Virtual Swap Free: (programs will fail if 0)       3924MB


Physical Swap Utilization: (pages swapped out)
---------------------------------------------------------------
Physical Swap Configured:                                8193MB
Physical Swap Free (programs will be locked in if 0):    8192MB 
pmem

pmem gibt den Adressraum eines Prozesses aus. Die Ausgabe ist verschiedenen Bereiche unterteilt.

pmem 14193
14193:  /opt/lib/sisis/avserver/bin/AVServer -p 8076
Address   Kbytes Resident Shared Anon    Permissions       Mapped File
00010000     184     184     184       - read/exec         AVServer
0004C000      16      16       -      16 read/write/exec   AVServer
00050000    2064    1936     512    1424 read/write/exec    [ heap ]
FCEA0000      16      16      16       - read/exec         de_DE.ISO8859-1.so.2
FCEB2000      16      16      16       - read/write/exec   de_DE.ISO8859-1.so.2
FCEC0000      16      16      16       - read/exec         iso_8859_1.so.2
FCED2000       8       8       8       - read/write/exec   iso_8859_1.so.2
FCEE0000      24      24      24       - read/exec         nss_files.so.1
FCEF6000       8       8       8       - read/write/exec   nss_files.so.1
FCF00000     688     688     688       - read/exec         libc.so.1
FCFBC000      32      32       -      32 read/write/exec   libc.so.1
FCFD0000       8       8       -       8 read/write/exec    [ anon ]
FCFE0000      24      24      24       - read/exec         libtli.so
FCFF4000       8       8       8       - read/write/exec   libtli.so
FD000000   25128   24912   24912       - read/exec         libdbcall.so
FE898000    2640    1008     784     224 read/write/exec   libdbcall.so
FEB2C000     168      40       -      40 read/write/exec   libdbcall.so
FEB60000     200     136     136       - read/shared       dev:85,5 ino:465934
FEBA0000       8       8       -       8 read/write/exec    [ anon ]
FEBB0000      16      16      16       - read/exec         libmp.so.2
FEBC4000       8       8       8       - read/write/exec   libmp.so.2
FEBD0000      56      24      24       - read/exec         libz.so
FEBEC000      16      16      16       - read/write/exec   libz.so
FEC00000     568     568     568       - read/exec         libnsl.so.1
FEC9E000      40      40      24      16 read/write/exec   libnsl.so.1
FECA8000      24      16       8       8 read/write/exec   libnsl.so.1
FECC0000      16      16      16       - read/exec         libc_psr.so.1
FECE0000      88      88      88       - read/exec         libm.so.1
FED04000       8       8       8       - read/write/exec   libm.so.1
FED10000      40      40      40       - read/exec         libsocket.so.1
FED2A000       8       8       -       8 read/write/exec   libsocket.so.1
FED30000      16      16      16       - read/exec         libInfo2ZFL.so
FED42000       8       8       8       - read/write/exec   libInfo2ZFL.so
FED44000       8       -       -       - read/write/exec   libInfo2ZFL.so
FED50000      48      40      40       - read/exec         libsicall.so
FED6A000      16      16      16       - read/write/exec   libsicall.so
FED80000     768     504     504       - read/exec         libsiasserver.so
FEE4E000      56      56      32      24 read/write/exec   libsiasserver.so
FEE5C000       8       -       -       - read/write/exec   libsiasserver.so
FEE70000       8       8       -       8 read/write/exec    [ anon ]
FEE80000     568     352     352       - read/exec         libsiasbase.so
FEF1C000      32      32      16      16 read/write/exec   libsiasbase.so
FEF24000      72      72      40      32 read/write/exec   libsiasbase.so
FEF40000       8       8       8       - read/exec         libBSA.so
FEF50000       8       8       8       - read/write/exec   libBSA.so
FEF60000      24      24      24       - read/exec         libshlsikmaonl.so
FEF74000       8       8       8       - read/write/exec   libshlsikmaonl.so
FEF80000     368     368     368       - read/exec         librech.so
FEFEA000      16      16      16       - read/write/exec   librech.so
FEFEE000     192       -       -       - read/write/exec   librech.so
FF020000      56      56      56       - read/exec         libnahrot.so
FF03C000       8       8       8       - read/write/exec   libnahrot.so
FF050000      72      64      64       - read/exec         libpfl.so
FF070000      24      24      24       - read/write/exec   libpfl.so
FF080000      24      24      24       - read/exec         libsrvtrace.so
FF094000       8       8       -       8 read/write/exec   libsrvtrace.so
FF0A0000      96      96      96       - read/exec         libslnp.so
FF0C6000      16      16       -      16 read/write/exec   libslnp.so
FF0CA000     184       -       -       - read/write/exec   libslnp.so
FF100000     864     552     552       - read/exec         libslnpbts.so
FF1E6000       8       8       8       - read/write/exec   libslnpbts.so
FF1F0000       8       8       -       8 read/write/exec    [ anon ]
FF200000     872     408     408       - read/exec         libbts.so
FF2E8000      24      24       8      16 read/write/exec   libbts.so
FF2EE000     192       8       -       8 read/write/exec   libbts.so
FF330000      24      24      24       - read/exec         libslnpstd.so
FF344000       8       8       8       - read/write/exec   libslnpstd.so
FF350000     104      64      64       - read/exec         libcmdbts.so
FF378000      24      24      24       - read/write/exec   libcmdbts.so
FF390000       8       8       8       - read/exec         libdl.so.1
FF3A0000       8       8       -       8 read/write/exec    [ anon ]
FF3B0000     152     152     152       - read/exec         ld.so.1
FF3E6000       8       8       -       8 read/write/exec   ld.so.1
FFBC8000     160     160       -     160 read/write/exec    [ stack ]
--------  ------  ------  ------  ------
total Kb   37328   33232   31136    2096
memps

memps liefert für alle Prozesse eine Ausgabe des Speicherverbrauchs.

memps
    PID     Size Resident   Shared  Anon     Process              
    267   23728k   23024k    2040k   20984k  /usr/sbin/nscd
    534   22448k   21984k    2384k   19600k  /home/sybase/pkg/bin/backupserver -e/home/sybase/backup.err -Lgerman -N25 -C20 
    463   11104k   11064k    1768k    9296k  mibiisa -r -p 32813
   8904   50184k   45784k   38168k    7616k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
    373   48512k   39320k   31936k    7384k  sisis_svc
  14699   50680k   45544k   38264k    7280k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
    290    8768k    8672k    1888k    6784k  /usr/local/bin/iplog -l /var/log/iplog.log
   3508   48784k   44008k   38152k    5856k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
  27788   47784k   43104k   38216k    4888k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
  25414   47728k   42912k   38192k    4720k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
    897   46592k   35184k   30696k    4488k  /opt/lib/sisis/catserver/bin/Z39CATServer -p 3046
  29821   47536k   42664k   38296k    4368k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
  22753   46720k   42336k   38096k    4240k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
   5823   46832k   42424k   38192k    4232k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
   4832   46632k   42232k   38216k    4016k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
   1237    8928k    8888k    4896k    3992k  /usr/local/bin/perl /opt/lib/sisis/webOPAC/backend/backendMain.pl 27017 btu0x2 
  16228   46728k   42128k   38200k    3928k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
   1794   46488k   42104k   38184k    3920k  /opt/lib/sisis/opserver/bin/OPServer -p 3025
  12777   46656k   42080k   38184k    3896k  /opt/lib/sisis/opserver/bin/OPServer -p 3025 
mem

mem liefert die Ausgabe der Memory-Auslatung in Form einer top-artigen Ausgabe

memps
|- MemTool                  KEYS: U)pper H)elp R)efresh Q)uit                 -|
| [CPU Usage] [Paging        ] [Page in/outs ][Memory   (k)] [Inode        ]   |
|  Idle   27   Scanr      0.0   Pgouts    0.2  Free 2925088   Namei     893    |
|  User   28   Pgfr       0.2   Ppgouts   0.2                 Dnlc     100%    |
|  Sys    38                    Pgins     0.1                 Dirblk      0    |
|  Wait    7                    Ppgins    0.1                                  |
|------------------------------------------------------------------------------|
|  VFS Memory Dump         |  All Files              |  Sorted By Size         |
|------------------------------------------------------------------------------|
|   PID     Size Resident   Shared  Anon     Process                           |
|------------------------------------------------------------------------------|
|    267   23728k   23024k    2040k   20984k  /usr/sbin/nscd                   |
|    534   22448k   21984k    2384k   19600k  /home/sybase/pkg/bin/backupserve |
|    463   11104k   11064k    1768k    9296k  mibiisa -r -p 32813              |
|   8904   50184k   45776k   38152k    7624k  /opt/lib/sisis/opserver/bin/OPSe |
|    373   48512k   39312k   31928k    7384k  sisis_svc                        |
|  14699   50680k   45536k   38248k    7288k  /opt/lib/sisis/opserver/bin/OPSe |
|    290    8768k    8672k    1888k    6784k  /usr/local/bin/iplog -l /var/log |
|   3508   48784k   44000k   38136k    5864k  /opt/lib/sisis/opserver/bin/OPSe |
|  25414   47728k   42904k   38176k    4728k  /opt/lib/sisis/opserver/bin/OPSe |
|    897   46592k   35176k   30688k    4488k  /opt/lib/sisis/catserver/bin/Z39 |
|  29821   47536k   42656k   38280k    4376k  /opt/lib/sisis/opserver/bin/OPSe |
|  22753   46720k   42328k   38080k    4248k  /opt/lib/sisis/opserver/bin/OPSe |
|   5823   46832k   42416k   38176k    4240k  /opt/lib/sisis/opserver/bin/OPSe |
|   4832   46632k   42224k   38200k    4024k  /opt/lib/sisis/opserver/bin/OPSe |
|                                                                              |
|______________________________________________________________________________| 

Mit memtool steht eine graphische Oberfläche zur Anzeige der Daten zur Verfügung.

Shared Memory

Die im System verwendeten Segmente von Shared Memory können mit dem Kommando ipcs ausgegeben werden. Shared Memory ist normalerweise normales Memory, das auch dem Paging unterworfen ist. Solaris bietet die Möglichkeit des ISM (initmate Shared Memory), das eine Auslagerung auf den swap-Space verhindert. Diese Methode wird bei der Belegung des Shared Memory von Sybase verwendet.

ipcs -mb
IPC status from  as of Sat Feb  8 22:22:07 MET 2003
T         ID      KEY        MODE        OWNER    GROUP      SEGSZ
Shared Memory:
m          0   0x8f00001f --rw-------   sybase   sybase  529244160
m       3001   0x1        --rw-rw-rw-     root    other    6436464
m      42502   0x13f7     --rw-rw-rw-    sisis    sisis     327680
m      44003   0x13f9     --rw-------    sisis    sisis     196608
m      17004   0x13fa     --rw-------    sisis    sisis     262144

Speicherengpässe beseitigen

  1. Speicher zum System hinzufügen.

  2. Ein-/Ausgaben über UFS verringern

  3. Speicher für den Buffer-Cache verringern. Dies führt zwar zu höherem I/O der Datenbank, ist aber dem Paging vorzuziehen.

  4. Anzahl der Benutzer verringern

Speichermodule werden in Bänke eingesteckt. Je nach Rechnersystem stehen eine bestimmte Anzahl von Bänken zur Verfügung. Für die Bestückung der Bänke gelten bestimmte Regeln, die den Handbüchern der Rechner entnommen werden können. So kann es sein, dass eine bestimmte Anzahl von Bänken gleichzeitig bestückt werden müssen, diese evtl. nur mit gleicher Speicherdichte belegt werden dürfen, bei unterschiedlichen Dichten diese in bestimmter Reihenfolge verwendet werden müssen. Diese Limitierungen sind bei der Planung einer Erweiterung (evtl. schon beim Kauf) zu bedenken. Unter ungünstigen Umständen kann es sein, dass bei einer Erweiterung des Speichers vorhandener Speicher ersetzt werden muss.

Plattenzugriff

Der Zugriff auf die Festplatten ist in der Regel wesentlich langsamer, als der Zugriff auf den Speicher. Kommt es bei dem Zugriff auf eine Platte zu Engpässen, dann wird dieses Problem deutlich die Gesamtperformance beeinträchtigen.

Engpässe beim Plattenzugriff finden

Die Option -d des sar-Kommandos gibt das I/O-Verhalten beim Zugriff auf die Plattendevices wieder.

sar -d 
SunOS btu0x2 5.8 Generic_108528-13 sun4u    06/24/02

00:00:00   device        %busy   avque   r+w/s  blks/s  avwait  avserv

...

12:20:00   md0               1     0.0       0       5    15.0    36.8
           md1               0     0.0       0       0     0.0     0.0
           md5               9     0.2      10     166     3.4    11.6
           md6               5     0.1       5      72     2.1    12.2
           md10              1     0.0       0       5     0.0    31.3
           md11              0     0.0       0       0     0.0     0.0
           md15              8     0.1      10     166     0.0     9.8
           md16              5     0.1       5      72     0.0    10.4
           md20              1     0.0       0       5     0.0    31.6
           md21              0     0.0       0       0     0.0     0.0
           md25              8     0.1      10     166     0.0     9.9
           md26              5     0.1       5      72     0.0    10.5
           nfs1              0     0.0       0       0     0.0     0.0
           nfs2              0     0.0       0       0     0.0     0.0
           nfs3              0     0.0       0       0     0.0     0.0
           sd0              12     0.2      18     246     0.0    11.7
           sd0,a             1     0.0       0       5     0.0    31.3
           sd0,b             0     0.0       0       0     0.0     0.0
           sd0,c             0     0.0       0       0     0.0     0.0
           sd0,f             7     0.1      10     166     0.0     9.8
           sd0,g             5     0.1       5      72     0.0    10.3
           sd0,h             5     0.0       2       2     0.0    21.2
           sd1              12     0.2      18     245     0.0    11.8
           sd1,a             1     0.0       0       5     0.0    31.6
           sd1,b             0     0.0       0       0     0.0     0.0
           sd1,c             0     0.0       0       0     0.0     0.0
           sd1,f             8     0.1      10     166     0.0     9.9
           sd1,g             5     0.1       5      72     0.0    10.5
           sd1,h             5     0.0       2       2     0.0    21.6
           sd6               0     0.0       0       0     0.0     0.0
           ssd0              1     0.0       9      37     0.0     1.6
           ssd0,a            0     0.0       0       0     0.0     0.6
           ssd0,b            0     0.0       0       0     0.0     0.0
           ssd0,c            0     0.0       0       0     0.0     0.0
           ssd0,d            0     0.0       3      10     0.0     0.9
           ssd0,e            0     0.0       7      26     0.0     1.9
           ssd0,f            0     0.0       0       0     0.0     4.1
           ssd0,g            0     0.0       0       0     0.0     0.0
           ssd1             35     0.7     101     402     0.0     6.5
           ssd1,a            4     0.1       6      25     0.0    11.1
           ssd1,b            0     0.0       1       3     0.0     3.2
           ssd1,c            0     0.0       0       0     0.0     0.0
           ssd1,d           33     0.6      94     374     0.0     6.3
           ssd1,e            0     0.0       0       0     0.0     0.0
           ssd1,f            0     0.0       0       0     0.0     0.0
           ssd1,g            0     0.0       0       0     0.0     0.0
           st4               0     0.0       0       0     0.0     0.0

12:40:00   md0               1     0.0       0       3    16.1    36.3
           md1               0     0.0       0       0     0.0     0.0
           md5              10     0.2      12     199     2.7    10.4
           md6               5     0.1       5      66     2.1    12.1
           md10              0     0.0       0       3     0.0    30.4
           md11              0     0.0       0       0     0.0     0.0
           md15              8     0.1      12     199     0.0     8.9
           md16              4     0.0       5      66     0.0    10.4
           md20              0     0.0       0       3     0.0    32.1
           md21              0     0.0       0       0     0.0     0.0
           md25              8     0.1      12     199     0.0     8.8
           md26              4     0.0       5      66     0.0    10.4
           nfs1              0     0.0       0       0     0.0     0.0
           nfs2              0     0.0       0       0     0.0     0.0
           nfs3              0     0.0       0       0     0.0     0.0
           sd0              13     0.2      19     270     0.0    10.7
           sd0,a             0     0.0       0       3     0.0    30.4
           sd0,b             0     0.0       0       0     0.0     0.0
           sd0,c             0     0.0       0       0     0.0     0.0
           sd0,f             8     0.1      12     199     0.0     8.9
           sd0,g             4     0.0       5      66     0.0    10.4
           sd0,h             4     0.0       2       2     0.0    21.2
           sd1              12     0.2      19     270     0.0    10.7
           sd1,a             0     0.0       0       3     0.0    32.1
           sd1,b             0     0.0       0       0     0.0     0.0
           sd1,c             0     0.0       0       0     0.0     0.0
           sd1,f             8     0.1      12     199     0.0     8.8
           sd1,g             4     0.0       5      66     0.0    10.4
           sd1,h             4     0.0       2       2     0.0    21.4
           sd6               0     0.0       0       0     0.0     0.0
           ssd0              1     0.0      16      65     0.0     1.9
           ssd0,a            0     0.0       0       0     0.0     3.4
           ssd0,b            0     0.0       0       0     0.0     0.0
           ssd0,c            0     0.0       0       0     0.0     0.0
           ssd0,d            0     0.0       5      19     0.0     0.9
           ssd0,e            1     0.0      11      46     0.0     2.3
           ssd0,f            0     0.0       0       0     0.0     2.3
           ssd0,g            0     0.0       0       0     0.0     0.0
           ssd1             37     1.0     125     502     0.0     7.9
           ssd1,a            4     0.1       6      25     0.0    11.6
           ssd1,b            1     0.0      13      54     0.0     1.0
           ssd1,c            0     0.0       0       0     0.0     0.0
           ssd1,d           34     0.9     106     423     0.0     8.6
           ssd1,e            0     0.0       0       0     0.0     0.0
           ssd1,f            0     0.0       0       0     0.0     0.0
           ssd1,g            0     0.0       0       0     0.0     0.0
           st4               0     0.0       0       0     0.0     0.0

... 

Wichtige Größen der Ausgabe sind %busy, das den Auslastungsgrad der Platte angibt, avserv, das die Antwortzeit des Devices angibt und avwait, das angibt, wieviele I/O-requests in der Warteschlange stehen. Ist die Größe %busy über einen längeren Zeitraum über 60% und die Antwortzeit über längere Zeit größer als 35, so wird dieses Device die Performance des Gesamtsystems beeinträchtigen. Ebenso ist eine Warteschlange, die über einen längeren Zeitraum größer als eins ist, bei Antwortzeiten über 35 ein Hinweis auf einen Flaschenhals.

Die Bezeichnung der Geräte mit sd oder ssd ist hier etwas ungewohnt. Um die gewohnten Devicenamen zu erhalten, kann man in der Zuordnungstabelle /etc/path_to_inst das physikalische Device ermitteln. Auf dieses Gerät ist wiederum in /etc/rdsk ein Link gesetzt.

grep ssd /etc/path_to_inst | grep " 1 "
"/ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0" 1 "ssd"
ls -l /dev/rdsk | grep "/ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0"
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s0 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:a,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s1 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:b,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s2 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:c,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s3 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:d,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s4 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:e,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s5 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:f,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s6 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:g,raw
lrwxrwxrwx   1 root     root          89 Jul 17  2001 c1t1d0s7 -> ../../devices/
ssm@0,0/pci@19,700000/pci@1/SUNW,qlc@4/fp@0,0/ssd@w50020f23000080f0,0:h,raw

Ähnliche Informationen liefert auch das iostat-Kommando.

iostat -xn 
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
    0.1    0.2    0.9    1.3  0.0  0.0    8.1   17.6   0   0 d0
    0.0    0.0    0.0    0.1  0.0  0.0    2.3   93.9   0   0 d1
    0.6    1.9    9.6   15.4  0.0  0.0    6.4   13.1   2   2 d5
    0.5    1.4    4.3    9.6  0.0  0.0    2.7   10.2   1   1 d6
    0.1    0.2    0.4    1.3  0.0  0.0    0.0   18.8   0   0 d10
    0.0    0.0    0.0    0.1  0.0  0.0    0.0  131.2   0   0 d11
    0.3    1.9    4.8   15.4  0.0  0.0    0.0   12.3   0   2 d15
    0.3    1.4    2.1    9.5  0.0  0.0    0.0    9.8   0   1 d16
    0.1    0.2    0.4    1.3  0.0  0.0    0.0   19.5   0   0 d20
    0.0    0.0    0.0    0.1  0.0  0.0    0.0  129.3   0   0 d21
    0.3    1.9    4.8   15.4  0.0  0.0    0.0   12.5   0   2 d25
    0.3    1.4    2.1    9.5  0.0  0.0    0.0   10.0   0   1 d26
    0.6    4.5    7.3   26.8  0.0  0.1    0.0   13.3   0   4 c0t0d0
    0.6    4.5    7.3   26.8  0.0  0.1    0.0   13.6   0   4 c0t1d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c0t6d0
    4.5    4.3  125.0  118.8  0.0  0.1    5.6   17.0   0   2 c1t1d1
   24.4    1.7  131.5   13.6  0.0  0.1    0.0    5.6   0   6 c1t1d0
    0.0    9.1    0.0   90.9  0.0  0.0    0.0    1.3   0   1 rmt/0
    0.0    0.0    0.0    0.1  0.0  0.0 8676.7   28.7   0   0 btu0x7:/disk/scratch/btu0x2
    0.1    0.3    2.8    8.9  0.0  0.0    0.9    9.5   0   0 btu0x7:/disk/backup_btu0x2/fsdump
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 btu0x2:vold(pid287)
iostat -xpn 
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
...
   24.4    1.7  131.5   13.6  0.0  0.1    0.0    5.6   0   6 c1t1d0
    8.9    0.5   22.6    1.0  0.0  0.0    0.0    2.9   0   1 c1t1d0s0
    1.1    0.0    2.3    0.0  0.0  0.0    0.0    4.0   0   0 c1t1d0s1
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c1t1d0s2
   14.0    1.2  103.2    2.4  0.0  0.1    0.0    7.6   0   5 c1t1d0s3
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c1t1d0s4
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c1t1d0s5
    0.5    0.0    3.5   10.2  0.0  0.0    0.0    1.9   0   0 c1t1d0s6
...

%b gibt hier die Auslastung der Devices an, wsvc_t und asvc_t geben die Antwortzeiten für die wait-Queue und die aktiven Anfragen an, actv gibt die Anzahl der Requests an, die von der Wait-Queue genommen und abgearbeitet werden.

Durch die Option -p kann die Ausgabe auf die Partitionen einzelner Platten erweitert werden. Dadurch kann man genau die Partition finden, die an der Auslastung am meisten schuldig ist, z.B. den Teil der Datenbank, der stark belastet wird.

Verwendet man Veritas, so steht dort das Tool vxstat zur Verfügung, auf das hier nicht näher eingegangen wird.

Abhilfe bei einem Festplattenengpaß

Netzwerk

Das Netzwerk ist in der Regel nicht der limitierende Faktor für den Ablauf der Programme auf dem Server, sondern spielt beim Zugriff der Clients auf den Server eine Rolle. Die Antwortzeiten werden größer und somit äußern sich Netzwerkprobleme für den Endanwender wie ein langsamer Server.

Messen der Netzwerk-Antwortzeiten

Ein einfacher Weg die Antwortzeit zu bestimmen, ist es, die Ausgaben der round trip time des ping-Kommandos auszuwerten.

ping -s -I 5 btu0x8
PING btu0x8: 56 data bytes
64 bytes from btu0x8.ub.uni-bayreuth.de (132.180.76.111): icmp_seq=0. time=4. ms
64 bytes from btu0x8.ub.uni-bayreuth.de (132.180.76.111): icmp_seq=1. time=0. ms
64 bytes from btu0x8.ub.uni-bayreuth.de (132.180.76.111): icmp_seq=2. time=0. ms
64 bytes from btu0x8.ub.uni-bayreuth.de (132.180.76.111): icmp_seq=3. time=0. ms
64 bytes from btu0x8.ub.uni-bayreuth.de (132.180.76.111): icmp_seq=4. time=0. ms
^C
----btu0x8 PING Statistics----
5 packets transmitted, 5 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 0/0/4

Eine detailierte Auskunft über die Antwortzeit kann mit dem Kommando traceroute erhalten werden, wo neben dem Endknoten auch die beteiligten Router Auskunft über die Antwortzeiten geben (soweit das dort erlaubt wird). So kann man ermitteln, welchen Weg ein Paket nimmt und wo die meiste Zeit verloren geht.

traceroute www.sisis.de
traceroute to www.sisis.de (193.31.11.194), 30 hops max, 40 byte packets
 1  sn076gate.gate.uni-bayreuth.de (132.180.76.254)  3.505 ms  3.288 ms  3.214 ms
 2  btrzw6.tcore.uni-bayreuth.de (132.180.252.75)  7.248 ms  3.194 ms  2.874 ms
 3  btrzwg.core.uni-bayreuth.de (132.180.254.116)  5.805 ms  0.753 ms  0.560 ms
 4  ar-erlangen1.g-win.dfn.de (188.1.36.1)  1.992 ms  2.091 ms  2.008 ms
 5  cr-erlangen1.g-win.dfn.de (188.1.72.1)  2.251 ms  2.083 ms  2.003 ms
 6  cr-stuttgart1.g-win.dfn.de (188.1.18.218)  12.012 ms  12.031 ms  12.121 ms
 7  cr-frankfurt1.g-win.dfn.de (188.1.18.77)  12.108 ms  11.840 ms  11.764 ms
 8  ir-frankfurt2.g-win.dfn.de (188.1.80.38)  11.819 ms  11.792 ms  11.841 ms
 9  80.81.192.193 (80.81.192.193)  12.179 ms  12.003 ms  12.012 ms
10  213.2.254.46 (213.2.254.46)  12.301 ms  12.444 ms  12.241 ms
11  194.231.40.5 (194.231.40.5)  12.479 ms  12.361 ms  12.461 ms
12  194.77.40.22 (194.77.40.22)  21.290 ms  21.348 ms  21.043 ms
13  212.14.65.30 (212.14.65.30)  21.875 ms  21.967 ms  21.642 ms
14  193.31.11.195 (193.31.11.195)  25.622 ms  25.582 ms  25.552 ms
15  hunter.Sisis.de (193.31.11.194)  26.253 ms  24.783 ms  24.751 ms

Das Kommando netstat gibt Auskunft über die Netzwerkaktivität des Rechners.

netstat -i -I hme0
input   hme0      output           input  (Total)    output
packets errs  packets errs  colls  packets errs  packets errs  colls
36809618 76440 62071250 0     9130179 615314900 76440 640576532 0     9130179
42      0     53      0     0      803     0     814     0     0
61      0     1       0     0      61      0     1       0     0
44      0     2       0     0      44      0     2       0     0

Eine hohe Anzahl von errs deutet auf ein Problem mit dem Netzwerkanschluß hin. Das kann beispielsweise durch ein Verständigungsproblem mit dem Switch entstehen, an dem der Rechner angeschlossen ist. Eine hohe Rate von Kollisionen (colls), z.B. höher als 10%, deutet auf eine hohe Netzwerklast im Segment hin. Hier kann durch den Einsatz eines Switches Abhilfe geschaffen werden. Anhand der Ausgabe des netstat kann der Durchsatz nicht bestimmt werden, da die Größe der Pakete nicht mit angezeigt wird. Es gibt unter Solaris die nicht dokumentierte Option -k, die auch die Ausgabe der empfangenen und gesendeten Bytes ausgibt.

netstat -k | egrep "(hme|obyte)"
hme0:
rx_late_collisions 0 rbytes 3922597235 obytes 4028404831 multircv 30 multixmt 0
ipackets64 36816192 opackets64 62074105 rbytes64 12512531827 obytes64 8563278345
5 align_errors 0

Unter Solaris 8 können diese Angaben mit dem Kommando kstat ermittelt werden.

kstat -p -s "*bytes"
hme:0:hme0:obytes       4031800311
hme:0:hme0:rbytes       3929359189
kstat -p -s "*packets"
hme:0:hme0:ipackets     36833374
hme:0:hme0:opackets     62078862
lo:0:lo0:ipackets       578626990
lo:0:lo0:opackets       578626990

Mit dem frei erhätlichen Tool tcpdump kann der Netzwerkverkehr genauer analysiert werden.

Probleme im Netzwerk beheben

Prozessor

Bei Prozessoren ist das Vorhandensein eines Engpasses nicht ganz einfach zu beurteilen. Wenn die CPUs voll ausgelastet sind, dann muss es sich dabei nicht um eine schlechte Situation handeln. Bei Systemen, die interaktiv Benutzern einen Service anbieten, ist eine zu hohe gemittelte CPU-Belastung (etwa mehr als 70%) ein Hinweis, dass die Antwortzeiten durch eine zusätzliche CPU verbessert werden könnten.

Ermittlung der Systemauslastung

Die Ausgabe des Kommandos vmstat gibt aus, wie beschäftigt die CPUs sind.

vmstat
 procs     memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr m0 m1 m5 m6   in   sy   cs us sy id
 0 0 0 6329992 3389528 45 136 142 1 1 0  0  0  0  2  2 1492  365  671  5  4 91

Die wichtigen Ausgaben sind die prozentuale Benutzung der CPUs durch die Anwendung des Benutzers (us), die Systemfunktionen des Kernels (sy), sowie der Anteil der Idle-Time (id). Weiterhin wird die Belegung der run-Queue (r) ausgegeben, die angibt, wieviele Prozesse auf das Freiwerden einer CPU warten. Zusätzlich wird die Anzahl der Prozesse ausgegeben, die auf einen I/O warten und deswegen blockiert sind (b).

Die Anzahl der Prozesse in der run-Queue gibt einen Hinweis auf einen CPU-Engpass. Die Zahl der Prozesse in der run-Queue dividiert durch die Anzahl der CPUs sollte nicht ständig über 7 liegen. Hohe Zahlen bei den blockierten Prozessen geben einen Hinweis auf einen Flaschenhals im Plattenzugriff. Der Anteil der Auslastung der Benutzeranwendungen sollte typischerweise über dem der Systemfunktionen liegen. Ist das nicht so, dann kann das ein Hinweis auf einen Engpass beim Plattenzugriff oder Netzwerk sein.

Auch das sar-Kommando gibt Auskunft über die Benutzung der CPU. Ohne Option oder mit der Option -u wird die Auslastung der CPU ausgegeben. Dabei wird neben dem Anteil an Anweisungen der Anwendungsprogramme (%usr), der Systemfunktionen (%sys) auch der Anteil ausgegeben, der durch Anwendungen verursacht wird, die auf eine I/O-Funktion warten (%wio).

sar 

SunOS btu0x2 5.8 Generic_108528-13 sun4u    06/24/02

00:00:01    %usr    %sys    %wio   %idle
...
11:20:00      19      13       2      65
11:40:00      22      16       6      56
12:00:00      16      13       3      68
12:20:00      25      21       2      52
12:40:00      32      26       2      40
13:00:00      32      23       3      42
...

Die Anzahl der Prozesse, die auf die Abarbeitung warten, wird mit der Option -q ausgegeben.

sar -q

SunOS btu0x2 5.8 Generic_108528-13 sun4u    06/24/02

00:00:01 runq-sz %runocc swpq-sz %swpocc
...
11:20:00     1.2      10                
11:40:00     1.2      10                
12:00:00     1.2       9                
12:20:00     1.3      17                
12:40:00     1.4      17                
13:00:00     1.3      17
...

Eine differenzierte Ausgabe der CPU-Belastung nach einzelnen CPUs erhält man mit mpstat.

mpstat
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0   33   0 1061   625  523  157    3    5    9    0   763    6   4   2  88
  1   33   0  143   304  296  169    3    6    7    0  2184    5   4   2  89
  2   34   0  143   358  350  173    4    6    7    0  1666    5   4   2  89
  3   34   0  167   304  296  170    4    6    8    0   472    6   4   2  88

Einzelne Prozesse ermitteln

Die Prozesse, die im Sytem am meisten CPU-Last erzeugen, können über das Tool top oder ab Solaris 8 mit prstat ermittelt werden.

prstat
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
   480 sybase    519M  511M sleep   58    0  33:55.56 0.5% dataserver/2
  1344 root     1904K 1688K cpu1    58    0   0:00.00 0.1% prstat/1
 21227 opacweb    36M 9304K sleep   52    0   0:00.09 0.1% OPServer/1
 21225 nobody   9024K 7568K sleep   48    0   0:00.03 0.0% perl/1
   242 root       15M   14M sleep   58    0   0:00.00 0.0% nscd/11
   485 sybase    519M  511M sleep   58    0  33:42.42 0.0% dataserver/2
 27689 root     2328K 1568K sleep   58    0   0:00.00 0.0% sshd1/1
   432 root     4144K 2736K sleep   58    0   0:00.00 0.0% mibiisa/12
   225 root     3552K 1744K sleep   58    0   0:00.00 0.0% syslogd/16
   248 root     3192K  648K sleep   58    0   0:02.14 0.0% lpsched/1
   280 root     1712K   72K sleep   44    0   0:00.00 0.0% smcboot/1
   227 root     2776K 1432K sleep   48    0   0:00.03 0.0% cron/1
   356 root     2192K  504K sleep   59    0   0:00.00 0.0% snmpdx/1
   201 daemon   2520K  736K sleep   50    0   0:00.00 0.0% statd/3
   212 root     3136K 1824K sleep   58    0   0:00.00 0.0% automountd/5
   199 root     2488K  928K sleep   58    0   0:00.03 0.0% inetd/1
   200 root     1912K  320K sleep   50    0   0:00.00 0.0% lockd/1
   264 root     5440K 4120K sleep   58    0   0:00.00 0.0% iplog/5
   138 root     2680K  504K sleep   58    0   0:00.00 0.0% tnsxd/1
   133 root     3760K 2080K sleep   59    0   0:00.00 0.0% ipmon/1
   113 root     2824K  848K sleep   58    0   0:00.00 0.0% devfsadm/7
Total: 395 processes, 489 lwps, load averages: 0.09, 0.08, 0.08

Auch mit dem ps-Kommando kann man eine Liste der Prozesse ermitteln, die die CPU am heftigsten belegen. Dazu kann die Option pcpu verwendet werden, die den Anteil des Prozesses an der verfügbaren CPU angibt.

ps -eo pcpu,pid,ppid,comm | sort -nr | head
 0.5     3     0 fsflush
 0.4   486   480 /home/sybase/pkg/bin/dataserver
 0.2  1442   543 /opt/lib/sisis/opserver/bin/OPServer
 0.2  1440     1 /usr/local/bin/perl
 0.2   480   478 /home/sybase/pkg/bin/dataserver
 0.1 27692 27689 tcsh
 0.1  1491 27692 ps
 0.0 29929   543 /opt/lib/sisis/opserver/bin/OPServer
 0.0 29927     1 /usr/local/bin/perl
 0.0 29819     1 sleep

Mit den Kommandos pstack und truss kann genauer verfolgt werden, was ein Prozess tut. pstack gibt dabei den Stacktrace des Prozesses aus, mit truss kann man verschiedenen Aspekte verfolgen.

Literatur

Hinweis: Die Dokumente sind über Sunsolve oder Sun Developers zu erhalten.


sol_perf.html,v 1.5 2003/02/17 09:43:06 btr010 Exp