Waarom een Cached Map Service testen<\/SPAN>?<\/SPAN><\/H1>Cached map services zijn een populaire en aanbevolen manier om een goed presterende presentatie van statische gegevens te bieden. Het cache service type is een bewezen technologie, maar er kunnen nog steeds vereisten zijn om het onder belasting te testen om de schaalbaarheid uit de eerste hand te observeren op een specifieke implementatiearchitectuur. Hoewel cached map services goed presteren, kan het bedienen van duizenden gelijktijdige tegelverzoeken intensief zijn voor de serverhardware.<\/SPAN><\/P>Opmerking: Vanwege het snelle tempo van levering en consumptie van de resource kan het load testen van cached map services ook intensief zijn voor het hardwaregebruik van het testclientwerkstation.<\/STRONG><\/FONT><\/P>Uitdagingen bij het testen van Cached Map Services<\/H1>In vergelijking met het load testen van de exportmapfunctie brengt het juiste<\/EM> testen van een cached map service verschillende uitdagingen met zich mee omdat de samenstelling van het verzoek verandert met elk kaartscherm. Aangezien het onderliggende cache-schema een rasterontwerp gebruikt, kunnen de kaartuitbreidingen van sommige pans of zooms meer of minder tegelafbeeldingen ophalen dan andere. Rekening houden met dit realistische gedrag van de cache service maakt de testlogica complexer dan wanneer de exportmapfunctie zou worden getest.<\/SPAN><\/P>De testlogica moet ook dynamisch zijn en een behoorlijk interessegebied bestrijken. Het converteren van een HAR-bestand met vastgelegde cache-tegelverzoeken naar een test kan snel en eenvoudig zijn, maar toont geen realistische schaalbaarheid van de service. Dit komt door het kleine monster van tegelverzoeken dat steeds opnieuw wordt gebruikt.<\/SPAN><\/P>Over het algemeen zijn verzoeken voor individuele cache-tegels snel... zeer<\/EM> snel. Vanwege dit gedrag moet de testlogica ook goed presteren, schalen met de service en minimale overhead hebben op de testclient.<\/SPAN><\/P>Hoe test je een <\/SPAN>Cached Map Service?<\/SPAN><\/H1>De stappen in dit artikel zouden moeten werken met elke bestaande cached map service op je lokale ArcGIS Enterprise-implementatie. Als er echter geen beschikbaar is, wordt aanbevolen om eens naar de Natural Earth dataset te kijken voor deze taak.<\/SPAN><\/P>De Natural Earth Dataset<\/H2>Hoewel de stappen zouden moeten werken met elke data, kan de doorloop van het proces in dit artikel effectiever zijn als ze direct gevolgd kunnen worden. In zulke gevallen is het geweldig om terug te vallen op de Natural Earth datasets<\/A> die wat behoorlijke kaartdetails bieden (op kleinere schalen) die de hele wereld bestrijken.<\/SPAN><\/P>Download hier de Natural Earth dataset<\/A><\/STRONG> - De download<\/SPAN> hierboven is een subset van het grotere <\/SPAN>
Natural_Earth_quick_start.zip<\/A> en bevat een aangepaste MXD voor ArcMap 10.8.1 en ArcGIS Pro 2.8 project- Beide kunnen worden gebruikt om een cached map service te publiceren en te creëren in ArcGIS Enterprise<\/SPAN><\/LI><\/UL><\/LI><\/UL><\/LI>De Natural Earth subset van data zou er ongeveer zo uit moeten zien wanneer geopend in ArcGIS Pro (of ArcMap)<\/SPAN><\/LI><\/UL>
<\/span><\/SPAN><\/P>Dit artikel zal niet<\/EM> <\/STRONG>de details behandelen over het creëren, configureren of publiceren van een cached map service in ArcGIS Enterprise. Voor informatie over dergelijke acties, zie:
Tutorial: Een cached map service creëren<\/A><\/STRONG> <\/LI><\/UL><\/LI><\/UL>Opmerking: Het wordt aanbevolen om vertrouwd te raken met enkele metadata details van de cached map service aangezien de load testing inspanning kennis vereist over sommige van die informatie (bijv. xorigin, yorigin, tileCols, tileRows en ruimtelijke referentie evenals de schalen die tegels bevatten).<\/STRONG><\/FONT><\/P>
Genereren van Testgegevens<\/SPAN><\/H2>Met een beschikbare cached map service is de volgende stap om testgegevens te genereren over een interessegebied.<\/SPAN><\/P>Zoals bij andere JMeter-artikelen op Community hebben we goede testgegevens nodig om zoveel mogelijk waarde uit de resultaten te halen. En net als eerder maakt het Load Testing Tools<\/A> pakket (voor ArcGIS Pro) dit werk snel gedaan. Er is zelfs een specifieke tool voor het maken van bounding box data om te gebruiken met cached map services.<\/SPAN><\/P>Opmerking: Versie 1.3.0 van Load Testing Tools voegde de "Generate Bounding Boxes (Precision)" tool toe.
Download en pak het pakket uit en maak die map beschikbaar voor je ArcGIS Pro-project.
De Generate Bounding Boxes (Precision) Tool<\/><\/>Het starten van de Generate Bounding Boxes (Precision) tool zou een interface moeten tonen die vergelijkbaar is met het volgende:<\/><\/><\/><\/>< P >
< /span >< /SP AN >< / P >Voordat we de tool uitvoeren, passen we de invoer aan om het gegevensgeneratieproces te richten op:Specifieke kaartschaalniveaus (in dit geval drie verschillende schalen)Schalen 4622324.434309 en 1155581.108577 werden behouden< /SP AN >< / LI >Schaal 2311162.217155 werd toegevoegd< /SP AN >< / LI >Het aantal records dat gegenereerd moet worden werd aangepast om grotere kaartschaalniveaus weer te gevenNaarmate het schaalnummer daalt, willen we dat de tool meer boxen genereert < /SP AN >< / LI >< / UL >< / LI >< / UL >< / LI >Een specifiek interessegebied (optioneel)
Een polygoon van de Verenigde Staten werd toegevoegd aan een nieuwe kaart< /LI >Deze feature werd ingesteld als het Constraining Polygon< /LI >< / UL >< / LI >< / UL >< / LI >< / UL >< P >
< /span >< / P >Klik op UitvoerenHet uitvoeren van de tool kan even duren< /LI >< / UL >< / LI >< / UL >Visualiseren van de gegenereerde gegevens in ArcGIS Pro<\/><\/>Het Contents-scherm wordt gevuld door een nieuwe featureklasse toe te voegen die visueel de gegenereerde gegevens weergeeftNiet alle gegenereerde kaartschaalniveaus zullen onmiddellijk zichtbaar zijn< /LI >< / UL >< / LI >< / UL >< P >
< /span >< / P >Visualiseren van de gegenereerde gegevens in een teksteditor<\/><\/>Gebruikmakend van de bestandsverkenner navigeer naar het gebruikte ArcGIS Pro-project voor het genereren van gegevens en open één van de csv-bestanden met je favoriete teksteditorDe inhoud van het bestand zou er ongeveer zo uit moeten zien:< /LI ></ P >
< / P > De Apache JMeter-test wordt geconfigureerd om elk van deze bounding boxes om te zetten in overeenkomstige cache map tiles < / LI > < / UL > < H1 id= "toc-hId--1192128588">Het Cached Map Service Testplan <\/><\/> Om het Apache JMeter Testplan te downloaden dat in dit artikel wordt gebruikt, zie: cache_tiles1.zip <\/><\/> < LI >Het openen van het Testplan in Apache JMeter zou er ongeveer zo uit moeten zien: < LI >Pas de door gebruiker gedefinieerde variabelen aan zodat ze bij jouw omgeving passen < LI >Xorigin, Yorigin, TileCols, TileRows zijn eigenschappen van de gemaakte map cache die te vinden zijn op de REST endpoint pagina van de serviceTileCols en TileRows worden meestal gevonden onder Tile Info Hoogte en Breedte
Componenten van het Test Plan
CSV Data Set Config
De CSV Data Set Config elementen in JMeter worden gebruikt om te verwijzen naar de nieuw gegenereerde testgegevens vanuit het bestandssysteem. De huidige versie van het Test Plan is gebouwd om 3 verschillende CSV-bestanden te gebruiken (één voor elk map schaal data bestand).

