Version 1.5Version history:
Version 1.5 (2020-05-18) Separate print formatting added.
Version 1.4 (2020-05-17) Moved version history to tooltip. Improved introduction.
Version 1.3 (2020-05-16) Improved the note functionality
Version 1.2 (2020-05-16) Added more checklist items
Version 1.1 (2020-05-15) Added more introduction text
Version 1.0 (2020-05-14) Initial HTML version converted from Excel
Kapacitet och prestanda är två viktiga kvalitetegenskaper. Det kan vara svårt att få kontroll så att man känner sig trygg med prestanda. Denna checklista är framtagen för att, i workshop-form ledd av en erfaren prestandaspecialist, identifiera hur man bäst ska förhålla sig till prestandarisker.
Ett systems prestanda kan stjälpas av tusentals olika orsaker. Att få kontroll på alla dessa så att man känner sig trygg kan vara en utmaning. Denna utmaning blir ännu större när man går mot kontinuerliga produktionssättningar.
Som bäst brukar en sådan typ av workshop fungera om den leds av en erfaren prestandaspecialist och består av:
Många gånger försöker man säkra prestandarisker så tidigt som det är lämpligt. Många typer av kodrelaterade problem går att lösa direkt i IDE:n, genom dess profilers.
Ytterligare andra, som samtidighetsbuggar, går att hitta i enhetstester som säkrar prestanda. Några kräver integrerade system med access till riktiga databaser snarare än de minnesdatabaser eller mockade databaser som är vanliga vid enhetstester.
Vissa typer av prestanaproblem, som onödiga full-table-scans i databaser, blir ett problem först vid produktionsvolymer av data - och ibland kanske först efter några års användning av systemet så att det har accumulerat tillräckligt mycket data för att det ska bli ett problem.
En del typer av prestandaproblem, som t.ex. suboptimalt konfigurerad middleware eller infrastruktur, eller dåligt indexerade databaser, eller IPS:er som är onödigt grundliga, kan behöva genomföra prestandatester på en högre nivå.
Vid denna typ av prestandatest skapar man skript som på protokollnivå simulerar en i väsentliga aspekter produktionslik last mot ett system. Under tiden lasten sakta ökas monitorerar man nyckelparametrar i resursanvändningen av systemet. Det kan röra sig om CPU, RAM, I/O, connection pool, kölängder, cache-nyttjande, svarstider, felfrekvens och mycket mer.
Risktyp | Åtgärd |
---|---|
Resurskrävande datatyper i kod | Profilers i IDE |
Onödiga loopar i kod | Profilers i IDE, eller väldigt sent i APM-verktyg |
Onödigt frekventa accesser till samma datapost (t.ex. metadata) | Mätning av läs- och skriv-lås under last |
Svarstider för enskilda API endpoints | Automatiserade tester med rimliga testdatamängder i CI-pipeline |
Icke-parallelliserade API:er | Enhetstester som testar parallellitet |
Under- eller överdimensionerad connection pool | Nyttjandemätning under last |
Felkonfigurerad cache | Verifierande tester |
Resurskrävande SQL-anrop i kod (full table scan och liknande, eller felindexerat, eller tillkrånglat databasschema) | Profilers i DB Manager, eller genom ledtrådar från APM-verktyg |
Felkonfigurerad middelware | Black-box prestandatester |
Feluppskattad last (fler användare/transaktioner än trott) | APM-verktyg, aktiv övervakning i produktion |
Felkonfigurerad infrastruktur (lastbalanserare o.dyl.) | Verifierande tester |
Övernitiska IPS:er och andra säkerhetslösningar | Black-box prestandatester |
Begränsad hårdvara eller otillräcklig resurstilldelning till virtualiserade serverkomponenter | Black-box-tester med monitorering av resurser |
Missnöjda användare på grund av långa svarstider | Pålagd last på hela systemet kompletterat med probing client |
Långsamt allt sämre prestanda över tid | Skapande av en massa poster i databaserna för att simulera framtida läge, därefter fullskaligt prestandatest |
Incidenter på grund av fulla loggdiskar eller andra resurser som tar slut | Övervakning i produktion |
Infrastruktursfunktioner som går fel (fail-over, spawnande av nya frontservrar o.s.v.) | Verifierande tester |
Produktionsplanering som inte hinner med schemalagda jobb | Verifierande tester |
Samtidighetsproblem (t.ex. deadlocks) | Verifierande integrationstester i CI-flödet |
Denna lista kan göras hur lång som helst. Det viktiga att ta med sig är att säkra varje prestandarelaterad risk för sig.
Begrepp | Betydelse |
---|---|
Virtuell användare | En simulerad användare som använder systemet. Ibland är detta synonymt med antalet trådar mot systemet under test, men i t.ex. webbläsarbaserade system hämtas serverresurser med parallella trådar för varje användare. |
Korrelering | I en kommunikation mellan en klient och en server fångas ett datafält ur ett svar från en server och återanvänds i senare request. |
Parameterisering | Om man använder samma data i många parallella trådar testar man bara cache-funktioner. Man brukar därför parameterisera, byta ut, t.ex. användarkonto och liknande i en konversation mellan en klient och en server. |
Monitorering | Kontinuerlig övervakning av relevanta mätpunkter på server, applikation, middleware och infrastruktur under last. |
Användarscenario | De transaktioner som en simulerad (virtuell) användare av en viss kategori genomför i systemt. |
Lastscenario | Viktad last över en testomgång. Hur skalas användarscenarion upp och ner. |
Synkroniseringspunkt | Punkt i ett lastscenario där de virtuella (simulerade) användarna väntar in varandra. Används mest i samtidighetstester. |
Probing client | En manuellt, eller automatiserad, hanterad applikationsklient som utför aktiviteter i den faktiska applikationsklienten undertiden en last ligger på systemet. Den används för att dels känna av upplevd svarstid och dels rimlighetsbedöma effekten av den pålagda lasten. |
Det finns flera olika sätt att se till att ett system nås av en last.
MQ-köer och liknande kan stoppas upp under några timmar (stänga ner broker-tjänsten). När den senare öppnas igen kan man mäta hur lång tid det tar för mottagande system att bearbeta de uppköade meddelandena och därigenom dra slutsatser över om kapaciteten är tillräcklig.
Verktyg som Oracles ORA genomför detta på transaktionsnivå i databaser. Man tar en snapshot av en databas och sparar sedan undan en logg med transaktioner som sker i produktion och läser sedan på dessa igen mot den undansparade snapshot av databasen för att mäta om kapaciteten är tillräcklig.
I event-store-arkitekturer är detta en väldigt tillgänglig metod att skapa verklighetstrogen last. En del använder detta för att dagligen kontrollera vad som hade hänt om man haft nattens applikationsbygge i produktion.
Många prestandatestverktyg lägger på en syntetisk last mot systemet. Nästan alla dessa verktyg arbetar på transport-protokollnivå och skapar REST-anrop eller liknande mot ett system. Dessa paralleliseras sedan.
Några system använder handgrepp mer eller mindre fulla systemklienter för att skapa last (t.ex. MicroFocus TrueClient). Det ger ett ganska smidigt scriptskapande, men också stor footprint per virtuell användare.
Det finns flera strategier för att hantera testdata i prestandatester. Vilken som är bäst beror på systemet och syftet med prestandatesten.
Ibland har man lyxen att kunna använda produktionsdata, antingen genom att datat i systemet har så tydlig och ensad struktur, eller att det bara är läsande tjänster och där data spelar mindre roll.
Ett prestandatestverktyg är utmärkt för att göra saker parallellt och repetitivt. Det kan användas genom att man skapar ett förberedelseskript som skapar upp en massa användbara ärenden i systemet inför ett test. Det kan vara bra att tänka på att man inte bör lägga på för tung last när dessa ärenden skapas upp eftersom det inte är ett lasttest.
I de flesta IT-system har allt data ett livscykelflöde som beror på affärsflödena. Genom att göra script som följer affärsflödena hela vägen från att ett ärende (eller motsvarande) skapas till dess det avslutas så får man skript som är självförsörjande på sitt eget testdata.
Ofta går det att be en databasadministratör att ta fram en lista på användbara dataposter för ett test. Denna metod bygger också på att man betänker att det kan vara bra att ha återställningspunkter för miljön så att det går att göra omtester utan att man känner att man förbrukat data.
Vid denna metod blir det lite pyssligt att hålla på med indexuppräkning i data-listan vid varje provkörning av scripten vid scriptskapande.
Med denna metod får man även en kontroll på att man har förstått datastrukturen eftersom specialfall oundvikligen kommer upp. Det kan också bli väldigt mycket skriptande samt att utsökningen i sig riskerar att lägga på extra last som påverkar så att lastmönstret inte blir verklighetsaktigt.