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.
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.
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 |
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:
veränderte Seiten des Filesystems werden geflushed.
Seiten von Anwendungen werden in den Swapbereich ausgelagert, damit Speicher für eine andere Verwendung frei wird.
Eine Anwendung benötigt mehr Speicher und Swapspace wird hinzugefügt
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
Anwendungsprogrammen (text, stack, heap und shared Memory)
Betriebssystemkern
Cache der Filesystemverwaltung
Ä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 |
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 |
Neben dem Kommando pmem sind in dem Package memtool weitere Kommandos enthalten, die eine Übersicht über die Speicherauslastung des Systems geben.
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 |
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 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 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 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.
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 |
Speicher zum System hinzufügen.
Ein-/Ausgaben über UFS verringern
Speicher für den Buffer-Cache verringern. Dies führt zwar zu höherem I/O der Datenbank, ist aber dem Paging vorzuziehen.
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.
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.
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.
Layout der Datenbank optimieren, indem stark benutzte Tabellen gut auf die Platten verteilt werden.
stark beanspruchte Teile auf möglichst viele Platten verteilen, so dass ein gutes Striping erreicht wird.
Erhöhung des Buffer Cache der Datenbank, wenn kein Speicherproblem vorhanden ist und das Problem bei den Zugriffen auf Datenbankdevices auftritt.
Mehr Kontroller und Platten am System anschließen.
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.
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.
Fehlerquellen ermitteln, z.B. die Anschlußeinstellungen am Switch prüfen
Netzwerke logisch in mehrere Teile aufteilen
Eventuell Netzwerklast auf mehrere Netzkarten aufteilen
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.
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 |
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.
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