Comment résoudre les problèmes liés à l'exécution d'un grand nombre de services avec le Wrapper sous Windows

Compatibilité :1.0.0
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

Lors de l'installation et du démarrage de services s'exécutant avec le Wrapper, vous pourriez atteindre un point où il semble qu'il ne soit plus possible de démarrer aucun autre service.

Les indications habituelles de ce problème sont :

  • Le démarrage de l'application produit presque instantanément un Timeout : « Error 1053: The service did not respond to the start or control request in a timely fashion ».

  • Le service démarre, mais la JVM se termine instantanément avec le code de sortie 6 (en raison de l'échec du chargement des DLL internes).

  • Le service démarre, mais ne parvient pas à allouer une console.

Chaque service alloue une certaine quantité de mémoire dans l'espace de tas de bureau interne utilisé pour stocker des éléments tels que les éléments d'API, etc. Une description détaillée du tas de bureau interne est disponible sur le site externe. Si le service est lancé en tant que service non interactif, sur Windows XP 32 bits, l'espace de tas par défaut est de 512 Ko. Le Wrapper lui-même alloue environ 10-15 Ko pour chaque instance démarrée. Chaque JVM allouera également environ 20 Ko. Toutefois, cette valeur peut varier selon les éléments d'API que la JVM charge. Si l'espace de tas est épuisé lors de la tentative de démarrage du service, les erreurs ci-dessus peuvent en être la conséquence.

Le tas de bureau peut être diagnostiqué à l'aide de l'outil Desktop Heap Monitor fourni par Microsoft. Une fois installé et configuré, la sortie devrait ressembler à ceci :

dheapmon.exe
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: (  5824 KB -    7 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    3072              8.2
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128              9.8
  Service-0x0-3e7$\Default            512             28.8
  Service-0x0-3e4$\Default            512              2.1
  Service-0x0-3e5$\Default            512              3.1
  SAWinSta\SADesktop                 1024              0.3
-------------------------------------------------------------

Les services non interactifs, qui s'exécutent en tant qu'utilisateur Système, appartiennent dans ce cas à Service-0x0-3e7$\Default. Le démarrage de services non interactifs supplémentaires (exécutés en tant qu'utilisateur Système) augmentera l'utilisation du tas en conséquence. L'exécution du service en tant que service interactif fera augmenter l'utilisation de l'espace de tas WinSta0\Default. L'exécution du service sous un compte utilisateur donné créera une nouvelle session WinStation\Desktop pour le processus. Tout service exécuté sous cet utilisateur recevra en fait sa propre session.

Deux solutions de contournement sont actuellement disponibles :

  • Exécution sous un compte utilisateur de service donné. Chaque service exécuté recevra sa propre session jusqu'à 48 Mo, quantité disponible globalement sur les machines 32 bits

  • Augmenter l'espace de tas de bureau non interactif sur la machine locale en suivant les instructions du site Microsoft

Un Windows 64 bits dispose d'un espace de tas de bureau nettement plus important et il faut donc beaucoup plus de services s'exécutant simultanément pour éventuellement atteindre la limite.