Opmerking: Behalve de User Defined Variables en het instellen van de Filename in de CSV Data Set Config elementen, zou er niets anders bewerkt of veranderd hoeven te worden in het Test Plan. De testlogica wordt hieronder vermeld alleen om uit te leggen hoe de waarden in het HTTP Request worden ingevuld.
Levels Of Detail List Logic
Om complexere JMeter testlogica te vermijden, zijn 24 vaste map cache detailniveaus geplaatst binnen een klasse in een JSR223 Sampler testelement. Dat "complexe alternatief" zou zijn om aan het begin van de test verbinding te maken met de endpoint van de service en de cache tegel metadata op te halen. Het plaatsen van HTTP-logica in JSR223 Samplers is technisch mogelijk, maar niet de route die ik gekozen heb.
- Er is slechts één JSR223 Sampler binnen de Levels Of Detail Transaction
- Dit item wordt slechts één keer uitgevoerd, aan het begin van elke test thread
- Het element bevat 24 vaste cache detailniveaus, met niveau 0 beginnend bij schaal 591657527.591555
- Als uw cache schema begint bij een andere schaal voor 0, dan moet de JSR223 Sampler handmatig worden aangepast
- Deze JSR223 Sampler hoeft niet bewerkt te worden om de test uit te voeren
- Dit gaat ervan uit dat de cached map service een Spatial Reference heeft van 102100 (3857)

