Web Services e connessione al DB

lunedì 29 settembre 2008 - 17.51

Lanello Profilo | Senior Member

Ciao,

ho già provato a postare la stessa domanda nella sezione dedicata ai DB, ma non mi sono fatto capire forse...

qualcuno può aiutarmi a capire come ottimizzare un WebService scritto in vb.net 2005 che utilizza mysqldrivercs per connettersi ad un database mysql (non sulla stessa macchina ma in LAN)

il problema che incorro è quello che ogni volta che viene richiamato un webmethod, la connessione viene riaperta andando ad allungare i tempi di risposta verso il client.

ho provato anche a fare una istanza "globale" al WS nel mio client Windows Forms, ma il risultato non cambia, la connessione viene ricreata sempre ad ogni chiamata ad ogni webmethod

ho provato anche a fare un'oggetto MysqlConnection globale nel WS e a usare sempre lo stesso, controllando all'inizio di ogni WebMethod se la connessione è aperta usa quella altrimenti riaprila... il risultato è che viene sempre riaperta.

sono un novizio con i WS e non so dove (come si dice in toscana) "andare a battere il capo" (picchiare la testa) per capire come ottimizzare.

grazie per ogni aiuto che mi darete.

ps: nella sezione DB "brainkiller" mi ha detto:
>Riguardo l'autenticazione nel caso del Web Service se sono posizionati
>sullo stesso server su cui c'è anche MySQL l'autenticazione avviene
>in locale ma .NET apre un pool di connessioni ri-utilizzabili
>quindi in questo caso non c'è overhead aggiuntivo e anche se
>sono elevate non dovrebbero esserci problemi.
...
>Seguendo questo caso, dovrai tenere presente che all'interno
>del WebService magari userai una connessione unica al database
>da cui recupererai tutti i dati necessari poi una volta uniformati
>li rimandi al client di ritorno.

ma francamente mi ha parlato "in arabo" ...

se qualcuno può darmi qualche indizio gli sarò eternamente grato.

ciao!
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>Ciao,
>ho già provato a postare la stessa domanda nella sezione dedicata
>ai DB, ma non mi sono fatto capire forse...

Scusa, non sono riuscito a risponderti. Se latito troppo, aggiungi un altro messaggio così mi arriva la notifica via mail e mi riattivo.

>qualcuno può aiutarmi a capire come ottimizzare un WebService
>scritto in vb.net 2005 che utilizza mysqldrivercs per connettersi
>ad un database mysql (non sulla stessa macchina ma in LAN)
>il problema che incorro è quello che ogni volta che viene richiamato
>un webmethod, la connessione viene riaperta andando ad allungare
>i tempi di risposta verso il client.

Allora ricapitoliamo un po' la cosa. La LAN di cui parli è una lan locale ? Cioè i PC Database e Web Server sono nello stesso ufficio ? Te lo chiedo perchè per me il problema non è una latenza a livello di connessione sul database visto che se sono nella stessa LAN dovrebbero effettuare la connessione in un baleno se no c'è evidentemente qualche problema.

La latenza per me deriva dal fatto che le tue sedi remote non sono connesse in modo opportuno, cioè la latenza deriva dalla distanza e dalla portata delle linee con cui sono connesse. Quindi, per esempio, come sono connesse le sedi periferiche alla sede centrale ? Con che tipo di linea ?
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member

>Scusa, non sono riuscito a risponderti. Se latito troppo, aggiungi
>un altro messaggio così mi arriva la notifica via mail e mi riattivo.
>
non ti preoccupare rispondere non è mica un'obbligo... è una cortesia!

ho visto che non mi rispondevi ho provato a chiedere nell'altra sezione interessata al mio problema e a riportare il tuo stato avanzamento


>Allora ricapitoliamo un po' la cosa. La LAN di cui parli è una
>lan locale ? Cioè i PC Database e Web Server sono nello stesso
>ufficio ?

Confermo che la LAN è locale e stanno nello stesso ufficio. (sono nello stesso rack vicini vicini )

>Te lo chiedo perchè per me il problema non è una latenza
>a livello di connessione sul database visto che se sono nella
>stessa LAN dovrebbero effettuare la connessione in un baleno
>se no c'è evidentemente qualche problema.

