Inviato da Marco Brenna il Ven, 06/01/2023 - 23:01
Open Liberty Crash

Ridendo e scherzando è da un anno che lavoro a tempo pieno e infatti è da un anno che non scrivo più nulla sul blog... Un vero peccato, mi son ritagliato un po' di tempo libero durante le vacanze di Natale e infatti mi sono rimesso a scrivere... Speriamo che questa scintilla duri!

Tempo fa mi sono imbattuto in alcuni test che prevedevano la modifica di alcuni parametri in Open Liberty su diversi server contemporaneamente (per chi non lo conoscesse è uno tra i tanti Java application server tipo WebSphere, Tomcat, JBoss ora WildFly, Geronimo... chi meglio, chi con più eleganza, chi peggio fan tutti la stessa cosa e cioè far girare applicazioni Java), nello specifico ho preso un parametro a caso per motivi di test (Xms) toccando nel jvm.options il suo valore aggiungendo semplicemente 1MB per provare... e tanto per cambiare, si è spaccato tutto!

Se siete da molto tempo in ambito informatica/programmazione avrete già abbandonato quell'idea idilliaca che probabilmente avrà vostro padre in cui nei computer funziona sempre tutto... la realtà è che non funziona mai niente, si spaccano sempre le cose e bisogna imprecare tantissimo per metterle a posto per un motivo o per l'altro... solo per far credere alla metà inconsapevole del mondo che "le cose informatiche funzionino alla grande".

Ma torniamo a Open Liberty, ovviamente non avevo subito capito che era stata proprio quella modifica al parametro a far esplodere Open Liberty quindi dovevo andare a caccia del problema. Guardo nei log e non c'è nulla... assolutamente niente... il primo pensiero è stato ipotizzare qualche errore sull'applicativo ma, dopo 30 secondi, mi sono subito concentrato su quello stupido MegaByte... ma possibile che una modifica così insulsa fosse riuscita a spaccare tutto Open Liberty tanto da non farlo avviare più? Eppure gli ho concesso un solo MegaByte in più non in meno...

La soluzione dell'arcano è che in Open Liberty era stata usata questa configurazione:

-Xmx4096m
-Xms4096m

Il fatto di aver aumentato, anche solo pochissimo il valore di Xms, ha reso Xms > Xmx cosa che, per l'application server è un paradosso!
Aggiungendo un MegaByte a Xms e portandolo così a 4097M abbiamo detto infatti: riserva subito e obbligatoriamente 4097 MB di ram per l'application server (parametro Xms) ma usane al massimo 4096 (parametro Xmx) il che è impossibile! E questo non deve essere piaciuto durante l'esecuzione di Open Liberty facendolo spaccare di brutto.

Come ho fatto ad accorgermene? Ho pensato, se Open Liberty non arriva nemmeno a stampare una riga di log dicendo che si sta avviando, l'applicativo installato non c'entra niente, c'entra l'application server stesso... e deve essere qualcosa che lo spacca davvero presto... tanto presto da non scrivere nemmeno un log!

Cosa ho toccato rispetto alla situazione funzionante precedente? Xms.

C'è qualcosa di illogico e che non torna? Tutto!

Una volta riportato il parametro al valore precedente ho verificato che tornasse tutto a funzionare ed ho continuato i miei test togliendo 1 MB a Xms invece di aggiungerlo!

Ripassiamo un attimo il significato dei vari parametri legati alla RAM nelle applicazioni Java:

  • Xmx: Dimensione massima dello heap utilizzabile dal processo Java. Non superare con questo valore la RAM totale della macchina anzi, stare parecchio più bassi tenendo conto che la RAM serve anche agli altri programmi installati e al sistema operativo... se esagerate potreste generare instabilità sul server nel caso in cui il processo dovesse richiedere tanta RAM (se ne chiede più di questo valore potrebbe spaccarsi il processo ma almeno non vi si inchioda l'intero server...). Se decidessimo di non specificare questo valore, esso viene calcolato automaticamente a seconda della quantità di RAM disponibile sulla macchina... normalmente un 25% della RAM totale ma questo valore varia a seconda delle versioni di Java, se ci sono meno di 2GB di RAM totale potrebbe riservarne il 50%... insomma cerca di calcolarselo lui ad un valore sensato.
  • Xms: dimensione iniziale minima di memoria riservata allo heap nel processo Java. Se non lo specifichiamo, normalmente va dagli 8 MByte ai 64 MByte (parte basso per crescere poi all'occorrenza fino al valore di Xmx)

E' bene ricordarsi inoltre che, se non si specifica nessuna unità di misura, si intende "bytes" (un altro errore comune). Se settate infatti: -Xmx1024 state settando il valore massimo che potrà avere lo heap a 1024 bytes, che sono pochissimi (e molto probabilmente la vostra applicazione farà molta fatica a girare!); bisogna specificare il valore con l'unità di misura, ad esempio -Xmx1024m per 1024 Megabytes quindi 1 Giga, oppure direttamente -Xmx1g.

Beh, questo vale quindi per tutte le applicazioni Java, non solo Open Liberty... Se dovessero spaccarsi subito all'inizio, magari con un seg fault o senza dare alcun segno di vita, controllate i parametri xms e xmx che avete passato dalla command line oppure avete in configurazione, magari la soluzione al vostro problema potrebbe essere li... e magari è un solo MegaByte di troppo!

Alla prossima (speriamo presto)

Aggiungi un commento

Solo ad uso interno per potervi rispondere, non verrà mostrato pubblicamente