Ridurre lo startup time di WebLogic Server

Oracle WebLogic Server a volte ha tempi di avvio dei servizi elevati. In questa paginetta forniamo alcune indicazioni per ridurre i tempi di avvio dei servizi WebLogic.
La ragione tecnica e' la mancanza di entropia... ovvero c'e' poco disordine. Non c'e' problema: siamo degli esperti, se non c'e' abbastanza disordine ci pensiamo noi!

Oracle WebLogic Server (WLS) e' il componente fondamentale della piattaforma Oracle Fusion Middleware e fornisce la base per le applicazioni sviluppate su diverse tecnologie Oracle. Per citare un solo esempio le versioni piu' recenti di Oracle Applications o eBusiness Suite (eBS) utilizzano appunto WebLogic come Application Server.

In questo documento facciamo riferimento alla versione 12.2.1 di Oracle WebLogic Server contenuta in Oracle Fusion Middleware, ma quanto riportatato vale, mutatis mutandis, anche per le altre versioni [NdA in realta' alcune indicazioni sono valide per tutte le applicazioni Java].

Ho fretta!

Per abbreviare i tempi di startup di WebLogic l'indicazione e' di utilizzare il device /dev/./urandom nei file HOME/oracle/product/12.2.1/oracle_common/jdk/jre/lib/security/java.security e HOME/java_1_8_77/jdk1.8.0_77/jre/lib/security/java.security sostituendo la riga:

securerandom.source=file:/dev/random
con la riga:
securerandom.source=file:/dev/./urandom

Usate: /dev/./urandom tutto il resto e' tldr; [NdA cit.]

Introduzione

Lo scambio di informazioni tra i processi di WebLogic server avviene utilizzando protocolli crittografati. Questi utilizzano tecniche diverse alcune delle quali richiedono la generazione di chiavi casuali per lo scambio di informazioni.
Su Linux/Unix viene tipicamente utilizzato il device driver /dev/random che raccoglie valori casuali in un Entropy Pool e li restituisce all'occorrenza. Nel caso in cui si esauriscano le lettura su /dev/random si blocca fino a che non vengono raccolti nuovi numeri casuali. Quando si esauriscono la raccolta di nuovi numeri casuali nel pool del device driver e' particolarmente lenta...
Un alternativa e' il device file /dev/urandom che opera nello stesso modo ma con l'opzione unblocking. Quando i numeri casuali raccolti dall'esterno non sono piu' disponibili viene utilizzato un algoritmo per generarli (in questo caso i numeri generati sono pseudo-random basati su un seed di /dev/random).

Poiche' l'avvio dei servizi di WebLogic richiede un numero elevato di numeri casuali per generare le chiavi di crittografia dei vari servizi, utilizzare il device /dev/urandom anziche' /dev/random puo' rendere molto piu' veloce l'avvio (anche se un po' meno sicura la generazione delle chiavi) su sistemi poco disordinati.

A parte le mogli che verrano descritte in un paper a parte... chi soffre per la mancanza di disordine? I sistemi embedded, i LiveCD, i sistemi che hanno avuto un reboot di recente in primo luogo. Ma in seconda istanza anche le VM ed i Container... quindi potenzialmente tutti!

E' probabile quindi che anche il tuo WebLogic sia lento all'avvio: continua a leggere!

Configurazione urandom

La configurazione e' molto semplice e richiede la sola modifica di un parametro nel file java.security. Basta sostituire la riga:

securerandom.source=file:/dev/random
con la riga:
securerandom.source=file:/dev/./urandom

Deve essere utilizzato il "./" per evitare l'applicazione di un alias.

A seconda delle versioni utilizzate il path del file puo' cambiare... Sulla versione 12.2 il path e': HOME/oracle/product/12.2.1/oracle_common/jdk/jre/lib/security/java.security

In alternativa e' possibile utilizzare il parametro -Djava.security.egd=file:///dev/urandom nello script di start di Java.

Di quanto si migliorano i tempi? Dipende... se l'avvio di un managed server e' particolarmente lungo (eg. sopra il minuto) tipicamente il problema e' proprio l'attesa su /dev/random ed i tempi si riducono di un ordine di grandezza: molto, molto meglio!

Di quanto si peggiora le sicurezza? Dipende... nella maggior parte dei casi pochissimo perche' da urandom vengono restituiti sia numeri casuali veri che numeri pseudo-casuali basati su un seed vero. Pero' vanno valutate le diverse situazioni: il traffico potrebbe essere su una rete aziendale interna gia' adeguatamente protetta oppure provenire direttamente da Internet... ovviamente c'e' differenza!

Linux

Il kernel Linux raccoglie su un pool i valori casuali (entropia) ricevuti da alcuni devices e li rende disponibili al device driver /dev/random.
Come si controlla l'entropia? Facile:

# cat /proc/sys/kernel/random/entropy_avail

Di default il valore del poolsize (/proc/sys/kernel/random/poolsize) e' di 4096. Se il valore si abbassa sotto 1000 probabilmente e va controllato, se si abbassa sotto 100 ci sono problemi... [NdA ovviamente va controllato durante l'avvio dei WebLogic se il problema e' il tempo di avvio di WLS].

Installando gli rng-utils [NdE da RH6 il nome del pacchetto e' rng-tools] ed attivando il demone rngd si caricano piu' numeri nel pool raccogliendoli da eventuali altre sorgenti di entropia piu' veloci (eg. TRNG). In questo modo e' possibile utilizzare il device file /dev/random senza ridurre la sicurezza del sistema. Inoltre migliora anche la qualita' di /dev/urandom: questa e' la modalita' piu' consigliabile per un sistema di produzione.

/etc

Altri suggerimenti possono essere applicati su eventuali custom script di avvio:

java -Djava.security.egd=file:/dev/./urandom JavaClass java weblogic.WLST -skipWLSModuleScanning <script>.py

I dettagli sulle versioni di WebLogic sono raccolti in questo documento.

Bibliografia:


Titolo: Ridurre lo startup time di WebLogic Server
Livello: Avanzato (3/5)
Data: 15 Agosto 2017
Versione: 1.0.0 - 15 Agosto 2017
Autore: mail [AT] meo.bogliolo.name