Vi testar: Snowflake prestanda

2 februari 2019

Prestanda i Snowflake

Senaste året har jag genomfört ett stort antal proof-of-concept för olika kunder och gjort prestandatester mellan Snowflake och kundernas traditionella databaslösningar. Här tänkte jag dela mina erfarenheter och resultat.

Om du inte har koll på Snowflake kan det vara en bra idé att först läsa Sammys blogg om vad Snowflake är. Den korta beskrivningen är annars att det är en molndatabas för data warehousing.  Det som gör Snowflake unikt är extremt skalbar kapacitet och concurrency. Dessutom mycket är det mycket enkelt att styra sina kostnader då Snowflake bara tar betalt per sekund ett Warehouse är startat. Men som sagt, läs Sammys intro så förstår du mer om konceptet med Warehouses som kraften bakom dina databasfrågor.

Frågor i Snowflake

För att köra en fråga i Snowflake måste man definiera ett Warehouse (Compute). OBS – Förväxla inte med begreppet ”data warehouse”. Med ”Warehouse” i Snowflake menas enbart processorkraft (Compute). Du kan ha hur många Warehouses som helst och de kostar inget så länge de inte är startade. Normalt brukar man skapa olika Warehouse för olika användargrupper som alla har access till samma data. Till exempel ett Warehouse för ETL jobb och ett för Analysanvändare. Viktigt att komma ihåg här är att eftersom Storage (Lagring) och Compute (Warehouse) är separerat i Snowflake så handlar denna blogg bara om Warehouse. Detta då alla Warehouse i våra tester har access till samma data och skillnaden i prestanda och pris i Snowflake beror på hur du använder dina Warehouses.

Skapa ett Warehouse

När man skapar ett Warehouse finns det ett antal settings man alltid bör sätta förutom Warehousets namn:

 

Auto suspend gör att Warehouset stänger ner sig så fort inga fler frågor kommer. Här väljer man hur många minuter (eller sekunder) utan frågor Snowflake ska vänta innan Warehouset stängs ner.

Auto Resume gör att Warehouset startar så fort en fråga ställs. Att starta ett Warehouse tar mindre än en sekund och ger minimal overhead

Dessa två inställningar tillsammans gör att man aldrig behöver betala för mer compute än den man använder. När inga frågor körs mot databasen är dessa warehouse avstängda och compute kostar ingenting.

Scale Up – Snabbare svar

Storleken på ditt Warehouse bestämmer hur snabbt frågor tar att exekvera. Kom ihåg, Warehouse i Snowflakevärlden betyder processorkraft, Compute. Här kan man alltså få snabbare frågor genom att skala upp sitt Warehouse, Scale Up.

Warehouse i Snowflake definieras som t-shirt storlekar från XS till 4XL.  Varje steg ger dubbelt så mycket kraft som det föregående steget.

XS kostar 1 credit per timme
S kostar 2 credits per timme
M kostar 4 credits per timme
Osv..

Men man kan räkna med att 1 credit kostar från 2 USD och uppåt. Priserna varierar lite mellan om man kör Standard eller Enterprise edition, samt om man kör Snowflake på AWS eller Azure och i vilken region.  Se fulla prislistan här: https://www.snowflake.com/pricing/

Om en normal fråga tar:

40 sekunder på ett Warehouse med storlek XS så bör den ta
20 sekunder på ett Warehouse med storlek S och
10 sekunder på ett Warehouse med storlek M
Osv..

Det finns begränsningar här, tex om datasetet i frågan är för litet så kommer man till en nivå där det inte går att parallellisera mer och man inte tjänar på att skala up warehouse storleken mer. Så väldigt små frågor på lagom datamängder kan man lätt låta köra på ett warehouse av storlek XS.

Scale Out – Fler svar samtidigt

Scale Out kan man använda om man har många samtidiga frågor och vill att deras tider inte ska påverkas av varandra. Detta är en feature som endast finns på Snowflake Enterprise Edition. För att använda sig av detta räcker det att man definierar maximalt antal cluster man vill kunna skala ut till.

Om man inte anger något här eller om man kör Snowflake Standard Edition klarar varje kluster 8 samtidiga frågor. Övriga frågor mot detta Warehouse köas tills någon tråd blir ledig. Men om man t ex sätter ”Maximum Clusters” till 5 så kommer Snowflake efter 8 simultana frågor automatiskt direkt skala ut till 2 kluster så att man har 16 parallella trådar. När fråga 17 kommer (Förutsatt att ingen annan fråga hunnit bli klar innan) så skalar Snowflake direkt ut till 3 kluster osv. Detta gör att man lätt kan ha 100-tals simultana frågor utan några problem. När sedan lasten går ner så skalar Snowflake automatiskt ner och stänger de kluster som inte används Då slutar de också direkt kosta pengar.

