SELECT

SELECT

Dashboard Streamlit in Snowflake: le best practice per l'hosting

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

By Jeff SkoldbergOct 19, 202613 min read

TL;DR

  • Il container runtime è la mia scelta predefinita per ospitare Streamlit in Snowflake. Le dashboard restano warm, offrendo la migliore esperienza utente.
  • Un nodo di container runtime costa 0,11 crediti all'ora, contro 1 credito all'ora di un warehouse XS. A $3 per credito, sono circa $238 al mese se resta sempre acceso. Un nodo ospita tre dashboard. La quarta avvia un nuovo nodo.
  • Per risparmiare ancora di più, sospendi il compute pool con un task notturno. In cambio, il primo utente che apre ogni dashboard o app al mattino attende circa 45 secondi.
  • Dopo una sospensione, solo le dashboard che le persone aprono davvero riprendono a generare costi. Paghi ciò che viene usato, non ciò che hai deployato.
  • Al prezzo di 100 licenze Power BI Premium Per User ($2.400 al mese), Snowflake può ospitare circa 81 app Streamlit visualizzate attivamente con la sospensione notturna.

Introduzione

Streamlit è una libreria Python open source per creare web app o dashboard incentrate sui dati. Scrivi Python e ottieni grafici, filtri, pulsanti, modali e interattività senza toccare HTML o JavaScript. L'approccio solo Python alle web app ha reso Streamlit uno strumento molto popolare tra i data team per rilasciare tool interni.

Snowflake ha acquisito Streamlit nel 2022, e Streamlit in Snowflake ne è il risultato. La tua app gira all'interno del tuo account Snowflake, proprio accanto ai tuoi dati. Non c'è nessun server da gestire, nessun sistema di login separato e nessuna copia dei dati da portare altrove. L'accesso segue gli stessi ruoli che già gestisci.

Oggi esistono due modi per eseguire un'app Streamlit in Snowflake, e vengono fatturati in modi molto diversi. Se scegli quello sbagliato, o lasci quello giusto acceso tutta la notte, lo paghi.

Questo post spiega come viene fatturata ciascuna opzione, un'insidia dell'auto-suspend che mi è costata crediti veri, come sospendere il pool ogni notte, che effetto ha sulla bolletta (più di quanto immagini) e dove si colloca il punto di pareggio rispetto a Power BI.

App Streamlit in Snowflake

Due modi per eseguire Streamlit in Snowflake

Warehouse runtime

L'app gira su un virtual warehouse. Paghi per il tempo in cui quel warehouse è attivo. Ogni volta che un utente si connette, al suo interno parte un nuovo processo del server Streamlit, e un websocket mantiene il warehouse attivo fino a circa 15 minuti dopo l'ultima attività dell'utente. Il timeout è configurabile, quindi puoi facilmente impostarlo a 5 minuti di inattività. Un warehouse XS consuma 1 credito all'ora finché è attivo. Le tue query SQL potrebbero girare su un warehouse separato, quindi potresti avere due warehouse che consumano crediti.

Container runtime

L'app gira su un nodo di un compute pool gestito da Snowflake per te. Il server Streamlit resta in esecuzione continua su quel nodo, quindi le pagine si caricano velocemente e tutti gli utenti condividono lo stesso server. È davvero la migliore esperienza utente, perché pochissimi utenti incontrano un cold start.

Snowflake li supporta entrambi, e sta rendendo il container runtime il default per le nuove app.

La mia opinione: usare un warehouse runtime con un timeout rigido di 5 minuti per risparmiare offre un'esperienza utente scadente, perché quasi ogni visitatore incontra un cold start. Io uso il container runtime per tutte le mie app Streamlit, così le dashboard sono già pronte e in cache dopo la prima visualizzazione.

Stesso codice Streamlit. Bolletta molto diversa.

Scegli il compute più piccolo possibile per eseguire il processo Streamlit

Che tu scelga il warehouse runtime o il nuovo container runtime predefinito, il processo Streamlit in sé non richiede molta potenza. Un warehouse Extra Small Gen 1 è sufficiente per qualsiasi app Streamlit in cui mi sia imbattuto. Le query possono usare un warehouse più grande, ma non sprecare crediti per il processo Streamlit.

