suomeksi   |   in english

Kategoriat

>yleistä
Jokapäiväisiä asioita
>koodi
Koodipätkiä ja -esimerkkejä
>hupi
Kevyempää ja kepeämpää
>arkkitehtuuri
Järjestelmäarkkitehtuuri ja suunnittelu

Odottavan aika on pitkä

2009-06-08 21:17:01
juha kirjoitti kategoriassa arkkitehtuuri

Oletko koskaan yrittänyt saada Oracle Service Bus 10gR3, Oracle WebLogic Server 9.2.2 tai 10gR3 käynnistymään nopeasti Linux:lla (Oracle Enterprise Linux, Red Hat Linux minkään muulla distrolla)? Kestää hieman, eikö? No siihen on luonnollisestikin syy ja se on tämä "tämä-ei-ole-bugi" bugi normaalissa JVM toteutuksessa.

Käytännössä satunnaisluvun hankkiminen järjestelmältä tapahtuu käyttäen /dev/random tai /dev/urandom laiteita. Windowsilla nämä "laitteet" ohjautuvat käytännössä CryptoAPI:lle ja se toimii ihan hyvin. Linuxilla taasen /dev/random tuottaa siemenen satunnaisille luvuilleen käyttämällä "entropy pool" toimintoa joka on Oikein Ja Hienosti Tehty[tm]. Mutta jos satut toimimaan palvelimella, erityisesti palvelimella joka ei ole vielä käynnistänyt "palveluitaan" vielä - kuten nyt vaikkapa sovelluspalvelin - et tuota riittävästi "entropiaa" täyttääksesi altaitasi melkoiseen aikaan. Tämä taas johtuu siitä että entropia luodaan I/O operaatioilla, kuten levy- ja verkkoliikenteellä (jota siis et vielä tuota). Näin ollen "erittäin satunnainen satunnaisuus" jota /dev/random luo enemmänkin hankaloittaa kuin auttaa, koska kaiken käynnistys on ikävää ja hidasta.

Eli tämä on kohta jossa ystävämme /dev/urandom astuu kuvioon omalla ei-estävällä toiminnallaan ja "vähemmän satunnaisella satunnaisuudellaan" (mutta silti ihan kohtuullisella satunnaisuudella suurimpaan osaan käyttötarkoituksia). Paitsi että se "tämä-ei-ole-bugi" ohittaa /dev/urandomin. Luonnollisesti tähän on useita kiertomenetelmiä löydettävissä, mutta henkilökohtaisesti preferoin securerandom.source arvon muuttamista $JAVA_HOME/jre/lib/security/java.security-tiedostosta tällaiseksi: "securerandom.source=file:/dev/./urandom". Nyt kaikki käynnistyy höyhenenkevyesti, juuri niinkuin kuuluukin.