Newsgroup: it.comp.java
Titolo: Regole empiriche per il capacity planning di applicazioni J2EE

Ciao a tutti,
volevo chiedere se qualcuno conosce alcune regole empiriche di base che
possono essere utilizzate per dimensionare l'hardware necessario per un
server sul quale deve girare una applicazione web J2EE (numero di
processori, memoria RAM...), in base al numero di utenti previsto per
l'applicazione stessa.
Ben sapendo che tali parametri dipendono strettamente dalla logica
dell'applicazione stessa e che un corretto capacity plan può essere
effettuato soltanto a valle di opportuni performance test, volevo ugualmente
chiedervi se, per così dire, esitono delle linee guida pratiche che si
basino su parametri più generali (numero di utenti concorrenti previsto,
dimensione in kb degli oggetti da mantenere in sessione...) almeno per
effettuare stime di masse.
Mi riferisco ad applicazioni web multi-tier "classiche" (web server + ldap
server + appserver + db server acceduto via jdbc...) potenzialmente accedute
da migliaia di utenti su internet.
Sarebbero ben accetti suggerimenti, link a materiale reperibile su internet,
indicazioni di libri sull'argomento...
Vi ringrazio anticipatamente, sperando di essere stato abbastanza chiaro
nella richiesta...

 nella richiesta...
Ciao,
bellissima e complicatissima domanda...
Per mia esperienza personale (jboss3.2.3, postgresql, apache), abbonda con
la ram (java da questo punto di vista è molto esoso) (nel mio caso ho
utilizzato 2Gb). Come processori non ti so aiutare (io ho uno xeon e al
momento tiene bene).
Ti consiglio di ottimizzare al massimo il codice e le richieste agli EJB. 
Inoltre ottimizza il S.O., togli tutto ciò che non serve e via dicendo...
Altro al momento di mi viene in mente...
Spero di esserti stato almeno un minimo utile...
Ciao!

Fra i mille suggerimenti che mi vengono in mente eccone solo una 
piiiiiccoliiiissssima parte:
1) la gestione della memoria è molto importante, forse la più 
importante. Se hai un server con otto processori e due carrelli della 
spesa di RAM ma li sfrutti male...beh ci siamo capiti.
Questo tool free può essere un ottimo inizio:
http://www.hp.com/products1/unix/java/java2/hpjtune/
serve per analizzare l'attività del garbage collector: ti consiglio di 
imparare ad usarlo per capire le differenze di comportamento del tuo 
server in fase di sviluppo e in (pre)produzione.
2) fai dei performance test "svizzeri":
Ecco un po' di tool open source che possono aiutarti:
http://www.opensourcetesting.org/performance.php
[DATABASE]: controlla che la velocità di trasferimento sia quella che ti 
aspetti, che non ci siano problemi di swapping, latenza, etc. etc. Qui 
ti serve veramente un DB guru, ricorda che SE IL DATABASE HA DEI 
PROBLEMI SEI FREGATO!
[APPLICATION SERVER]: idem come sopra, ma meno critico; nel senso che se 
proprio non riesci ad ottenere le performance che vuoi, puoi sempre fare 
un cluster (ahia....)
A proposito, occhio ai LOG! Fai dei test con i log a palla (DEBUG) e poi 
al minimo (ERROR o FATAL)
In generale quando devi dimensionare un server devi prepararti delle 
applicazioni molto semplici, che ti consentano di misurare una sola 
metrica, tipo:
- login / logout di un utente
- creazione / modifica oggetti nella session
- creazione / modifica oggetti volatili
- diverso flusso di dati: "a spruzzi", batch, occasionale
- elaborazioni numeriche
- creazione di righe semplici su una entity del DB
- creazione di master/detail sul DB
Queste misurazioni devi farle:
- utente unico
- pochi utenti concorrenti: vedi tu
- molti utenti concorrenti
- esagerati utenti concorrenti
Pant...pant...penso che per ora basti, no ?  ;)
Buona sfacchinata...
-- 
  -- + Setaceous Pig + --
http://megadix.users.mcs2.netarray.com/
http://www.jroller.com/page/megadix/

 
Ciao Dimitri,
scrivo principalmente per ringraziare te e Simone per i tanti ed utili
suggerimenti avuti e per gli altrettanto utili link che mi hai iviato.
Senza alcun dubbio la strada da te indicata è la sola da percorrere
(testare, testare, testare...) e gli strumenti da te indicati saranno
utilissimi.
Quello che speravo fosse possibile però era anche sapere se, almeno
nelle fasi iniziali del progetto, ci si potesse basare su regolette
stupide stupide per effettuare un primo dimensionamento dell'hardware
necessario...
qualcosa del tipo 
[RAM necessaria] = [max. num di utenti concorrenti stimato] x
[dimensione oggetti in sessione] x2
[Num Processori consigliato] = [num di utenti concorrenti (thread?)] /
15...
So bene che servirebbero a poco, ma a volte "non c'è il tempo" per
pianificare un adeguato performance test... (ho letto un po' il tuo cv
sul web e credo che abbiamo lavorato a progetti simili, quindi puoi
capire il "non c'è tempo"...)
Ancora grazie infinite per il prezioso aiuto e buon lavoro.
/sindbad

 /sindbad
Alla prossima