Se riesci a sviluppare la dashboard sul tuo laptop, puoi ospitarla su un Extra Small o sul compute pool di default, che esegue CPU_X64_S.

Come viene fatturato il container runtime

Un nodo è un'unità di fatturazione. Sul pool CPU di sistema predefinito, Snowflake colloca tre dashboard su un singolo nodo. Quando è in esecuzione una quarta dashboard, avvia un secondo nodo. Una settima avvia un terzo. Il pool cresce a incrementi di tre. (Vedi la sezione Scenari di costo più sotto per altri esempi.)

Il nodo più piccolo costa circa 0,11 crediti all'ora. Il che equivale a:

  • 2,64 crediti al giorno
  • circa 79 crediti al mese
  • $7,92 al giorno o $237,6 al mese a $3 per credito, se l'auto-suspend non interviene mai.

Il prezzo per credito nel tuo caso sarà diverso, quindi sostituiscilo con il tuo. In tutti gli esempi qui sotto uso $3.

Alcune cose da notare:

  • Il prezzo è lo stesso per 1 utente o per 100. Al nodo non importa. (Confronto con i prezzi delle licenze PowerBI Per User più sotto!) È un modello di pricing che è una boccata d'aria fresca; sono davvero stanco delle licenze BI a costo per utente.
  • Un nodo costa circa 9 volte meno all'ora rispetto a un warehouse XS. Il rovescio della medaglia è che il nodo resta acceso, mentre il warehouse no. Se un warehouse dedicato al codice restasse attivo più di circa 2,6 ore al giorno, vince il nodo. Se la tua dashboard viene aperta due volte a settimana, vince il warehouse.
  • Una dashboard che nessuno ha aperto non costa nulla. Il servizio dell'app parte alla prima visualizzazione. Deployare 25 dashboard non significa affittare 9 nodi. Lo fanno solo quelle che vengono aperte.
  • Il container runtime non elimina i costi delle query. L'SQL gira comunque su un warehouse. Questo post copre solo il costo di hosting dell'app.

Ho avuto un'ottima esperienza usando il container runtime per Streamlit con gli Adaptive Warehouse per l'esecuzione delle query. Secondo la documentazione di Snowflake, gli Adaptive Warehouse sono più veloci dei warehouse Gen 2.

Quanti nodi sta eseguendo il mio compute pool Streamlit?

Le app Streamlit vengono deployate sul compute pool di default, system_compute_pool_cpu. Puoi verificare quanti nodi sono in esecuzione nella UI, sotto Compute nella barra laterale, poi compute pools.

Per quanti nodi sto pagando?

Cliccando su quella riga arrivi a una pagina di dettaglio dove puoi vedere quali app sono in esecuzione:

Pagina di dettaglio del compute pool con le app in esecuzione

Se preferisci il codice, puoi eseguire:

show compute pools like 'SYSTEM_COMPUTE_POOL_CPU';

Poi controlla la colonna active_nodes.

Risultato di show compute pools con la colonna active_nodes

L'insidia dell'auto-suspend

Ecco cosa dice la documentazione. Dopo tre giorni di inattività degli utenti, il processo del server Streamlit termina. Poi il compute pool si sospende secondo il proprio valore di AUTO_SUSPEND.

Due problemi.

Primo: i tre giorni non sono configurabili, per ora. Non puoi ridurli a un giorno o a un'ora. Tre giorni di nodo inattivo sono circa 8 crediti, ovvero $24. Non un disastro di per sé. Ma si accumula su tutto il pool, e su ogni ambiente in cui fai il deploy.

Secondo: l'AUTO_SUSPEND del pool inizia a contare solo quando non ci sono servizi in esecuzione. Il servizio Streamlit resta lì finché i tre giorni non scadono, quindi il timer del pool non ha mai occasione di aiutarti.