controllerò le configurazioni di entrambe i server (il db mysql è su una debian, il ws sta su iis su uno sbs2003)

>La latenza per me deriva dal fatto che le tue sedi remote non
>sono connesse in modo opportuno, cioè la latenza deriva dalla
>distanza e dalla portata delle linee con cui sono connesse. Quindi,
>per esempio, come sono connesse le sedi periferiche alla sede
>centrale ? Con che tipo di linea ?

la latenza "iniziale" non sarebbe un problema... anche perchè adesso i client remoti (che lavorano in vpn, ma su adsl tradizionali e nemmeno troppo scattanti) adesso lavorano direttamente sul database, inviando le query e elaborando in locale i recordset.

come ti ho già spiegato nell'altro thread sto cercando di migliorare le prestazioni con un webservice, visto che l'azienda in questione ha in previsione l'apertura di nuovi punti vendita, e che il collegamento diretto (a causa delle linee a disposizione nelle varie località) non sarebbe più sostenibile.


L'unico problema che vorrei risolvere è quello di EVITARE che il webservice ogni volta che viene chiamato un webmethod rifaccia la connessione al database.

sempre se è possibile. altrimenti mi farò un wcf sul server ed un mio protocollo di comunicazione tra i client ed il server.

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>Confermo che la LAN è locale e stanno nello stesso ufficio. (sono
>nello stesso rack vicini vicini )

Ok perfetto.

>controllerò le configurazioni di entrambe i server (il db mysql
>è su una debian, il ws sta su iis su uno sbs2003)

Beh se ti colleghi al DB e ti connetti rapidamente va bene.

>la latenza "iniziale" non sarebbe un problema... anche perchè
>adesso i client remoti (che lavorano in vpn, ma su adsl tradizionali
>e nemmeno troppo scattanti) adesso lavorano direttamente sul
>database, inviando le query e elaborando in locale i recordset.

Eh eh, questo potrebbe essere un problema. Spesso le linee ADSL configurate come Interleaved non sono ottimali per questo tipo di lavori ma bisognerebbe farle configurare ove possibile in modalità Fast. Dove c'è latenza più bassa.

>L'unico problema che vorrei risolvere è quello di EVITARE che
>il webservice ogni volta che viene chiamato un webmethod rifaccia
>la connessione al database.

Questo non è un problema, mi pare di avertelo già detto nell'altro Thread perchè viene utilizzato il connection pooling. Non so confermarti se viene usato anche a livello di .NET usando il MySqlDriverCS (certamente con SQL Server viene usato) ma viene usato anche a livello di MySQL, a questo link trovi la spiegazione:
http://www.primaryobjects.com/CMS/Article68.aspx (parte bassa)

Quindi se apri/chiudi correttamnete le connessioni dal web service non c'è problema perchè mysql mantiene un pool di connessioni in stato Sleep.

>sempre se è possibile. altrimenti mi farò un wcf sul server ed
>un mio protocollo di comunicazione tra i client ed il server.

Esatto, c'è anche questa opzione. Però io la escluderei per il semplice fatto che comunque il ritardo in risposta che viene introdotto by-design dai web service sarebbe comunque rimangiato dalla latenza della linea per trasmettere i dati. Quindi anche se tu avessi un web service che richiede dati dal DB superveloce comunque la velocità te la perdi nel rimandare i dati indietro.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member

giusto per precisare...

>L'unico problema che vorrei risolvere è quello di EVITARE che il webservice ogni volta che viene chiamato un webmethod rifaccia la connessione al >database.

anche perchè raggiungo il limite connessioni sul Mysql in un baleno

tieni presente che come carico di lavoro dal MyTop (il task manager per linux di Mysql) registro 30 Milioni di query al giorno .

immagina che macello se per ognuna di queste query (ovviamente il rapporto non è 1 webmethod=1 query) dovessi rifare la connessione al db...

ed infatti a riprova del fatto che ho questo problema eccoti il risultato di un pomeriggio di debugging...

The options my be specified on the command-line or in a ~/.mytop config file. See the manual (perldoc mytop) for details. Here's the exact error from DBI. It might help you debug: Troppe connessioni