Dags för några konkreta exempel på Scale Up och Scale Out

Detta är i princip det man behöver veta om hur Snowflakes Compute Warehouses skalar upp och ut. Låt oss demonstrera detta med några exempel. (Observera att jag i dessa tester stängt av Snowflakes utmärkta hantering av cachning. Detta såklart för att undvika felaktiga tider i mina tester.)

Vilken effekt får Scale Up?

Här har jag kört en testfråga som returnerar 10 000 rader på 4 olika storlekar av Warehouse. Vi kan se att den skalar perfekt. Den exekverar dubbelt så snabbt varje gång jag ökar Warehousets storlek. (Det är inte alltid en fråga skalar så perfekt som denna av olika anledningar, men oftast skalar de i det närmaste linjärt.)

UserWarehouseclusterSizeStart_timeend_timeTotal DurationRows
BJORNTEST1X-Small8:44:15 PM8:46:10 PM1m 54s10K
BJORNTEST1Small8:46:48 PM8:47:44 PM56.1s10K
BJORNTEST1Medium8:49:37 PM8:50:06 PM28.7s10K
BJORNTEST1Large8:50:43 PM8:50:58 PM15.3s10K 


Samtidiga användare – utan Scale Out

Nu ska vi istället tittar på hur Snowflake beter sig när jag simulerar flera användare som kör samtidiga frågor. Här kör jag 8 och 16 parallella körningar av samma query som ovan och repeterar 10 gånger för varje användare. Jag tar hjälp av JMeter https://jmeter.apache.org/ för att genomföra testerna.

No of UsersNo of executesTotal QueriesClusterSizeTotal DurationRowsCredits
810801Medium5m 03s10K0,33
16101601Medium10m 01s10K0,66

 

Eftersom varje användare kör 10 frågor i rad kan vi se att 8 användare kör parallellt och att exekveringstiden blir 10 gånger vad en fråga tar. När jag kör 16 användare börjar vissa frågor köas upp och den totala tiden (och förbrukade credits) blir dubbelt så lång vid 16 användare jämfört med 8 användare. Som det borde fungera.

Samtidiga användare – med Scale Out

 Om jag istället ställer in mitt Warehouse på att skala ut när frågor börjar köa får jag följande beteende.

No of UsersNo of executesTotal QueriesclusterSizeTotal DurationRowsCredits
810801Medium5m 03s10K0,33
16101602Medium5m 11s10K0,68
32103204Medium5m 18s10K1,38
801080010Medium5m 38s10K3,59

 

Vi kan se att den totala exekveringstiden i princip är oförändrad! Det som händer är att fler kluster spinns upp och hanterar alla de frågor som körs. Så om vi jämför exemplet utan scale out med detta så kan vi se att 16 parallella frågor kommer bli klart dubbelt så fort men konsumera lika många credits vid scale out mot att man inte använder det.

Tänk alltså på att inte vara rädd att prova använda större Warehouse då detta ofta betyder att användarna får svar snabbare och till samma kostnad som ett mindre Warehouse. 

Att tiderna varierar lite och tar lite längre tid vid scale out har att göra med att Snowflake väntar någon sekund på att frågor börjar köa innan nya kluster spinner upp. Detta är marginellt, men kan vara bra att ta med i beräkningen. JMeter kan också ge lite overhead då den skjuter 80 parallella trådar mot databasen.

Slutsats – Vad tycker jag om testresultaten?

Jag tycker detta är hur häftigt som helst! Jag har aldrig stött på en databas som hanterar multipel workload och simultana användare på ett så smidigt sätt. Detta gör att man inte lägre behöver vara orolig att en ETL-laddning stör ut self-service verktyg som t ex Tableau eller att en data scientist ska ställa enorma frågor som tar all kraft ur databasen. Alla får sitt eget Compute Warehouse där de kan göra vad de vill utan att störa andra.

Detta är så det borde vara i alla databaser och efter att ha sett detta går det inte att tänka sig att använda sig av en databas som inte har denna funktionalitet.

Om du vill bolla dina funderingar runt databaser och prestanda så hör av dig till mig direkt så tar vi ett snack!