Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Febbraio 06, 2022, 08:20:07 am

Titolo: Ottimizzare un programma che lavora suo files della rete aziendale
Inserito da: bonmario - Febbraio 06, 2022, 08:20:07 am
Ciao a tutti,
faccio una breve premessa ...
Fino ad un paio di mesi fa, al lavoro avevamo un desktop fisso. Quando lavoravo da casa, mi collegavo in RDP a quel PC.
Ora, abbiamo invece un portatile, ed il fisso è stato eliminato.
Quando lavoro da casa, tramite la mia fibra, mi collego alla rete aziendale. La mia "fibra" ha però prestazioni da ADSL: 20 mega in download ed 1 in upload ... quando tutto va bene ...

Ma veniamo ora al problema. Un mio programma, fatto in Lazarus, fa un elenco di files presenti su uno dei nostri dischi di rete, lo filtra, e poi emette in una tabella l'elenco dei files filtrati, mostrando tra le altre cose il proprietario di quel file. Quando avevo ancora il PC fisso, e quando sono fisicamente in sede, fila tutto liscio, ma quando lavoro da casa, il programma dura una vita. Praticamente, per esporre i dati di 135 files, al lavoro ci mette circa 15 secondi, quando lavoro da casa un paio di minuti.
Agendo in debug da casa, ho verificato che la fase che rallentano il tutto sono 2:
- la ricerca iniziale dei files (che ho già ottimizzato, e da casa ci impiega una quindicina di secondi)
- il reperimento del proprietario del file, che occupa la restante parte del tempo

Io credo che la mia fibra faccia da "collo di bottiglia", avevo quindi pensato di fare così:
- emettere subito la tabella con tutti i dati, tranne il proprietario
- lanciare il reperimento del proprietario di ogni file tramite un thread separato
- in alternativa, lanciare il reperimento di tutti i proprietari tramite un unico thread
- mano a mano che determino il proprietario di un file, integrare il dato nella tabella dei risultati

Secondo voi può avere senso come soluzione, o alla fine farei del lavoro per niente, visto che la causa del problema è comunque la mia linea penosa?

Grazie, Mario
Titolo: Re:Ottimizzare un programma che lavora suo files della rete aziendale
Inserito da: DragoRosso - Febbraio 06, 2022, 09:31:39 am
Ti aggiorno a step, per problemi di tempo.

Prima cosa: la rete internet fà sempre e comunque da collo di bottiglia, perchè prevede filtri e quant'altro per una connessione ad una rete aziendale (che avviene normalmente tramite VPN).

Lavorare in VPN è generalmente più lento e le latenze si sommano (anche se di poco), inoltre il collo di bottglia (oltre a quanto già detto e alla tua "fibra") è la capacità di banda in ingresso e usicta (upload / download) della tua azienda e di come vengono bilanciati i carichi.

Quando lavorai per una multinazionale, avevo un collegamento 1 Mbit / 640 Kbit da casa mia e comunque mi sembrava una favola  ;D

Poi, per lavorare in rete, sopratutto da remoto, è necessario usare delle accortezze:

1) Evitare di fare accessi ricorsivi alla rete stessa: chiamare ricorsivamente funzioni che ad esempio eseguano ricerche di file in rete non è la pratica giusta. La cache, proprio in caso di vpn, non è efficiente anzi tutt'altro.

2) Sfruttare al massimo le funzioni del sistema operativo (lo sò, pregiudica molto spesso la compatibilità e il porting  :-\ ), quindi usare le funzioni specifiche (API) per l'accesso alle risorse di rete e usare dei metodi propri per eseguire meno accessi possibile.
 
3) Fatti una cache personale (assolutamente criptata) dei SID degli account: per accedere al proprietario di un file prima si deve rilevare il SID a cui appartiene in file, successivamente si deve rilevare (revers lookup) il "nome" del SID. Queste api non vengono eseguite in cache, per problemi di sicurezza.
Il SID non cambia per tutta l'esistenza di un account. Quindi se ti fai una tua cache, risparmi un bel pò di tempo (ogni tanto magari l'aggiorni).
N.B.: mi è venuto un dubbio sul fatto che creare la cache dei SID sia lecito o meno  :o 

4) Lavorare con i thread và benissimo (in ne uso a decine) ma devi ovviamente organizzare bene "le cose". Usare i timer di debug (TStopWatch) per debugare i tempi per confrontare le varie soluzioni è sempre una scelta ottima.

Spero di esserti stato d'aiuto, se mi vengono in mente altre cose ti aggiorno.

Ti allego una unità DIAGNOSTICS che avevo adattato e che ti  consente di usare i timer ad alta risoluzione in maniera semplicissima.