il mytop mi ha buttato fuori a causa delle troppe connessioni.
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>tieni presente che come carico di lavoro dal MyTop (il task manager
>per linux di Mysql) registro 30 Milioni di query al giorno .

Beh ma perchè ci sono tutte queste query ?
Puoi spiegarlo ? Quanti client/punti vendita diversi effettuano queste query ?
Nei momenti di picco quante sono le query al minuto ?
Che tipo di hardware hai sul server (curiosità, non c'entra con la risoluzione).

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member

>Beh ma perchè ci sono tutte queste query ?
>Puoi spiegarlo ? Quanti client/punti vendita diversi effettuano
>queste query ?
i client remoti non sono molti (8), ma dalla sede centrale sono molto "curiosi" gli piace vedere in diretta ogni movimento che viene fatto nei vari punti vendita quindi c'è da client multipli (12) sulla lan un polling continuo al db

>Nei momenti di picco quante sono le query al minuto ?
nei momenti di picco non si superano le 1300 qry al secondo

>Che tipo di hardware hai sul server
è un supermicro dual xeon 64bit quadcore (quindi alla fine 8 cores) vista la prossima espansione dell'azienda mi sono premunito sull'hardware ;) con 8 gb di ram e dischi sata2 in raid è un rack 19 1U

comunque sembra che finalmente io abbia capito tutto il tuo "trattato" sul pooling delle connessioni adesso non raggiungo più il limite di connessioni contemporanee ed ho aggiunto su linux la macchina windows dove gira il webservice negli hosts, quindi ho annullato anche i tempi di ricerca dell'host al momento della connessione

sto facendo un po di test di stress ti faccio sapere...
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>Nei momenti di picco quante sono le query al minuto ?
>nei momenti di picco non si superano le 1300 qry al secondo

1300 al secondo o al minuto ? A me sembrano tantissime sia al minuto che al secondo. E' un numero enorme considerato il limitato numero dei client, non so neanche come fanno a lanciare così tante query contemporaneamente, non è che forse l'applicazione client è scritta un po' male ?

>>Che tipo di hardware hai sul server
>è un supermicro dual xeon 64bit quadcore (quindi alla fine 8
>cores) vista la prossima espansione dell'azienda mi sono premunito
>sull'hardware ;) con 8 gb di ram e dischi sata2 in raid è un
>rack 19 1U

Ottimo.

>comunque sembra che finalmente io abbia capito tutto il tuo "trattato"
>sul pooling delle connessioni adesso non raggiungo più il
>limite di connessioni contemporanee ed ho aggiunto su linux la
>macchina windows dove gira il webservice negli hosts, quindi
>ho annullato anche i tempi di ricerca dell'host al momento della
>connessione

Si comunque sai che il numero di connessioni massime lo puoi spostare oltre i 100 di default però naturalmente non bisogna abusarne come giustamente hai detto.

>sto facendo un po di test di stress ti faccio sapere...

Si fai sapere. Dimenticavo inoltre che lato web service ma anche lato applicativo puoi costruire meccanismi di caching e quindi gabbare la tua direzione. Quindi se fanno la stessa query per 50 volte al minuto rimandargli sempre gli stessi dati, e al minuto successivo la cache viene invalidata e la ricrei con i nuovi dati. In questo modo riduci sensibilmente le connessioni a DB e però abbassi un po' il "real time".
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member

il numero di query te l'ho detto dipende MOLTO dal polling che fanno continuamente durante tutto l'orario d'apertura dei punti vendita dalla sede per controllare l'andamento delle vendite delle movimentazioni interne, ecc... ecc...

ogni direttore di reparto ha la sua schermata di gestione dalla quale vede nel suo settore cosa sta succedendo e tiene tutto continuamente sotto controllo per indicare agli addetti come comportarsi...

non è grandissima come azienda ma è ottimamente organizzata.

tieni presente che il numero delle query (1300) sono al secondo e sono al 95% di polling per le suddette statistiche la volo e di conseguenza se non sono stati fatti update, delete o insert nelle tabelle, il server mysql provvede a restituire il risultato cachato.

comunque il server raggiunge il 17-18% di utilizzo della cpu nel momento di maggiore picco

