L'RDBMS Oracle ha sempre utilizzato, fin dalle prime versioni, l'architettura a server multipli. Infatti per ogni client connesso al database viene attivato un relativo processo server (il cui fantasioso nome e' oracle). In tal modo non si creano colli di bottiglia sul/sui server ed i grado di parallelismo ottenibile e' maggiore. Poiche' i vari server condividono le aree text del codice la richiesta di memoria verso il sistema operativo non e' eccessiva.
Vi sono condizioni tuttavia in cui tale
architettura non risulta adatta. Questo avviene in particolar modo quando il
numero di connessioni e' molto elevato e l'attivita' svolta dalle singole connessioni
e' modesta. In tali condizioni e' necessaria una quantita' enorme di memoria
sul sistema per evitare paginazione.
Per tale motivo dalla versione 7 la Oracle
ha introdotto il MultiThreaded Server (MTS). L'MTS e' in grado di gestire in
parallelo piu' connessioni al database limitando notevolmente il numero di processi
e la richiesta di memoria sul sistema.
Quanto riportato in questo documento e' relativo a versioni di Oracle di una decina di anni fa... Ma nonostante i molti passaggi di versione (almeno 4 significativi) i concetti di base non sono cambiati! Tra le innovazioni piu' significative l'utilizzo dei remote listener nel RAC, la modalita' di autoregistrazione dei DB (configurabile con il comando alter system set local_listener=1536;), ... per il resto: buona lettura!
Attivazione dell'MTS
Per effettuare l'attivazione del MTS e' necessario configurare opportunamente il file initX.ora. Deve inoltre essere installato SQL*Net v.2 e configurato il listener. La modalita' di accesso MTS "passa" infatti attraverso il listener.
La configurazione non e' difficile e nel seguito vengono riportati alcuni esempi.
Le principali scelte da effettuare sono relative al numero di server pre-attivati ed al numero massimo di server attivabili.
Elementi di tuning
Come in tutte le architetture le regole principali sono dettate semplicemente dal buon senso. Con l'MTS un processo Oracle "serve" piu' sessioni. E' pertanto importante evitare di creare un collo di bottiglia attivando un numero troppo limitato di server.
Nel caso particolare di applicazione continuamente attive (batch o simili) l'utilizzo dell'MTS non offre alcun vantaggio.
Se il numero massimo di server attivabili e' elevato l'MTS perde di validita' poiche le risorse di sistema e la memoria vengono inutilmente utilizzate.
Per il tuning dell'MTS e' necessario prendere in considerazione tre punti di vista:
I tre distinti punti di vista debbono essere controllati e monitorati al fine di effettuare un buon tuning dell'MTS.
Intermezzo pubblicitario: tra gli strumenti utilizzabili per effettuare il controllo ed il tuning di una configurazione in MTS (parte Oracle) vi e' il pacchetto SmartDBA che fornisce una serie di statistiche e grafici di controllo.
Nota sull'architettura
L'architettura utilizzata da Oracle per l'implementazione del MTS non e' quella teoricamente migliore (il parere e' ovviamente personale). Non viene infatti fatto un uso spinto della tecnica del multithreading (come avviene invece per altri RDBMS). Si tratta infatti di diversi processi che implementano l'architettura. Tuttavia in tal modo la portabilita' e' molto maggiore e questo e' sicuramente il motivo per cui e' stata scelta (Oracle e' infatti disponibile su una serie impressionante di piattaforme).
Esempio di configurazione
Per meglio chiarire gli argomenti viene riportato un esempio di configurazione.
File initX.ora
...
mts_dispatchers="ipc,1"
mts_dispatchers="tcp,5"
mts_max_dispatchers=20
mts_servers=10
mts_max_servers=20
mts_service=dbname
mts_listener_address="(ADDRESS=(PROTOCOL=tcp) (HOST=hostname) (PORT=1521))",
"(ADDRESS=(PROTOCOL=ipc) (KEY=dbname))"
File di configurazione del listener
LISTENER=
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=tcp)
(HOST = hostname)
(PORT = 1521)
)
(ADDRESS=
(PROTOCOL=ipc)
(KEY=dbname)
)
)
STARTUP_WAIT_TIME_LISTENER = 2
CONNECT_TIMEOUT_LISTENER = 60
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dbsid)
(ORACLE_HOME=/usr/app/oracle/product/7.3.2)
)
)
TRACE_LEVEL_LISTENER = OFF
PASSWORD_LISTENER = (XYZ)
Altre informazioni
Elementi ulteriori su SQL*Net sono contenuti nel documento Configurazione di SQL*Net V.2.
Argomenti distinti, ma che presentano aspetti architetturali di interesse, sono: