Utilisation de MySql sur NFS

Pourquoi utiliser MySql sur un lien NFS alors que c’est franchement déconseillé ?!? Après tout là n’est pas vraiment la question car la doc de Mysql nous le déconseille fortement, par contre elle oublie de répondre à la vrai question : COMMENT ?

Car si l’on essaie de démarrer un MySql dont les base sont stockées sur un file-system monté on obtient l’erreur suivante : InnoDB: Unable to lock ./ibdata1, error: 13

Pour s’en sortir, il faut ajouter aux paramètre de NFS l’option nolock sous la forme mount … -o nolock … ou en l’ajoutant dans la liste des options de la fstab.

Maintenant pourquoi ?
Par exemple parce que l’on souhaite qu’une partie d’un file système d’une VM contenant les données ne soit pas en capsulé dans 3 couches de filesystem virtuel… en cas de crash… ça peut vous sauver la mise ; quand les perf ne sont pas la contrainte absolue et qu’en plus il ne s’agit que de l’utilisation d’un reseau virtuel au travers d’un bridge… c’est acceptable

Configuration Word

Rien à voir avec les trucs et astuces habituels… mais passer 6 jours a merdouiller à cause d’une config sous Word … ca meritait une petite note !!

Voici le problème, d’un coup, mon clavier ne fonctionne plus comme avant, d’habitude lorsque l’on sélectionne un mot et qu’on en tape un autre ou que l’on appuie sur la touche supprime le texte devrait être remplacé… et bien dans mon cas il ne l’etait pas et je me retrouvais avec l’ancien et le nouveau mot … gtrrrrr…

La solution …
Menu Outil / Option onglet édition puis cocher “la frappe remplace la sélection” …

Tomcat, problème de JVM_LIBDIR

Par defaut la config ne semble pas cohérente du coup j’ai eu des messages de ce style … “cp=/%20JVM_LIBDIR%20/usr/lib64/jvm-exports/java-1.5.0-sun-1.5.0%20does%20not%20exist%20or%20is%20not%20a%20directory” ou encore “error: JVM_LIBDIR /usr/lib64/jvm-exports/java-1.5.0-sun-1.5.0 does not exist or is not a directory”
Pour s’en sortir j’ai créé un lien symbolique dans /usr/lib64/jvm-exports/ de “java-1.5.0-sun-1.5.0 pointant” vers “java”.
Il faut ensuite redemmarer tomcat et ca fonctionne.

Configuration mémoire d’une JVM (suite)

Suite a mon article sur un peu d’optimisation mémoire en Java, J’ai reçu une question interressante ; ma réponse me semble pouvoir être partagée en complément :

Je me demande si il existe une formule permettant de déterminer quelle taille maximum peut on allouer a l option -Xmx en fonction de la ram, de la taille des fichiers d’échange, …. Si tu as des infos …

En première approche, sans contexte, il ne me semble pas possible de répondre à cette question sous la forme d’une formule toutefois, voici les principaux éléments auxquels je pense :
Je ne pense pas qu’il y ait de formule magique … Java va utiliser la mémoire tant qu’il y en a, y compris s’il n’en a plus besoin en ne passant plus le GC, en tout cas jusqu’a atteindre Xmx – Xms … bref, ca va swapper et ce n’est pas forcement conseillé !
Tout dépend de ce que tu souhaites : éviter un crash de la JVM a tout prix ou preserver les performances. Si l’appli demande plus de mémoire qu’il n’y en a sur le système, je n’ai qu’un conseil : acheter de la RAM.

Pour mon usage personnel, je concidèrerai le paramétrage suivant (à noter qu’il ne s’agit que d’une borne max) :

Xmx – Xms < RAM_totale – RAM_utilisée_hors_JVM – marge (RAM_totale*0.1)

Ce qui peut être proche de :
Xmx < Xms + 0.9*RAM_libre

Ce qui ne répond qu’à moitier à la question puisqu’il reste à déterminer Xms.
Là, tout dépend de l’application ; plus Xms est grand plus tu augmentes Xmx dans mon équation et moins tu risques de saturer la mémoire de la JVM (si c’est le pbm) mais plus tu risques de swapper.
Par ailleurs, attention, si Xmx > RAM_totale tu pénalises les applications autres que Java car Java va utiliser toute la mémoire qu’on lui donne. Dans ce cas tu peux avoir des impacts très forts sur les applications telles que la base de donnée par exemple et pénaliser ton application… d’où bien prendre en compte la RAM_utilisée_hors_JVM et une marge pour ces applications.

Le risque en saturant la RAM est que lors d’un pic d’utilisation tu auras à la fois une JVM surchargée et des applications tierses sans mémoire = écroulement du serveur…(c’est peut-être une banalité ce que je dis là mais rien ne dis qu’il n’y aura pas de la perte de mémoire dans la JVM alors que les autres appli seront dejà HS)
Sauf contexte particulier, la RAM ne coute pas chere et les performances disques sont beaucoup trop médiocres … donc achetez de la RAM !

A l’opposé, si je peux aussi proposer un conseil à ceux qui ne cessent d’acheter de la RAM et voient toujours leur serveur saturés… jouez un peu sur les paramétrages, Java, mais d’autres appli comme Oracle commencent par se mettre la RAM sous le coude ou ne la libère que quand il n’y en a plus… bref, plus on en met et plus ca en consomme. De belles économies en perspective et un meilleurs partages des ressources pour les applications plus eco-citoyennes en quelque sorte.

