Datalbi  
Créé le 19/10/2015 par Laurent Bourcier

Oracle 12c Nouvelles Fonctionnalités : Architecture Multi-Process Multi-Threaded

Introduction

La version 12c introduit la possibilité d'avoir des background process multi-threadés, au nombre de 6 backgroud process, d'où l'appellation multi-process multi-threaded.

Par défaut cette option est désactivée. Elle est sensée améliorée les performances CPU et la consommation mémoire.

Mise en oeuvre

Pré requis : positionner REMOTE_LOGIN_PASSWORDFILE à EXCLUSIVE pour utiliser le password file.

Il convient de positionner le nouveau paramètre THREADED_EXECUTION à TRUE.

Les connexions ultérieures doivent toujours se faire avec mot de passe.

SQL> show parameter threaded_execution

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
threaded_execution                   boolean     FALSE


SQL> alter system set threaded_execution = TRUE scope=spfile;

Systeme modifie.

SQL> shutdown immediate;
SQL> exit

sqlplus sys/manager as sysdba

SQL> startup

SQL> show parameter threaded_execution

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
threaded_execution                   boolean     TRUE

Impact sur les background process

Les background process se trouvent limités à 6.

ps -ef | grep "ora_" | grep -v grep | awk '{ print $8; }' | sort -u

ora_dbw0_DB12C
ora_pmon_DB12C
ora_psp0_DB12C
ora_u004_DB12C
ora_u005_DB12C
ora_vktm_DB12C

Impact sur les server process

Par défaut, même avec threaded_execution=TRUE, une connexion distante conduit à la création d'un process sur le serveur.

select p.spid, p.stid
from v$process p join v$session s on s.paddr = p.addr
where s.username = 'LBO';

SPID                     STID
------------------------ ------------------------
3480                     3480
3482                     3482
3484                     3484
3464                     3464

ps -ef | grep oracleDB12C

oracle    3464     1  0 22:01 ?        00:00:00 oracleDB12C (LOCAL=NO)
oracle    3480     1  0 22:02 ?        00:00:00 oracleDB12C (LOCAL=NO)
oracle    3482     1  0 22:02 ?        00:00:00 oracleDB12C (LOCAL=NO)
oracle    3484     1  0 22:02 ?        00:00:00 oracleDB12C (LOCAL=NO)

Au lieu que le listener spawn un nouveau process, le listener doit demander à la base la création d'un nouveau thread.

Ceci est possible en positionnant un nouveau paramètre dans listener.ora : DEDICATED_THROUGH_BROKER_listener_name=ON

vi $ORACLE_HOME/network/admin/listener.ora
-- Ajout
DEDICATED_THROUGH_BROKER_LISTENER=ON

lsnrctl stop
lsnrctl start

select p.spid, p.stid
from v$process p join v$session s on s.paddr = p.addr
where s.username = 'LBO';

SPID                     STID
------------------------ ------------------------
2918                     3553
2918                     3554
2918                     3555
2918                     3561

-- Le process 2918 correspond à ora_u005_DB12C

oracle    2904     1  0 21:47 ?        00:00:00 ora_pmon_DB12C
oracle    2906     1  0 21:47 ?        00:00:01 ora_psp0_DB12C
oracle    2908     1 11 21:47 ?        00:02:21 ora_vktm_DB12C
oracle    2912     1  0 21:47 ?        00:00:03 ora_u004_DB12C
oracle    2918     1  7 21:47 ?        00:01:29 ora_u005_DB12C
oracle    2925     1  0 21:47 ?        00:00:00 ora_dbw0_DB12C

Les process server sont maintenant des threads dans le background process u005.