>Dimenticavo inoltre che lato web service ma anche
>lato applicativo puoi costruire meccanismi di caching e quindi
>gabbare la tua direzione.

già fatto la cache lato mysql server, adesso vedrò se è il caso lato webservice

>In questo modo riduci sensibilmente le connessioni a DB
>e però abbassi un po' il "real time".

Sono abituati male oramai... sarà una scelta loro... quando la macchina sarà in saturazione... vedremo il da farsi.. o chachamo oppure cambiamo il server ;) ($$$$$)
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Lanello Profilo | Senior Member

ebbene ecco i risultati del mio test ;)

le prestazioni tra prima (connessione diretta tramite vpn dei client al server mysql tramite mysqldrivercs) ed ora con il nostro amato webservice che espone i metodi (sempre e solo in vpn) e che, dopo aver effettuato le stesse query in LAN, restituisce i risultati al client che li ha chiesti, sono migliorate del 60%!!!!!!!



Un grazie di cuore a BrainKiller per la pazienza e l'aiuto e "hip hip hurrà" per i webservices

ah piccolo ps: le 1300 qry al secondo comprendono i risultati cachati che vengono riproposti da mysql all'utente quando la query è la stessa ed i dati nelle tabelle interessate non sono cambiati, è per quello che la cpu sta bassa anche in questi momenti di picco, non è un computer della nasa però funziona "da dio"

Brainkiller Profilo | Guru

>le prestazioni tra prima (connessione diretta tramite vpn dei
>client al server mysql tramite mysqldrivercs) ed ora con il nostro
>amato webservice che espone i metodi (sempre e solo in vpn) e
>che, dopo aver effettuato le stesse query in LAN, restituisce
>i risultati al client che li ha chiesti, sono migliorate del
>60%!!!!!!!

Bene.
Ma mi devi spiegare però per una curiosità mia personale, perchè i client devono fare polling così frequentemente, in che settore lavora l'azienda per cui hai fatto il lavoro e che deve quindi controllare così frequentemente i dati ?
Ciao


David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member


>Ma mi devi spiegare però per una curiosità mia personale, perchè
>i client devono fare polling così frequentemente, in che settore
>lavora l'azienda per cui hai fatto il lavoro e che deve quindi
>controllare così frequentemente i dati ?

distribuzione e vendita al dettaglio nel campo della moda... il polling così frequente è la fissa dei dirigenti che volgiono vedere tutto quello che succede nei vari magazzini / punti vendita all'istante... (è stato quello il punto di forza con il quale li ho convinti a fare questo progetto)

una cosa che se un domani dovesse divenire troppo onerosa in termini di richieste al server sarà sicuramente ridimensionata alle effettive necessità dell'azienda...

adesso è il "balocchino" dei capi (che comunque in LAN non crea grossi problemi)


>David De Giacomi | <empty>
>http://blogs.dotnethell.it/david/

e il Microsoft MVP nella tua firma che fine ha fatto ?!?!?!


-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>distribuzione e vendita al dettaglio nel campo della moda...
>il polling così frequente è la fissa dei dirigenti che volgiono
>vedere tutto quello che succede nei vari magazzini / punti vendita
>all'istante... (è stato quello il punto di forza con il quale
>li ho convinti a fare questo progetto)

Scusa la domanda, ma se i dirigenti fanno il polling così frequentemente e hanno questa fissa di controllare tutto, a fine giornata hanno combinato qualcosa ? Come va avanti l'azienda

>e il Microsoft MVP nella tua firma che fine ha fatto ?!?!?!

E' sparito, perchè non lo sono più da oggi.

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member

> Come va avanti l'azienda

eh... me lo chiedo sempre anche io

no dai scherzo. l'azienda è molto ben organizzata, solo che oramai (te l'ho detto ho venduto il progetto quando gli ho promesso la visione istantanea di tutti i dati, prima usavano un piccolo gestionale che lavorava offline e faceva il join dei database remoti ogni notte) sono abituati a lavorare con la sua schermatina sempre sotto controllo e sarà dura fargli cambiare idea... ma come ti ho già scritto più su nel thread... quando il server sarà in ginocchio.. a loro la scelta se mantenere le "figatine" investendo su hw più potente o se abbassare il polling time delle suddette statistiche ;)


-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5