Author: echatellier Date: 2012-08-30 16:07:12 +0200 (Thu, 30 Aug 2012) New Revision: 3748 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3748 Log: fixes #1442: Add option to control subprocess allocated memory fixes #1443: Add option to control caparmor process allocated memory fixes #1445: Add option to control subprocess max simultaneous process count Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SubProcessSimulationLauncher.java trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx trunk/src/main/resources/i18n/isis-fish_en_GB.properties trunk/src/main/resources/i18n/isis-fish_fr_FR.properties trunk/src/main/resources/templates/ssh/qsub-script.ftl trunk/src/test/java/fr/ifremer/isisfish/simulator/launcher/SshSimulatorLauncherTest.java Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -386,6 +386,36 @@ } /** + * Retourne le nombre maximum de thread à utiliser en in process. + * + * @return number of thread to use + */ + public int getSimulatorInMaxThreads() { + int result = getOptionAsInt(Option.SIMULATOR_IN_MAXTHREADS.key); + return result; + } + + /** + * Retourne le nombre de sous processus maximum a creer. + * + * @return number of sub process to create + */ + public int getSimulatorSubMaxProcess() { + int result = getOptionAsInt(Option.SIMULATOR_SUB_MAXPROCESS.key); + return result; + } + + /** + * Retourne la quantité de ram (Xmx) a alloue au sous processus. + * + * @return memory amount to use for sub process + */ + public String getSimulatorSubMaxMemory() { + String result = getOption(Option.SIMULATOR_SUB_MAXMEMORY.key); + return result; + } + + /** * Retourne l'url du serveur de simulation accessible via SSH. * * @return simulator server @@ -601,6 +631,25 @@ } /** + * Retourne la quantité de ram (Xmx) a alloue au processus sur caparmor. + * + * @return number of thread to use + */ + public String getSimulatorSshMaxMemory() { + String result = getOption(Option.SIMULATOR_SSH_MAXMEMORY.key); + return result; + } + + /** + * Set ssh simulation process memory to use + * + * @param memory memory + */ + public void setSimulatorSshMaxMemory(String memory) { + setOption(Option.SIMULATOR_SSH_MAXMEMORY.key, memory); + } + + /** * Retourne la clé privée de l'utilisteur courant. * * @return private ssh key path @@ -911,6 +960,14 @@ SIMULATOR_LAUNCHER2(SimulationService.SIMULATION_LAUNCHER + ".1", n_("isisfish.config.main.subSimulator.description"), SubProcessSimulationLauncher.class.getName()), SIMULATOR_LAUNCHER_REMOTE(SimulationService.SIMULATION_LAUNCHER + ".2", n_("isisfish.config.main.remoteCaparmor.description"), SSHSimulatorLauncher.class.getName()), + /** Nombre maximum de thread de simulation in process. */ + SIMULATOR_IN_MAXTHREADS("simulation.in.max.threads", n_("isisfish.config.main.simulation.in.max.threads.description"), "1"), + + /** Nombre max de sous processus à lancer (-1 = pas de limite). */ + SIMULATOR_SUB_MAXPROCESS("simulation.sub.max.process", n_("isisfish.config.main.simulation.sub.max.process.description"), "-1"), + /** Mémoire max (Xmx) allouée aux sous processus. */ + SIMULATOR_SUB_MAXMEMORY("simulation.sub.max.memory", n_("isisfish.config.main.simulation.sub.max.memory.description"), "1024M"), + /** Serveur accessible par ssh : address */ SIMULATOR_SSH_SERVER("simulation.ssh.server", n_("isisfish.config.main.simulation.ssh.server.description"), "caparmor-sftp"), /** Serveur accessible par ssh : login */ @@ -933,6 +990,8 @@ SIMULATOR_SSH_CONTROLCHECKINTERVAL("simulation.ssh.control.check.interval", n_("isisfish.config.main.simulation.ssh.control.check.interval.description"), "120"), /** Serveur accessible par SSH : nombre de thread au maximum a utilise simultanement */ SIMULATOR_SSH_MAXTHREADS("simulation.ssh.max.threads", n_("isisfish.config.main.simulation.ssh.max.threads.description"), "1"), + /** Serveur accessible par SSH : mémoire (Xmx) allouée pour les process java sur caparmor */ + SIMULATOR_SSH_MAXMEMORY("simulation.ssh.max.memory", n_("isisfish.config.main.simulation.ssh.max.memory.description"), "2000M"), /** Application locale (for i18n init). */ LOCALE("locale", n_("isisfish.config.main.locale.description"), "fr_FR"), Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -171,7 +171,7 @@ * @see fr.ifremer.isisfish.simulator.launcher.SimulatorLauncher#maxSimulationThread() */ public int maxSimulationThread() { - return 1; + return IsisFish.config.getSimulatorInMaxThreads(); } /* @@ -181,7 +181,6 @@ public int getCheckProgressionInterval() { // par defaut, pour les in process 5 secondes - int interval = 1; return interval; } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -176,7 +176,7 @@ @Override public int maxSimulationThread() { - // met le serveur les lance quand il veut + // mais le serveur les lance quand il veut int maxSimulationThread = IsisFish.config.getSimulatorSshMaxThreads(); if (maxSimulationThread <= 0) { @@ -1104,6 +1104,7 @@ root.put("isishome", IsisFish.config.getSimulatorSshIsisHome()); root.put("isistemp", getRemoteTempDirectory()); root.put("javapath", IsisFish.config.getSimulatorSshJavaPath()); + root.put("javamemory", IsisFish.config.getSimulatorSshMaxMemory()); root.put("simulationid", simuationId); root.put("simulationzip", simulationZip); root.put("simulationstandalonezip", standaloneZip); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SubProcessSimulationLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SubProcessSimulationLauncher.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SubProcessSimulationLauncher.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -43,6 +43,8 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.FileUtil; +import com.sun.tools.internal.jxc.gen.config.Config; + import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.simulator.SimulationControl; @@ -110,8 +112,15 @@ @Override public int maxSimulationThread() { - // TODO rendre configurable le nombre de processeurs a utiliser - int result = Runtime.getRuntime().availableProcessors(); + + int result = IsisFish.config.getSimulatorSubMaxProcess(); + + // s'il n'y a pas de configuration utilisateur particulière + // on utilise le nombre de processeur physique + if (result <= 0) { + result = Runtime.getRuntime().availableProcessors(); + } + return result; } @@ -189,7 +198,7 @@ // common args List<String> command = new ArrayList<String>(); command.add(java); - command.add("-Xmx2048M"); + command.add("-Xmx" + IsisFish.config.getSimulatorSubMaxMemory()); // jri args String libraryPath = System.getProperty("java.library.path"); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/WelcomeHandler.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -222,6 +222,12 @@ modelBuilder.addOption(IsisConfig.Option.SIMULATION_SHOW_ONLY_ERROR); modelBuilder.addOption(IsisConfig.Option.SIMULATION_SCRIPT_AUTOCONFIG); + // category simulation + modelBuilder.addCategory(_("isisfish.config.category.simulation"), _("isisfish.config.category.simulation.description")); + modelBuilder.addOption(IsisConfig.Option.SIMULATOR_IN_MAXTHREADS); + modelBuilder.addOption(IsisConfig.Option.SIMULATOR_SUB_MAXPROCESS); + modelBuilder.addOption(IsisConfig.Option.SIMULATOR_SUB_MAXMEMORY); + // category database vcs modelBuilder.addCategory(_("isisfish.config.category.officialvcs"), _("isisfish.config.category.officialvcs.description")); modelBuilder.addOption(IsisConfig.Option.VCS_TYPE); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2009 - 2012 Ifremer, Code Lutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -79,6 +79,7 @@ protected String currentSSHPbsBinPath; protected String currentSSHPbsQsubOptions; protected String currentSSHMaxThreads; + protected String currentSSHMaxMemory; protected String currentSSHControlInterval; /** @@ -109,6 +110,7 @@ configUI.getSshPbsQsubOptionsField().setText(IsisFish.config.getSimulatorSshPbsQsubOptions()); configUI.getSshControlIntervalField().setText(String.valueOf(IsisFish.config.getSimulatorSshControlCheckInterval())); configUI.getSshMaxThreadsField().setText(String.valueOf(IsisFish.config.getSimulatorSshMaxThreads())); + configUI.getSshMaxMemoryField().setText(IsisFish.config.getSimulatorSshMaxMemory()); doCheck(); } @@ -207,6 +209,9 @@ } else { setColor(false, configUI.getSshMaxThreadsField()); } + + // currentSSHMaxMemory + currentSSHMaxMemory = configUI.getSshMaxMemoryField().getText().trim(); // currentSSHControlInterval currentSSHControlInterval = configUI.getSshControlIntervalField() @@ -236,6 +241,7 @@ IsisFish.config.setSimulatorSshPbsQsubOptions(currentSSHPbsQsubOptions); IsisFish.config.setSimulatorSshControlCheckInterval(Integer.parseInt(currentSSHControlInterval)); IsisFish.config.setSimulatorSshMaxThreads(Integer.parseInt(currentSSHMaxThreads)); + IsisFish.config.setSimulatorSshMaxMemory(currentSSHMaxMemory); IsisFish.config.saveForUser(); configUI.dispose(); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigUI.jaxx 2012-08-30 14:07:12 UTC (rev 3748) @@ -5,7 +5,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + Copyright (C) 2009 - 2012 Ifremer, CodeLutin, Chatellier Eric %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -157,6 +157,17 @@ </row> <row fill='horizontal'> <cell> + <JLabel id='sshMaxMemoryLabel' text='isisfish.config.main.simulation.ssh.max.memory' + toolTipText='isisfish.config.main.simulation.ssh.max.memory.description' /> + </cell> + <cell> + <JTextField id='sshMaxMemoryField' + toolTipText='isisfish.config.main.simulation.ssh.max.memory.description' + onKeyReleased="getAction().doCheck()" /> + </cell> + </row> + <row fill='horizontal'> + <cell> <JLabel id='sshControlIntervalLabel' text='isisfish.config.main.simulation.ssh.control.check.interval' toolTipText='isisfish.config.main.simulation.ssh.control.check.interval.description' /> </cell> Modified: trunk/src/main/resources/i18n/isis-fish_en_GB.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2012-08-30 14:07:12 UTC (rev 3748) @@ -145,6 +145,8 @@ isisfish.config.category.misc.description=Miscealenous isisfish.config.category.officialvcs=Official VCS isisfish.config.category.officialvcs.description=Official VCS repository +isisfish.config.category.simulation=Simulations +isisfish.config.category.simulation.description=Simulation execution configuration isisfish.config.database.lockmode.description=Database lock mode isisfish.config.main.compileDirectory.description=Script compilation directory isisfish.config.main.configFileName.description=Configuration filename @@ -166,6 +168,7 @@ isisfish.config.main.performvcsupdate.description=Perform vcs update isisfish.config.main.remoteCaparmor.description=Remote simulator launcher name isisfish.config.main.script.autoconfig.description=Display a dialog to force script configuration +isisfish.config.main.simulation.in.max.threads.description=Max threads count in current process isisfish.config.main.simulation.ssh.control.check.interval=Control check interval (seconds) isisfish.config.main.simulation.ssh.control.check.interval.description=Control check interval (seconds) isisfish.config.main.simulation.ssh.datapath=ISIS-Fish database @@ -174,6 +177,8 @@ isisfish.config.main.simulation.ssh.isis.home.description=ISIS-Fish installation directory isisfish.config.main.simulation.ssh.javapath=Java path isisfish.config.main.simulation.ssh.javapath.description=Java location on remote server (full path or relative to $PATH, by default value is caparmor configuration) +isisfish.config.main.simulation.ssh.max.memory=Ssh simulation Xmx allocated memory +isisfish.config.main.simulation.ssh.max.memory.description=Ssh simulation Xmx allocated memory isisfish.config.main.simulation.ssh.max.threads=SSH threads count isisfish.config.main.simulation.ssh.max.threads.description=Number of simultaneous simulations to do through SSH. Might only be usefull for dependent analysis plans. Otherwise keep value at '1'. isisfish.config.main.simulation.ssh.pbsbinpath=PBS executables directory @@ -188,6 +193,8 @@ isisfish.config.main.simulation.ssh.userhome.description=User home directory isisfish.config.main.simulation.ssh.username=SSH identifier isisfish.config.main.simulation.ssh.username.description=SSH identifier +isisfish.config.main.simulation.sub.max.memory.description=Sub process simulation Xmx allocated memory +isisfish.config.main.simulation.sub.max.process.description=Max sub process count (using -1 value will use available processor count) isisfish.config.main.simulationShowOnlyError.description= isisfish.config.main.smtpServer.description=Smtp server address isisfish.config.main.subSimulator.description=Sub process simulator launcher name Modified: trunk/src/main/resources/i18n/isis-fish_fr_FR.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2012-08-30 14:07:12 UTC (rev 3748) @@ -145,6 +145,8 @@ isisfish.config.category.misc.description=Divers isisfish.config.category.officialvcs=VCS Officiel isisfish.config.category.officialvcs.description=Dépôt contenant les scripts officiels +isisfish.config.category.simulation=Simulations +isisfish.config.category.simulation.description=Configuration des simulations isisfish.config.database.lockmode.description=Méthode de vérouillage à utiliser pour la base de données isisfish.config.main.compileDirectory.description=le répertoire où sont compilés les scripts isisfish.config.main.configFileName.description=le fichier de configuration à utiliser @@ -166,6 +168,7 @@ isisfish.config.main.performvcsupdate.description=Met à jour le dépôt VCS isisfish.config.main.remoteCaparmor.description=Nom du lanceur de simulation distante isisfish.config.main.script.autoconfig.description=Affiche une fenêtre pour forcer la configuration des scripts +isisfish.config.main.simulation.in.max.threads.description=Nombre de thread maximum dans le processus courant isisfish.config.main.simulation.ssh.control.check.interval=Vérification de la progression (secondes) isisfish.config.main.simulation.ssh.control.check.interval.description=Temps d'attente en secondes entre deux vérifications de progression isisfish.config.main.simulation.ssh.datapath=Base de données @@ -174,6 +177,8 @@ isisfish.config.main.simulation.ssh.isis.home.description=Emplacement d'installation d'ISIS-Fish sur le serveur isisfish.config.main.simulation.ssh.javapath=Emplacement de java isisfish.config.main.simulation.ssh.javapath.description=Emplacement de java sur le serveur (chemin total, ou relatif au $PATH, par défaut la valeur est celle de caparmor) +isisfish.config.main.simulation.ssh.max.memory=Quantité de mémoire allouée +isisfish.config.main.simulation.ssh.max.memory.description=Quantité de mémoire maximum allouée (Xmx) isisfish.config.main.simulation.ssh.max.threads=Nombre de thread SSH isisfish.config.main.simulation.ssh.max.threads.description=Nombre de simulation simultanée à faire en SSH. Attention, ne doit être utilisé que pour faire plusieurs plans de simulation dépendants en même temps, sinon laisser '1'. isisfish.config.main.simulation.ssh.pbsbinpath=Emplacement des executables PBS @@ -188,6 +193,8 @@ isisfish.config.main.simulation.ssh.userhome.description=Répertoire d'accueil de l'utilisateur isisfish.config.main.simulation.ssh.username=Identifiant isisfish.config.main.simulation.ssh.username.description=Identifiant SSH pour se connecter au serveur +isisfish.config.main.simulation.sub.max.memory.description=Quantité de mémoire maximum allouée au sous processus +isisfish.config.main.simulation.sub.max.process.description=Nombre maximum de sous processus (une valeur de -1 utilisera le nombre de processeur disponible) isisfish.config.main.simulationShowOnlyError.description=pour indiquer si l'on doit conserver dans l'UI des simulations terminées uniquement celles avec erreur isisfish.config.main.smtpServer.description=le nom du serveur smtp à utiliser pour envoyer les courriels isisfish.config.main.subSimulator.description=Nom du simulateur en sous processus Modified: trunk/src/main/resources/templates/ssh/qsub-script.ftl =================================================================== --- trunk/src/main/resources/templates/ssh/qsub-script.ftl 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/main/resources/templates/ssh/qsub-script.ftl 2012-08-30 14:07:12 UTC (rev 3748) @@ -29,7 +29,7 @@ setenv R_HOME /appli/R/2.15.0-gnu-4.3/lib64/R setenv LD_LIBRARY_PATH ${r"${R_HOME}"}/lib -<#assign commonCommand="${javapath} -Djava.library.path=jri64 -DR.type=jni -Xmx2000M -jar isis-fish*.jar" /> +<#assign commonCommand="${javapath} -Djava.library.path=jri64 -DR.type=jni -Xmx${javamemory} -jar isis-fish*.jar" /> <#assign commonOptions="--option launch.ui false --option perform.vcsupdate false --option perform.migration false --option perform.cron false" /> <#if qsubmutiplejob> <#-- localsimulationid is short simulation id version --> Modified: trunk/src/test/java/fr/ifremer/isisfish/simulator/launcher/SshSimulatorLauncherTest.java =================================================================== --- trunk/src/test/java/fr/ifremer/isisfish/simulator/launcher/SshSimulatorLauncherTest.java 2012-08-30 13:50:52 UTC (rev 3747) +++ trunk/src/test/java/fr/ifremer/isisfish/simulator/launcher/SshSimulatorLauncherTest.java 2012-08-30 14:07:12 UTC (rev 3748) @@ -329,4 +329,20 @@ Assert.assertTrue(content.contains("${R_HOME}/lib")); } + + /** + * Test que memoire définie dans la configuration est bien présente. + * + * @throws IOException + * @throws TemplateException + */ + @Test + public void testFreemarkerTemplateMemory() throws IOException, TemplateException { + SSHSimulatorLauncher launcher = new SSHSimulatorLauncher(); + String content = launcher.getSimulationScriptLaunchContent( + SSHSimulatorLauncher.QSUB_SCRIPT_TEMPLATE, "", + "", true, "", "", true); + + Assert.assertTrue(content.contains("Xmx2000M")); + } } \ No newline at end of file