Levels Of Detail -- JSR223 Sampler (Volledige Logica):
// FileServer class
import org.apache.jmeter.services.FileServer
public class Lod{
int level
double resolution
double scale
double tolerance
}
public class MyLodList1{
public List<Lod> LodList = new ArrayList()
MyLodList1(){
// Gebaseerd op ArcGIS Online Map Scales
// https://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer
//
// Spatial Reference: 102100 (3857)
Lod lod = new Lod()
lod = new Lod()
lod.level = 0
lod.resolution = 156543.03392800014 //11
lod.scale = 591657527.591555
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 1
lod.resolution = 78271.51696399994 //11
lod.scale = 295828763.795777
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 2
lod.resolution = 39135.75848200009 //11
lod.scale = 147914381.897889
lod.tolerance = 0.25
this.LodList.add(lod)
lod = new Lod()
lod.level = 3
lod.resolution = 19567.87924099992 //11
lod.scale = 73957190.948944
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 4
lod.resolution = 9783.93962049996 //11
lod.scale = 36978595.474472
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 5
lod.resolution = 4891.96981024998 //11
lod.scale = 18489297.737236
lod.tolerance = 0.5
theis.LodList.add(lod)
lod = new Lod()
lod.level = 6
lod.resolution = 2445.98490512499 //11
lod.scale = 9244648.868618
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 7
lod.resolution = 1222.9924525624949 //13
lod.scale = 4622324.434309
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 8
lod.resolution = 611.49622628137968 //14
lod.scale = 2311162.217155
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 9
lod.resolution = 305.74811314055756 //14
lod.scale = 1155581.108577
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level = 10
lod.resolution = 152.87405657041106 //14
lod.scale = 577790.554289
lod.tolerance = 0.5
this.LodList.add(lod)
lod = new Lod()
lod.level=11
dol.resolution=76.437028285073239 //15
dol.scale=288895.277144
dol.tolerance=0.5
theis.LoddList.add(dol)
theis.LoddList.add(dol)
theis.LoddList.add(dol)
theis.LoddList.add(dol)
theis.LoddList.add(dol)
theis.LoddList.add(dol)
theis.LoddList.add(dol) bbox_scale_double = Double.parseDouble(scale_var)
// Kaart eenheden per pixel
double tileresolution = 0
double lod_resolution = 0
double scale = 0
int tilelevel = 0
LodList = vars.getObject("LodList") // Aangenomen dat de gecachte kaartservice een Spatial Reference van 102100 (3857) heeft
boolean firstIteration = true;
for(int i = 0; i < LodList.size; i++)
{
lod_resolution = Precision.round(LodList[i].resolution, resolutionprecision)
tileresolution = lod_resolution
tilelevel = LodList[i].level
scale = LodList[i].scale
if (mapresolution >= lod_resolution)
{
break
}
}
tileCols_var = vars.get("TileCols")
cols = Double.parseDouble(tileCols_var)
tileRows_var = vars.get("TileRows")
rows = Double.parseDouble(tileRows_var)
// Oorsprong van de cache (linksbovenhoek)
xorigin_var = vars.get("Xorigin")
xorigin = Double.parseDouble(xorigin_var)
yorigin_var = vars.get("Yorigin")
yorigin = Double.parseDouble(yorigin_var)
// Verkrijg minimum tegelkolom
double minxtile = (xmin - xorigin) / (cols * tileresolution)
// Verkrijg minimum tegelrij
// Vanaf de oorsprong is maxy minimum y
double minytile = (yorigin - ymax) / (rows * tileresolution)
// Verkrijg maximum tegelkolom
double maxxtile = (xmax - xorigin) / (cols * tileresolution)
// Verkrijg maximum tegelrij
// Vanaf de oorsprong is miny maximum y
double maxytile = (yorigin - ymin) / (rows * tileresolution)
// Retourneer gehele waarde voor min en max, rij en kolom
int mintilecolumn = (int)Math.floor(minxtile)
int mintilerow = (int)Math.floor(minytile)
int maxtilecolumn = (int)Math.floor(maxxtile)
int maxtilerow = (int)Math.floor(maxytile)
Scheme_var = vars.get("Scheme")
WebServerName_var = vars.get("WebServerName")
ServerInstanceName_var = vars.get("ServerInstanceName")
ServiceName_var = vars.get("ServiceName")
ServiceType_var = vars.get("ServiceType")
def cacheRequest
def tilePaths = []
int count = 0
for (int row = mintilerow; row <= maxtilerow; row++)
{
// voor elke kolom in de rij, binnen de kaartuitbreiding
for (int col = mintilecolumn; col <= maxtilecolumn; col++)
{
cacheRequest = ("/").concat(ServerInstanceName_var).concat("/rest/services/").concat(ServiceName_var).concat("/").concat(ServiceType_var)
cacheRequest = cacheRequest.concat("/tile").concat("/").concat(tilelevel.toString()).concat("/").concat(row.toString()).concat("/").concat(col.toString())
count++
tilePaths.add(cacheRequest)
}
}
def requestCount = count.toString()
vars.putObject("RequestCount_A",requestCount)
vars.putObject("TilePaths_A",tilePaths)
Cache Tile Loop en Pad Populatie
Er zijn verschillende componenten nodig voor dit deel van het Test Plan. Met de bounding box vertaald naar de overeenkomstige cache tegels en samengesteld in een lijst met URL's, is een derde JSR223 nodig om elke URL in een variabele te plaatsen binnen een lus. De luslogica vindt plaats binnen de Cache Tiles transactie.
- Er is één JSR223 Sampler voor elke kaart schaal
- CSV Data Set Config A --> JSR223 Sampler A2
- Deze JSR223 Samplers hoeven niet te worden aangepast om de test uit te voeren
- Er is een Loop Controller toegevoegd om alleen het daadwerkelijke aantal tegels per bounding box op te vragen aangezien dit aantal kan variëren per extent
- Het aantal tegels dat overeenkomt met elke bounding box varieert per extent maar ook door de kaartresolutie (1920x1080)
- Hogere schermresoluties vereisen meer tegels
- De Loop Controller bevat de volgende elementen:
- Teller
- JSR223 Sampler
- HTTP Request
Loop Controller

Teller

JSR223 Sampler

HTTP Request
Alle testlogica hierboven bestaat alleen voor dit onderdeel van de test. Voor elke kaart schaal is er slechts één HTTP Request! Dit eenvoudige ontwerp bevordert leesbaarheid en onderhoudbaarheid.

Opmerking: De HTTP Requests bevatten een Response Assertion element om de items die van de server worden teruggegeven te valideren. Als het contenttype van de respons image/jpeg of image/png is, zal het verzoek slagen. Sommige VectorTileServer caches kunnen echter een Protocolbuffer Binary Format (*.pbf) bestand teruggeven. In deze gevallen moeten de Patterns to Test handmatig worden uitgebreid naar het volgende: image/jpeg || image/png || application/octet-stream || application/x-protobuf
De Thread Group Configuratie
Het JMeter Test Plan is momenteel geconfigureerd voor een relatief korte test van 20 minuten. Gecachte kaartservices presteren goed, dus veel doorvoer zal plaatsvinden binnen elke stap (2 minuten per stap) en gedurende de hele test.
- Verschillende omgevingen kunnen een alternatieve drukconfiguratie vereisen om de gewenste testresultaten te bereiken, pas aan indien nodig

Validatie van het Test Plan
Als beste praktijk is het altijd een goed idee om de terugkomende resultaten te valideren voordat u de daadwerkelijke load test uitvoert.
- Gebruik de View Results Tree listener om te helpen bij de validatie
- Het Test Plan bevat een View Results Tree Listener maar deze is standaard uitgeschakeld
- Zet deze aan om de resultaten te bekijken
- Start vanuit de GUI de test
Transacties
- Selecteer één van de "Cache Tiles" Transacties
- De resultaten zouden er als volgt uit moeten zien:

- In dit voorbeeld zijn alle transacties succesvol voltooid (bijv. het groene vinkje)
- Cache Tiles (kaart schaal: 4622324.434309)
- Cache Tiles (kaart schaal: 2311162.217155)
- Cache Tiles (kaart schaal: 1155581.108577)
- Door één van de transacties en het Sampler resultaat element te selecteren wordt wat belangrijke informatie weergegeven
- Kijk snel naar de grootte in bytes
- In het bovenstaande voorbeeld was de transactiegrootte meer dan 50KB wat suggereert dat er behoorlijke tegeldata werd teruggegeven (voor deze dataset) en dat de responses niet allemaal "lege" afbeeldingen waren
- Aantal samples in de transactie was 80
- Aangezien er een JSR223 Sampler is bij elk tegelverzoek resulteerde dit eigenlijk in het downloaden van 40 tegels
- De laadtijd toont 62 ms, wat betekent dat het slechts 0,062 seconden duurde om 40 tegelafbeeldingen te downloaden
Verzoeken
- Bewerk de geselecteerde Transactie
- In dit voorbeeld, Cache Tiles (kaart schaal: 1155581.108577)
- Selecteer één van de HTTPS verzoeken
- De resultaten zouden er als volgt uit moeten zien:
role="button" title="cachemap_jmeter_validation_request1.png" alt="cachemap_jmeter_validation_request1.png" "/><\/span><\/SPAN><\/P>In dit voorbeeld is het selectieverzoek <\/SPAN>succesvol (bijv. het groene vinkje)<\/SPAN><\/LI>Kijk snel naar de Laadtijd<\/SPAN>In dit voorbeeld duurde het individuele tegelverzoek slechts 2 ms (0,002 seconden) om te downloaden<\/SPAN><\/LI><\/UL><\/LI>Door op het tabblad Response data te klikken, kunt u een voorbeeld van de gevraagde tegel bekijken:<\/SPAN><\/LI><\/UL>
<\/span><\/SPAN><\/P>Opmerking: Zodra visuele validatie en debugging voltooid zijn, wordt aanbevolen het View Results Tree-element uit te schakelen voordat u de loadtest uitvoert<\/STRONG><\/FONT><\/P>Testuitvoering<\/H1>De loadtest moet op dezelfde manier worden uitgevoerd als een typische JMeter Test Plan.<\/P>Zie het runMe.bat-script dat is meegeleverd met het cache_tiles1.zip project voor een voorbeeld van hoe u een test uitvoert zoals aanbevolen door Apache JMeter. <\/P>Het runMe.bat-script bevat een jmeterbin<\/EM> <\/SPAN>variabele die moet worden ingesteld op de juiste waarde voor uw omgeving<\/LI><\/UL>Opmerking: Het is <\/SPAN>altijd aanbevolen<\/U><\/EM> <\/SPAN>om de starttijd en duur van de loadtest af te stemmen met de juiste personen binnen uw organisatie. Dit zorgt voor minimale impact op gebruikers en andere collega's die mogelijk ook uw on-premise ArcGIS Enterprise Site moeten gebruiken. Bovendien helpt dit om systeemruis<\/EM> van andere activiteiten en gebruik te voorkomen die uw testresultaten kunnen "vervuilen".<\/STRONG><\/FONT><\/P>Opmerking: Om verschillende redenen wordt sterk afgeraden om <\/SPAN>Nooit een loadtest uit te voeren op ArcGIS Online<\/EM><\/U>.<\/STRONG><\/FONT><\/P>JMeter-rapport<\/H1>Het automatisch gegenereerde JMeter-rapport kan inzicht geven in de doorvoer van de cached map service onder belastingDit rapport wordt automatisch gegenereerd op basis van de opdrachtregelopties die zijn doorgegeven vanuit het runMe.bat-script<\/LI><\/UL><\/LI><\/UL>Doorvoercurve<\/H2>Het JMeter-rapport voor een cached map service loadtest kan traag en langzaam lijken wanneer bekeken in een webbrowserDit komt door de standaardopbouw, die probeert elk uniek verzoek in sommige grafieken weer te gevenIn een test zoals deze zullen er veel zijn<\/LI>Selecteer in de legenda van de grafiek alle JSR223 Sampler-items om hun weergave uit te schakelen (aangezien ze de schaal kunnen vertekenen)<\/LI><\/UL><\/LI><\/UL><\/LI>In dit geval was de piekdoorvoer voor een van de gegeven kaarttransacties van cached tiles ongeveer 15 transacties per secondeAangezien 3 kaartschalen werden getest, was het totaal aantal transacties per seconde 45 transacties per secondeDit kwam neer op ongeveer 162.000 cachetransacties per uur <\/LI><\/UL><\/LI>De piekdoorvoer lijkt plaats te vinden rond 10:34 uur<\/LI><\/UL><\/LI><\/UL>