Al 15 ottobre 2026, l'auto-suspend non scatta in modo affidabile: ho visto un servizio e il suo container superare il terzo giorno e continuare a generare costi anche il quarto, e il supporto Snowflake mi ha detto che la causa sono le schede del browser lasciate aperte che continuano a ritentare il websocket (anche le riconnessioni rifiutate con 401 azzerano il timer di inattività sul backend). Snowflake sta lavorando a una correzione, quindi quando leggerai questo articolo il problema potrebbe essere già risolto.

Esiste una funzionalità in private preview che aggiunge idle_auto_shutdown_time_seconds a livello di app, come già avviene nel warehouse runtime. Potresti aver visto comparire la proprietà facendo describe di un'app Streamlit. Una volta ottenuto l'accesso, potrai impostarla su un valore più breve. Chiedi al tuo account team Snowflake. Mi piacerebbe poterla impostare a poche ore per ogni app e avere la configurazione più snella possibile!

Fino ad allora, non contare sul timer di tre giorni. Sospendi tu stesso il pool se vuoi risparmiare. Vediamolo più nel dettaglio.

Sospendi ogni notte e lascia che siano gli utenti a risvegliare il pool

Il risparmio più semplice è un task pianificato che sospende il pool ogni sera:

CREATE OR REPLACE TASK suspend_streamlit_pool
SCHEDULE = 'USING CRON 30 18 * * * America/New_York'
AS
ALTER COMPUTE POOL SYSTEM_COMPUTE_POOL_CPU SUSPEND;

Il ruolo proprietario del task deve avere OPERATE sul pool. Se lo esegui come task serverless, serve anche EXECUTE MANAGED TASK.

Al mattino nessuno deve fare niente. La prima persona che apre una dashboard lo risveglia. Nella mia esperienza, quel primo caricamento è un cold start di circa 45 secondi. Dopodiché è veloce per tutti gli altri.

L'aspetto che sfugge a molti, ed è qui che i risparmi si accumulano

Quando sospendi il pool di notte, tutte le dashboard vengono spente. Al mattino tornano attive solo quelle che le persone aprono, e solo quelle ricominciano a generare costi.

Supponiamo che tu abbia 25 dashboard. Se lasci tutto acceso, paghi 9 nodi, perché col tempo qualcuno le apre tutte. Se sospendi di notte e il giorno dopo vengono aperte solo 4 dashboard, paghi 2 nodi. Le altre 21 dashboard quel giorno non costano nulla.

Questo rende la sospensione notturna un trucco molto più potente del semplice risparmio sulle ore notturne di sospensione. Smetti anche di pagare per le dashboard che nessuno guarda. I report di fine mese, la review trimestrale, la dashboard ormai datata che qualcuno ha costruito mesi fa per un progetto: costano solo nei giorni in cui qualcuno le visualizza davvero.

La tua bolletta ora segue quante dashboard vengono aperte al giorno, non quante ne hai deployate.

Pro

  • Bolletta prevedibile. Conosci il caso peggiore.
  • Funziona anche finché esiste il bug dell'auto-suspend.
  • Una sola istruzione sospende tutti i nodi del pool, che tu abbia 3 dashboard o 30.
  • Le dashboard usate raramente smettono di costare.
  • Niente da ricordare. Nessuno deve accedere e fermare tutto manualmente.

Contro

  • Il primo utente di ogni dashboard, ogni giorno, attende circa 45 secondi. Per i miei utenti va bene così.
  • Chi lavora fino a tardi o nel weekend incontra lo stesso cold start.
  • La sospensione spegne tutti i nodi del pool. Chi ha una sessione in corso si ritroverà all'improvviso davanti a una pagina di riavvio, quindi scegli un orario in cui le persone sono già andate a casa. Secondo me il rischio è basso e il refresh è abbastanza rapido da renderlo conveniente.

Se 45 secondi sono troppi per chi apre le dashboard come prima cosa al mattino, puoi inviare una richiesta autenticata agli endpoint di quelle app qualche minuto prima del loro arrivo. Per me ha funzionato, ma richiede la configurazione di OAuth, che aggiunge complessità. Pre-riscalda solo le poche che contano davvero, o finirai per vanificare i risparmi sulle dashboard che nessuno legge. Per me, il pre-warming delle dashboard è più complicato di quanto valga la pena (a causa del flusso OAuth necessario), ma l'opzione esiste.

