Sinds een paar dagen is de refresh van grote Exact Online Incremental tabellen erg traag

Sinds 22-02-2022 is het laden van grote *Incremental tabellen erg traag geworden. in dit geval via Azure Data Factory. Een heel concreet voorbeeld:

select t.[Classification], t.[Classification1], t.[Classification2], t.[Code], t.[Division], t.[ID], t.[Name], t.[Status], t.[StatusSince], t.[Type]
from   ExactOnlineREST.Incremental.AccountsIncremental@eol t

Dit duurt normaal gesproken 5 minuten om ongeveer 450.000 regels te laden. Op dit moment zie ik in de monitor. 160.000 regels, 900 seconden. Dat gaat omgerekend dus ongeveer 45 minuten duren voordat het laden start. Een poging om TransactionLinesIncremental te laden heb ik na 2 uur afgebroken gisteren.

1 like

Advies is om delegatie te verlenen.

De snelheid is met 10.000 regels per minuut zelfs lager dan een download op Exact Online zonder incrementele optie.

Samenvatting

Het probleem is gereproduceerd via delegatie.

De oorzaak lijkt dat het gelijktijdig verwerken voor een tiental of tientallen administraties sterk verslechterd is. Gebruikers met honderden of enkele administraties ervaren geen verschil voor zover bekend en meetbaar.

Een ontwikkelaar zal analyseren wat de vertraging veroorzaakt om de oorzaken weg te nemen. Zodra de oorzaak achterhaald wordt een actieplan bedacht en doorgevoerd. Daarna wordt de verbetering verwerkt in een nieuwe release.

Workaround voor dit moment is om:

  • de timeouts hoger in te stellen
  • waar mogelijk een filter toe te voegen (zie workaround 2)
  • meer downloads parallel uit te voeren

Voor de derde actie is het abonnement tijdelijk omgezet naar een 10-user abonnement met 8 in plaats van 4 parallelle slots tot 10 maart. Hiervoor worden geen extra kosten in rekening gebracht.

Analyse

Een analyse geeft aan dat specifiek voor AccountsIncremental het om circa 115 MB aan gzipped-data gaat (circa 1 GB uncompressed) met meerdere honderdduizenden rijen in circa 10 partities in deze database. Van de 21e februari op de 22e februari is het gedrag veranderd, zie onderstaande tabel.

Aspect 21-2 22-2
Versie 22.0.48 22.0.55
Pure verwerkingstijd (sec) 50 250
#Downloads per dag 1 8

Een andere omgeving met vergelijkbare aantallen in AccountsIncremental en één administratie is ter referentie er naast gelegd om te kijken of het een administratiespecifiek of algemeen probleem is. Hierbij is vreemd genoeg geen trendbreuk zichtbaar voor en na de versieverandering. De doorlooptijden zijn binnen van een marge van 10% vergelijkbaar.

Nog een andere omgeving is ook meegenomen in de vergelijking, maar dan op basis van historische ontwikkelingen op TransactionLinesIncremental. Hiervan is de looptijd echter wel vergelijkbaar gestegen van 21 februari op 22 februari.

Een voornaam verschil tussen release 22.0.48 en 22.0.55 is een andere wijze van parallellisatie van downloads als een rate limiter zoals op Exact Online actief is.

Vervolgens is gekeken wat de verwerkingssnelheid is met een kleine tabel namelijk GLAccountsIncremental. Als de gegevens per administratie achtereenvolgens opgehaald worden, dan duurt dit 500 ms kloktijd per administratie. Bij parallel ophalen duurt dit ruim 1.100 ms kloktijd per stuk, ondanks parallellisme.

Een test met artikelen met serieel verwerken van de administraties geeft hetzelfde aan, serieel duurt 6x zo kort als parallel met acht stromen:

--
-- Serieel.
--
declare
  l_cnt number;
begin
  for r in ( select code, 'eol' from systemdivisions@eol )
  loop
    select count(*)
    into   l_cnt
    from   itemsincremental@eol
    ;
  end loop;
end;

De conclusie tot dusver is dat bij het ophalen van gegevens uit tien of tientallen administraties parallellisme sinds versie 22.0.55 een vertraging veroorzaakt.

Gedurende het testen van de nieuwe release is dit probleem niet naar voren gekomen, maar de testomgevingen zijn ook niet altijd representatief. Zo is er getest op .NET Framework in plaats van .NET Core (waarbij zowel .NET Core op Windows als Linux deze vertraging laten zien).

Test Workaround 1: verlagen parallellisatie

Een korte proef met artikelbestand door de parallellisatie terug te brengen naar 1 leverde geen snelheidswinst op t.o.v. de parallelle verwerking.

Test Workaround 2: filters

Een korte proef met artikelbestand door het datavolume te beperken met een filter (like) toonde een forse snelheidswinst.

Aangezien met de incrementele tabellen eerst alle data verzameld moet worden ook als er een filter is, is blijkbaar het verzamelen van de volledige dataset niet de bottleneck, maar het teruggeven. Ergens is dit een serieuze factor langzamer geworden bij middelmatige aantallen administraties.

Door op het teruggeven een filter op te leggen neemt de snelheid weer toe.

Het probleem is geanalyseerd en er is een oplossing gemaakt. Deze wordt na testen uitgerold naar productie.

Ondertussen is dit probleem opgelost en verloopt het laadproces weer zoals gewenst.