Par aileurs, cette analyse ne tiens pas vraiment compte de la façon dont le système gère son cache. Hors pour ce qui est de linux, la mise en swap se fait par page mémoire (de l’ordre de 4K) On peut donc imaginer qu’une partie de la mémoire de la JVM, les objets non référencés mais pas encore libérés, va rapidement être mise en swap ; si necessaire et sans domage pour les performances. Alors, pourquoi ne pas libérer la mémoire de la JVM plus tot ? (on en revient à la formule initiale !). Autre impact : le risque de swapper des objets toujours référencés mais peu utilisés ce qui augmentera les temps de réponse sur ces objets. Je reste donc sur ma formule précédente.

Pour finir par un lien avec l’article précédent, Xms ne doit pas être trop grand sans quoi le garbage collector ne passera que rarement et la consommation mémoire “de croisière” pourrait être plus forte que nécessaire ; toutefois c’est à moindre mal.

Paramétrage mémoire d’une JVM

Plusieurs paramètres permettent de configurer la JVM et entre autre sa gestion de la mémoire. Tout d’abord les paramètres -Xms et -Xmx qui indiquent respectivement la taille mémoire initiale et la taille mémoire maximum. Ces limites sont fixées en ajoutant après le parametre la quantité de mémoire et son unité, ce qui donne par exemple -Xms256M -Xmx512M pour une initialisation à 256Mo pouvant être étendue à 512Mo. En général il est recommendé d’utiliser les même valeurs pour l’un et l’autre des paramètres, ceci dit je ne suis pas totalement d’accord avec cette configuration qui revient à bloquer de la mémoire pour rien.

Ce premier paramétrage est le plus simple il est toutefois primordial car la JVM carsh assez violement lorsqu’il n’y a plus de mémoire.
Vient ensuite la gestion du garbage collector, définie par le paramètre -Xmn. Il existe deux type de garbage : le premier est une libération rapide de la mémoire la seconde une libération plus fouillée ; cette dernière ralenti par contre les performance du système.
Pour comprendre l’utilisation de ce paramètre, il faut comprendre la gestion de la mémoire Java. En deux mots, Java alloue les objet dans un espace appelé Eden, lorsque cet espace est plein (quand il passe le seuil fixé par -Xmn) le GC vide au mieux cet espace. Les éléments qui ne peuvent être libérés car toujours utilisés sont migrés vers un autre espace (old space). Une libération plus complète sera effectué lorsque l’on va attendre la limite de Xmx (max) – Xmn. Le paramètre est important car il joue directement sur les perf de la machine : S’il est trop petit, des objets de l’eden même récents vont être transférés vers l’espace mémoire des ancien : la mémoire va être consommé plus vite et il y aura plus régulièrement de gros ralentissements liés au passage du garbage collector.

LANG (charset) par défaut d’une JVM

Par defaut, la variable $LANG permet de choisir l’encoding par defaut de la JVM. Cette variable est dans /etc/sysconfig/i18n

Pour forcer un notre encodage, il est possible de passer l’option -Dfile.encoding=ISO-8859-1″ comme paramètre de la JVM ; ceci permettra de considére ce charset pour les fichiers lus par la JVM. Pour que tomcat serve des pages dans cet encoding il faudra ajouter :-Djavax.servlet.request.encoding=ISO-8859-1
Dans les dernieres version d’openSuse le fichier i18n n’existe plus, il faut alors ajouter ce parametres aux parametres de le JVM dans le fichier j2ee puis relancer tomcat. Il est aussi possible de passer par /etc/sysconfig/langage pour changer la variable $LANG

Cette solution permet de fixer le charset par defaut dans le mode souhaité qui doit etre le même que celui d’apache quand on utilise l’ajp13 ; à UTF-8 ou WEBISO-8859-1 … ou autre

Etat de la JVM d’un serveur d’application

Pour connaitre l’etat de la JVM d’un serveur d’application, du moins la mémoire qui lui reste et celle qu’il utilise, il faut accéder aux fonction de la classe Runtime ce la-dite JVM.

La jsp suivante affiche les principales informations :
<HTML>
<HEAD></HEAD>
<BODY>

<%java.lang.Runtime.getRuntime().gc();%>
— JVM MEMORY AVANT GARBAGE —<BR>
Total Memory : <%=java.lang.Runtime.getRuntime().totalMemory()/(1024*1024)%>Mo<BR>
Free Memory : <%=java.lang.Runtime.getRuntime().freeMemory()/(1024*1024)%>Mo<BR>
Max Memory : <%=java.lang.Runtime.getRuntime().maxMemory()/(1024*1024)%>Mo<BR>
<BR>

<%java.lang.Runtime.getRuntime().gc();%>

— JVM MEMORY APRES GARBAGE —<BR>
Total Memory : <%=java.lang.Runtime.getRuntime().totalMemory()/(1024*1024)%>Mo<BR>
Free Memory : <%=java.lang.Runtime.getRuntime().freeMemory()/(1024*1024)%>Mo<BR>
Max Memory : <%=java.lang.Runtime.getRuntime().maxMemory()/(1024*1024)%>Mo<BR>
<BR>
Proc Dispo : <%=java.lang.Runtime.getRuntime().availableProcessors()%><BR>
</BODY>
</HTML>