Configure the Database Instance to Support Shared Server Connections
1. Documentación en Tahiti -> Masters Book List -> Administrator’s Guide -> 5 Managing Processes -> Configuring Oracle Database for Shared Server
2. El objetivo de configurar conexiones SHARED SERVERS es reducir el consumo de recursos de la BD. El ejemplo que se pone en la documentación es una BD donde se toman cierto tipo de pedidos. Suponemos que tenemos 1.000 telefonistas tomando pedidos por telefóno y registrándolos en la BD. Con conexiones dedicadas podríamos tener 1.000 sesiones en la BD, una por cada telefonista. Pero si tenemos en cuenta que la mayor parte del tiempo, un telefonista está hablando con el cliente (90% del tiempo) en vez de meter los datos en la BD, podemos concluir que sólo necesitamos un 10% de las sesiones. Podríamos configurar 100 conexiones compartidas (en vez de las 1.000) y así liberamos memoria de las 900 sesiones que no se utilizan. Esta memoria libre nos puede ser útil en otras areas del servidor (más CACHE, otra instancia de BD, procesos ajenas a la BD que corren en la misma máquina, etc…).
Repasamos el ejemplo concreto de la documentación, donde se compara la memoria entre distintas configuraciones: DEDICATE, SHARED y DRCP (esto lo veremos más adelante). En el ejemplo se toma en cuenta que tenemos 5000 conexiones y la memoria requerida por cada sesión es de 400KB y de 4MB por cada proceso servidor. El tamaño del POOL para DRCP es de 100 y tenemos 100 SHARED SERVERS.
- DEDICATE SERVER => 5.000 CONN X (400KB/SESS + 4 MB/SERVPROC) = 22GB
- SHARED SERVER => (5.000 CONN X 400KB/SESS) + (100 SHAREDSERVERS X 4 MB/SERVPROC) = 2.5GB
- DRCP => 100 POOLSERVERS X (400KB/SESS + 4 MB/SERVPROC) + (5.000 CONN x 35KB/CONN) = 615MB
3. Primero vamos a repasar la configuración por defecto que tenemos al haber instalado la BD con DBCA.
-- Entramos a la BD con SQL*Plus y revisamos los parámetros más importantes de la BD show parameter DISPATCHERS show parameter SHARED_SERVERS -- Vemos como tenemos un DISPATCHER configurado para el servicio OCMXDB (XML DB) -- El parámetro SHARED_SERVERS coge el valor por defecto (1), porque hemos definido el parámetro DISPATCHERS show spparameter DISPATCHERS show spparameter SHARED_SERVERS -- Como hemos levantado el BD con el parámetro DISPATCHERS, SHARED_SERVERS toma el valor 1 -- Si levantamos la BD sin DISPATCHERS o SHARED_SERVERS tendríamos que definir obligatoriamente SHARED_SERVERS -- Obtenemos la configuración del DISPATCHER SELECT * FROM V$DISPATCHER_CONFIG;
4. Habilitamos conexiones SHARED SERVER para el servicio OCM (actualmente sólo lo tenemos disponible para OCMXDB). En primer lugar tendríamos que definir recomendable un valor para SHARED_SERVERS. Supongamos que tenemos 100 sesiones concurrentes (representando 100 usuarios), y que sólo están trabajando sobre la BD el 10% del tiempo. Entonces debemos configurar 10 procesos de servidor => SHARED_SERVERS = 10.
-- Definimos el parámetro SHARED_SERVERS ALTER SYSTEM SET SHARED_SERVERS=10 SCOPE=BOTH; -- Revisamos los procesos que se han creado SELECT * FROM V$SHARED_SERVER; -- Fijamos un máximo de SHARED SERVERS (en general queda limitado por el parámetro PROCESSES) ALTER SYSTEM SET MAX_SHARED_SERVERS=100 SCOPE=BOTH; -- Podemos limitar el número de CIRCUITOS virtuales que utilizan los DISPATCHERS -- Un CIRCUIT representa un area de memoria compartida que se utiliza para manejar peticiones y respuestas -- Podemos limitar su número con el parámetro CIRCUITS => Se puede usar para limitar el impacto en la SGA -- ALTER SYSTEM SET CIRCUITS=100 SCOPE=BOTH; -- No vamos a hacerlo en este ejercicio
5. Una vez hemos definido un conjunto de SHARED SERVERS vamos a configurar los DISPATCHERS. Un valor inicial se puede obtener diviendo el número máximo de sesiones concurrentes entre el número máximo de conexiones por cada DISPATCHER. En nuestra máquina tenemos definido un límite de 1.024 conexiones por proceso (máximo número de descriptores de ficheros abiertos => ulimit -n). Si pudieramos llegar a tener 4.000 sesiones concurrentes, entonces definiriamos 4000/1024 = 4 (redondeo al alza).
-- El cálculo que hemos hecho es CEIL (MAX. USU. CONCURRENTS / CONN./PROCESO) = CEIL (4000/1024) = 4 -- Habilitamos un nuevo DISPATCHER para el servicio OCM -- Si no especificamos INDEX, se modificará el DISPATCHER que tenga el mismo DESCRIPTION, ADDRESS o PROTOCOL -- Utilizamos INDEX=1 para no modificar el DISPATCHER del servicio OCMXDB -- Podemos ver que INDEX tiene que cada DISPATCHER consultando el campo CONF_INDX en V$DISPATCHER_CONFIG ALTER SYSTEM SET DISPATCHERS='(INDEX=1)(PROTOCOL=TCP)(DISPATCHERS=4)(SERVICE=OCM)' SCOPE=BOTH; -- Comprobamos que se han creado dos procesos DISPATCHER: -- · Veremos cuatro filas con CONF_INDX=1 -- · También encontramos el DISPATCHER del servicio OCMXDB (CONF_INDX=0) SELECT * FROM V$DISPATCHER;
6. Vamos a configurar el descriptor de la conexión en el fichero $ORACLE_HOME/network/admin/tnsnames.ora para hacer una prueba conectándonos por SHARED SERVERS.
# Añadimos la siguiente entrada al fichero $ORACLE_HOME/network/admin/tnsnames.ora # Podemos configurar con el asistente NETMGR de forma muy sencillita (omito este ejercicio) OCMTEST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm.dbajunior.com)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = OCM) ) ) # Nos conectamos utilizando este descriptor sqlplus system@ocmtest # Utilizando otro terminal, revisamos los DISPATCHERS del servicio OCM y vemos si nos hemos conectado # En nuestro ejemplo nos hemos conectado a través de D004: # · Veremos esta linea => "D004" established:1 refused:0 current:1 max:1022 state:ready lsnrctl services
Podemos localizar que sesiones están conectadas a través de SHARED SERVERS
-- La columna SERVER de V$SESSION será NONE (inactiva) o SHARED (activa) para sesiones usando SHARED SERVERS -- · Si lanzamos esta consulta en la sesión de SHARED SERVERS veremos el valor SERVER="SHARED" -- · Si lazamos esta consulta desde otra sesión veremos el valor SERVER="NONE" para el mismo SID SELECT SID, USERNAME, PROGRAM, SERVICE_NAME, SERVER FROM V$SESSION WHERE SERVER IN ('SHARED','NONE'); -- Podemos ver estado de los SHARED SERVERS SELECT * FROM V$SHARED_SERVER;
7. Tenemos la posibilidad de eliminar el proceso DISPATCHER que queramos. Veamos un ejemplo:
-- Eliminamos el DISPATCHER D003 ALTER SYSTEM SHUTDOWN IMMEDIATE 'D003'; -- Comprobamos que es eliminado. Esta operation puede tardar unos segundos, aunque especifiquemos el IMMEDIATE SELECT NAME, STATUS, ACCEPT FROM V$DISPATCHER;
8. Damos marcha atrás a todos los cambios.
-- Dejamos sólo el DISPATCHER original y resetamos el parámetro SHARED_SERVERS y MAX_SHARED_SERVERS ALTER SYSTEM RESET DISPATCHERS SCOPE=SPFILE; ALTER SYSTEM SET DISPATCHERS='(PROTOCOL=TCP) (SERVICE=OCMXDB)' SCOPE=SPFILE; ALTER SYSTEM RESET SHARED_SERVERS SCOPE=SPFILE; ALTER SYSTEM RESET MAX_SHARED_SERVERS SCOPE=SPFILE; -- Reiniciamos la instancia para deshacernos de la configuración del segundo DISPATCHER SHUTDOWN IMMEDIATE STARTUP -- Eliminamos la entrada añadida a $ORACLE_HOME/network/admin/tnsnnames.ora (OCMTEST)