Scenari di costo

Ipotesi: $3 per credito, 25 dashboard deployate, tre dashboard per nodo. "Sospeso" significa che i nodi girano 12 ore al giorno solo nei giorni feriali (22 giorni al mese). È un limite superiore, perché una dashboard aperta alle 14 non viene fatturata per la mattinata.

Tabella del costo mensile per 25 dashboard Streamlit quando il compute pool viene sospeso ogni notte, in base al numero di dashboard aperte

Ora confrontalo con il lasciare tutte e 25 accese 24 ore su 24. Col tempo ogni dashboard viene aperta, quindi paghi 9 nodi per tutto il mese: $2.138. Se in una giornata tipica vengono usate solo 4 dashboard, la sospensione notturna ti porta da $2.138 a $174.

Sfrutta al massimo i nodi. La dashboard numero 4 ti costa quanto la numero 6, quindi se devi comunque pagare un secondo nodo, riempilo.

Punto di pareggio rispetto a Power BI

Power BI Pro è fatturato per utente. Al prezzo di listino di $14 per utente al mese, ogni persona che visualizza un report ha bisogno di una licenza. Streamlit in Snowflake è fatturato per nodo. Nessun costo di piattaforma e nessuna licenza per utente.

Quindi parti dal numero di utenti. Ecco quanto costa Power BI a $24 per utente al mese (Premium), e quante dashboard fa girare Snowflake con la stessa cifra applicando la sospensione notturna:

Tabella che confronta il costo di Power BI a 24 dollari per utente con il numero di dashboard che Snowflake esegue con la stessa cifra

Leggila così. Se 4 dashboard vengono usate da 50 persone, Power BI Pro costa circa $700 al mese e Snowflake $174. Se tutte e 25 le dashboard vengono usate da 40 persone, Power BI costa circa $560 e Snowflake $784, o $2.138 se non sospendi mai. Più persone per dashboard, più Snowflake è conveniente. Più dashboard per persona, più Power BI è conveniente.

Due doverose precisazioni:

  • Streamlit è codice. Power BI è drag and drop. Se i tuoi analisti non sanno scrivere Python (o non sono pienamente supportati dall'AI), i risparmi sull'hosting potrebbero non contare.
  • Power BI Premium Per User costa $24 per utente al mese, e la capacità Fabric elimina la licenza per i viewer nei grandi deployment, ma parte da circa $5.000 al mese. Verifica i prezzi attuali prima di costruire il business case.

Conclusioni

  1. Usa il container runtime per le dashboard che le persone aprono di frequente. Il container runtime è il mio nuovo default: preferisco il costo orario inferiore e non voglio mescolarlo con l'utilizzo dei miei warehouse. Mi piace anche l'esperienza utente con meno cold start rispetto ai warehouse con auto-suspend aggressivo.
  2. Tre dashboard per nodo. La quarta avvia un nuovo nodo.
  3. Il nodo più piccolo costa circa 0,11 crediti all'ora, 2,64 al giorno, circa $238 al mese a $3 per credito. Sì, il nodo più piccolo può ospitare le tue dashboard senza problemi. La dimensione dei dati non conta; le query girano comunque sui Virtual Warehouse.
  4. Non fare affidamento sull'auto-suspend di tre giorni. Sospendi il pool con una pianificazione.
  5. Dopo una sospensione, solo le dashboard che vengono aperte ricominciano a generare costi. Paghi ciò che viene usato, non ciò che hai deployato.
  6. Metti in conto un cold start di 45 secondi e avvisa i tuoi utenti.
  7. Oltre qualche decina di utenti, la fatturazione per nodo batte quella per licenza.

Se vuoi aiuto nel dimensionare una configurazione Streamlit o nel capire dove finiscono i tuoi crediti Snowflake, ci farebbe piacere sentirti. Contattaci!