Basta che la includi nelle unit dove la usi. Non c'è da inizializzare niente. Puoi istanziare quanti timer vuoi (ovvio che occupano risorse).

Uso:

Codice: [Seleziona]
var TimDebug: TStopWatch;

TimeDebug.StartNew;
........
........  TUO CODICE SU CUI VALUTARE IL TEMPO
........
TimeDebug.Stop;

ShowMessage(TimeDebug.ElapsedMilliseconds.ToString);


Ciao
Titolo: Re:Ottimizzare un programma che lavora suo files della rete aziendale
Inserito da: nomorelogic - Febbraio 06, 2022, 11:34:49 am
ciao bonmario

tanto per aggirare il problema, ti volevo chiedere se ci fosse la possibilità di far girare questo tuo programma in lan
se i dati sono abbastanza statici questa operazione la potresti schedulare su un pc in lan che ti tiene aggiornata la tabella
poi quando sei in VPN ti leggi direttamente la tabella
questo tanto per buttarla lì e capire la situazione  :)


tralasciando il workaround sopra vorrei farti un po' di domande:

il discorso del DNS è importante quando si è in vpn: il tempo perso potrebbe essere tutto qua


io penso che più che la tua fibra (che poi... che ping hai?) il problema possa risiedere tra il DNS e l'utilizzo delle api particolari dei permessi del protocollo SMB usato sopra la VPN
ad esempio potresti copiare un file di 100MB attraverso la vpn (non copia/incolla via RDP ma da esplora risorse) e vedere quanto tempo ci vuole, già questo ci fa capire se i tempi sono da collo di bottiglia


nomorelogic


Edit:
il test della copia del file da 100MB forse è meglio farlo da command line: se lo fai con copia/incolla da esplora risorse i tempi sono inquinati dall'analisi iniziale dei tempi prima e dai calcoli statistici durante
Titolo: Re:Ottimizzare un programma che lavora suo files della rete aziendale
Inserito da: bonmario - Febbraio 06, 2022, 07:46:01 pm
Grazie @DragoRosso, mi hai dato un'ottima idea. Tenendo conto poi che quei files hanno al massimo 5 proprietari, potrei farmi un elenco direttamente a runtime: la prima volta verifico il proprietario "veramente", e mi salvo l'esito, dalla seconda volta in poi, cerco direttamente nei risultati.
Se riesco, domani faccio la modifica e martedì, lavorando da casa, la testo !!!

Per @nomorelogic:
- la ricerca la faccio con una classe creata da me, ereditata da "TFileSearcher". In questo caso specifico, il codice aggiunto da me non entra però in gioco
- il proprietario lo determino grazie a del codice che avevo trovato tempo fa in rete. In pratica, prima determina il nome del server (in questo caso, anche se i files sono parecchi,essendo tutti sullo stesso server, lo fa una volta sola). Fatto quello, determina i dati dell'utente proprietario del file, e del gruppo di appartenenza di quell'utente. Se serve, posso postare il codice, anche se le 2 istruzioni che rallentano il tutto, le ho già individuate, e se non ricordo male, fanno una chiamata diretta ad un'API di Windows,

Do la colpa alla fibra, o comunque al fatto che lavoro da casa, essenzialmente per 2 motivi: i 2 colleghi che lavorano con me a questo progetto, che abitano praticamente in centro, non hanno questo problema, o altri problemi che mi ritrovo io, e che hanno tutti a che fare con il lavoro su files in rete. L'altro motivo, è che una mattina la fibra non andava, e mi sono divuto collegare usando lo smartphone come hotspot: quella mattina, filava tutto liscio. Non dico come se fossi in sede, ma comunque quasi.

P.S. Ho fatto uno speedtest adesso, ed il ping era di 28 ms

Ciao, Mario
Titolo: Re:Ottimizzare un programma che lavora suo files della rete aziendale
Inserito da: bonmario - Febbraio 09, 2022, 12:17:25 pm
Ciao,
visto che comunque da inizio marzo dovrei tornare a lavorare fisso dalla sede, alla fine ho scelto una strada semplice e veloce, che volendo potrei disattivare in poco tempo il mese prossimo.
In pratica, quando ho finito di emettere la tabella, salvo in un file, per ogni riga
- Nome del file
- Data/ora di ultima modifica
- Proprietario

All'inizio della ricerca, porto questo file in memoria
Quando devo andare a cercare il proprietario di un file, prima lo cerco in quest'area, considerando nome file e Data/Ora come chiave. Se lo trovo, ho già ciò che mi serve, se non lo trovo, cerco l'informazione su disco

Grazie ancora per l'aiuto !!!