C'est un vieux problème pour moi que j'ai résolu il y a un certain temps, mais je me suis dit que j'allais enfin l'écrire. Lorsque j'ai commencé dans ma nouvelle entreprise, la base de données de production plantait environ une fois par mois avec des erreurs de mémoire ORA-4031. Le DBA actuel a estimé que le problème était le manque de variables de liaison dans le code de l'application, qui est normalement le coupable le plus probable. Le manque de variables liées était un problème, mais comme je l'ai vite découvert, le problème n'était pas du tout lié aux instructions SQL. Le problème était plutôt dû à un bogue avec Direct NFS. Apparemment, Direct NFS avait une fuite de mémoire. La fuite de mémoire a affecté le pool partagé et avec suffisamment de temps, la mémoire libre dans le pool partagé est devenue inexistante, les erreurs ORA-4031 seraient lancées et la base de données se bloquerait.
J'ai travaillé avec Oracle Support pour confirmer qu'il s'agissait d'un bogue. Ce problème a été classé en tant que bogue 10237987 et affecte les versions 11.1.0 et 11.2.0. J'ai rencontré ce bogue sur un cluster RAC à 3 nœuds exécutant Oracle Enterprise Linux. Je n'ai jamais pu obtenir de réponse si ce bogue se produisait sur d'autres plates-formes de système d'exploitation ou pour des environnements non RAC. Le bogue entraîne une croissance significative des pools KGNFS dans le pool partagé au fil du temps.
Je regrette de n'avoir jamais pu résoudre ce bogue avec le support Oracle. Le support voulait que je capture une trace lorsque la base de données s'est écrasée en raison d'erreurs ORA-4031 avec les pools KGNFS. Ce qu'ils n'ont pas réalisé, c'est que les pools KGNFS provoquaient un manque d'espace dans tous les autres pools du pool partagé. Les pools KGNFS évinçaient les autres pools et c'était souvent lorsque de l'espace était demandé dans les autres pools que l'erreur ORA-4031 était atteinte. Et la seule fois où les fichiers de trace ont été générés était d'attendre que la ou les instances se bloquent. Je ne pouvais pas m'asseoir et attendre que nos instances se bloquent au milieu de la journée juste pour capturer un fichier de trace pour le support Oracle, d'autant plus que le fichier de trace ne provient peut-être même pas des pools KGNFS !
Au final, notre solution de contournement a été d'arrêter d'utiliser Direct NFS dans notre configuration. Nos tests n'ont montré aucune différence de performances avec ou sans Direct NFS. Depuis que nous avons cessé d'utiliser Direct NFS, nous n'avons vu aucune des erreurs ORA-4031. Je vois que le bogue est toujours là sur Metalink mais pas encore de correctif.